我正在为Opus捕捉实时音频流,无论我选择什么样的音频采样率,我都会获得48khz的输出。
这是我的命令行
./ ffmpeg -f alsa -ar 16000 -i sysdefault:CARD = CODEC -f alsa -ar 16000 -i sysdefault:CARD = CODEC_1 -filter_complex 加入=输入= 2:channel_layout =立体声:地图= 0.1-FR \ | 1.0-FL,asetpts = EXPR = N / SR / TB -ar 16000 -ab 64k -c: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:音频:opus,48000 Hz,立体声,s16,延迟156,填充0 元数据: 编码器:Lavc57.54.100 libopus
我尝试过如此多的采样率排列,简化为单个音频输入等等 - 总是有相同的结果。
有什么想法吗?
答案 0 :(得分:4)
这个问题应该在超级用户上提出并回答,因为它是关于使用软件而不是编程。但是,既然我知道了答案,那么无论如何我都会发布一个。
FFmpeg将以指定的采样率编码Opus。您可以在libopusenc.c(here和here)的源代码中对此进行验证。
但FFmpeg将以48 kHz解码Opus,即使它是以较低的采样率编码的。您可以在libopusdec.c(here和here)中验证这一点。
这实际上是由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进行解码。