【问题标题】:Forcing L/R stereo强制 L/R 立体声
【发布时间】:2014-05-16 23:33:51
【问题描述】:

我正在尝试使用 L/R 立体声制作低比特率的作品文件。是什么决定了opusenc 是否会使用 L/R 立体声而不是联合立体声?有可以通过的标志吗?和比特率有关吗?

opusenc input.wav output.opus //produces L/R stereo
opusenc input.wav output.opus --bitrate 8 //produces joint stereo

【问题讨论】:

  • 我通过对具有非常高的立体声分离度的文件进行编码并收听结果来对此进行测试。通道与默认编码明显分开。

标签: webrtc opus


【解决方案1】:

看来已经确定了here

    if (st->force_channels!=OPUS_AUTO && st->channels == 2)
    {
        st->stream_channels = st->force_channels;
    } else {
#ifdef FUZZING
       /* Random mono/stereo decision */
       if (st->channels == 2 && (rand()&0x1F)==0)
          st->stream_channels = 3-st->stream_channels;
#else
       /* Rate-dependent mono-stereo decision */
       if (st->channels == 2)
       {
          opus_int32 stereo_threshold;
          stereo_threshold = stereo_music_threshold + ((voice_est*voice_est*(stereo_voice_threshold-stereo_music_threshold))>>14);
          if (st->stream_channels == 2)
             stereo_threshold -= 4000;
          else
             stereo_threshold += 4000;
          st->stream_channels = (equiv_rate > stereo_threshold) ? 2 : 1;
       } else {
          st->stream_channels = st->channels;
       }
#endif
    }

简单地阅读 opusenc 源代码,看起来在struct OpusEncoder 上将force_channels 设置为 2 将使其工作。但是,查看 opusenc.c 源代码,该字段没有设置在哪里。但是,您可以轻松地修改源以始终强制通道为两个。对于未来,看起来 opus 将其称为“双立体声”而不是“L/R 立体声”。

【讨论】:

  • 当编码器决定在内部缩混为单声道时,与上面粘贴的代码混淆只会改变。精确的立体声模式(L/R vs mid-side vs强度)分布在SILK和CELT代码之间,不是你应该搞砸的东西。我不确定原来的帖子想要达到什么目的,但弄乱立体声模式可能不是那样。
【解决方案2】:

Opus 默认尝试根据当前比特率做出最佳决策。根据下表(20 ms 帧大小)做出决定:

  • 8-12 kbit/s 用于 NB 语音,
  • 16-20 kbit/s 用于 WB 语音,
  • 28-40 kbit/s 用于 FB 语音,
  • 48-64 kbit/s 用于 FB 单声道音乐,并且
  • 64-128 kbit/s 用于 FB 立体声音乐。

这是因为 opus 假设,如果比特率太低,它就不能以足够的质量编码立体声。

实际上,文档说可以更改频道数量,但没有说明如何更改。无论如何,我稍后会看看如何做到这一点。

您可以在rfc6716找到这些信息

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2016-08-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多