int NlsEncoder::createNlsEncoder()

in nlsCppSdk/encoder/nlsEncoder.cpp [81:150]


int NlsEncoder::createNlsEncoder(ENCODER_TYPE type, int channels,
                                 const int sampleRate, int *errorCode) {
  int ret = Success;
  int tmpCode = 0;
  int channel_num = channels;

  if (channel_num < 0) {
    channel_num = DEFAULT_CHANNELS;
  }
  if (nlsEncoder_ != NULL) {
    LOG_WARN("nlsEncoder_ is existent, pls destroy first");
    return -(EncoderExistent);
  }

  if (type == ENCODER_OPU) {
    nlsEncoder_ = opus_encoder_create(sampleRate, channel_num,
                                      OPUS_APPLICATION_VOIP, &tmpCode);
    if (nlsEncoder_) {
      opus_encoder_ctl(
          (OpusEncoder *)nlsEncoder_,
          OPUS_SET_VBR(
              1)); /* 动态码率:OPUS_SET_VBR(1), 固定码率 : OPUS_SET_VBR(0) */
      opus_encoder_ctl(
          (OpusEncoder *)nlsEncoder_,
          OPUS_SET_BITRATE(
              27800)); /* 指定opus编码码率, 比特率从 6kb / s 到 510 kb / s,
                          想要压缩比大一些就设置码率小一点 */
      opus_encoder_ctl((OpusEncoder *)nlsEncoder_,
                       OPUS_SET_COMPLEXITY(8)); /* 计算复杂度 */
      opus_encoder_ctl(
          (OpusEncoder *)nlsEncoder_,
          OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE)); /* 设置针对语音优化 */

      encoder_type_ = type;
      ret = Success;

      LOG_DEBUG("opus_encoder_create for OPU mode success");
    } else {
      LOG_ERROR("encoder create failed");
      nlsEncoder_ = NULL;
      ret = -(OpusEncoderCreateFailed);
    }

    *errorCode = tmpCode;
  } else if (type == ENCODER_OPUS) {
#ifdef ENABLE_OGGOPUS
    nlsEncoder_ = new OggOpusDataEncoder();
    if (nlsEncoder_ == NULL) {
      LOG_ERROR("nlsEncoder_ new OggOpusDataEncoder failed");
      return -(OggOpusEncoderCreateFailed);
    }
    ret = (static_cast<OggOpusDataEncoder *>(nlsEncoder_))
              ->OggopusEncoderCreate(oggopusEncodedData, this, sampleRate);
    if (ret == Success) {
      /* 这里暂时未开放编码码率和计算复杂度的设置 */
      (static_cast<OggOpusDataEncoder *>(nlsEncoder_))->SetBitrate(27800);
      (static_cast<OggOpusDataEncoder *>(nlsEncoder_))
          ->SetSampleRate(sampleRate);
      (static_cast<OggOpusDataEncoder *>(nlsEncoder_))->SetComplexity(8);

      LOG_DEBUG("OggopusEncoderCreate for OPUS mode success");
    } else {
      LOG_ERROR("OggopusEncoderCreate failed, errorcode:%d", ret);
    }
#endif
    encoder_type_ = type;
  }

  return ret;
}