我正在捕获到Opus的实时音频流,无论我为音频采样率选择什么,都可以获得48khz的输出。
这是我的命令行
./ffmpeg -f alsa -ar 16000 -i sysdefault:CARD = CODEC -f alsa -ar 16000 -i sysdefault:CARD = CODEC_1 -filter_complex join = inputs = 2:channel_layout = stereo:map = 0.1-FR \ | 1.0- FL,setsets = expr = N / SR / TB -ar 16000 -ab 64k -c:a opus -vbr off -compression_level 5 output.ogg
这是ffmpeg的回应:
输出#0,ogg,到'output.ogg':元数据:编码器:Lavf57.48.100流#0:0:音频:opus(libopus),16000 Hz,立体声,s16,延迟104,填充0,64 kb / s (默认)元数据:编码器:Lavc57.54.100 libopus
但是,ffmpeg似乎在撒谎,因为再次分析文件时,我得到:
输入#0,ogg,来自'output.ogg':持续时间:00:00:03.21,开始:0.000000,比特率:89 kb / s流#0:0:音频:作品,48000 Hz,立体声,s16,延迟156 ,padding 0元数据:ENCODER:Lavc57.54.100 libopus
我尝试了很多采样率排列,简化为单个音频输入等-总是得到相同的结果。
有任何想法吗?
这个问题应该在“超级用户”上提出并回答,因为它是关于使用软件而不是编程。但是,由于我知道答案,所以我还是会发布一个。
FFmpeg将以指定的采样率对Opus进行编码。您可以在libopusenc.c的源代码(此处和此处)中对此进行验证。
但是FFmpeg将以48 kHz的速率对Opus进行解码,即使它以较低的采样率进行编码也是如此。您可以在libopusdec.c(此处和此处)中对此进行验证。
这实际上是Ogg Opus规范(IETF RFC 7845)推荐的。5.1节第5项说:
Ogg Opus播放器应根据以下过程选择播放采样率:
- 如果硬件支持48 kHz播放,请以48 kHz解码。
- 否则,如果硬件的最高可用采样率是受支持的速率,请以该采样率解码。
- 否则,如果硬件的最高可用采样率小于48 kHz,则以高于最高可用硬件率的下一个更高Opus支持的速率进行解码,然后重新采样。
- 否则,以48 kHz解码并重新采样。
由于FFmpeg和大多数硬件都支持48 kHz播放,因此48 kHz用于解码FFmpeg中的Opus。原始采样率存储在Ogg容器的OpusHead数据包中,因此您可以根据需要使用解析器或其他播放器来检索它,但FFmpeg会忽略它,而仅以48 kHz进行解码。