我正在尝试用 L/R 立体声制作低比特率的作品文件。是什么决定了是否opusenc
使用 L/R 立体声而不是联合立体声?有可以通过的标志吗?它与比特率有关吗?
opusenc input.wav output.opus //produces L/R stereo
opusenc input.wav output.opus --bitrate 8 //produces joint stereo
看起来是在这里确定的:
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 源代码,看起来将其设置force_channels
为 2 即可struct OpusEncoder
。但是,查看 opusenc.c 源代码,该字段没有设置在哪里。但是,您可以轻松地修改源以始终强制通道为两个。对于未来,看起来 Opus 将其称为“双立体声”而不是“L/R 立体声”。
默认情况下,Opus 会尝试根据当前比特率做出最佳决策。根据下表(20 ms 帧大小)做出决定:
这是因为 opus 假设,如果比特率太低,它就不能以足够的质量编码立体声。
实际上,文档说可以更改频道数量,但没有说明如何更改。无论如何,我稍后会看看如何做到这一点。
您可以在rfc6716上找到这些信息