ffmpeg不遵守opus输出中的采样率

时间:2016-08-27 22:18:20

标签: ffmpeg opus

我正在为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

我尝试过如此多的采样率排列,简化为单个音频输入等等 - 总是有相同的结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

这个问题应该在超级用户上提出并回答,因为它是关于使用软件而不是编程。但是,既然我知道了答案,那么无论如何我都会发布一个。

FFmpeg将以指定的采样率编码Opus。您可以在libopusenc.c(herehere)的源代码中对此进行验证。

但FFmpeg将以48 kHz解码Opus,即使它是以较低的采样率编码的。您可以在libopusdec.c(herehere)中验证这一点。

这实际上是由Ogg Opus规范(IETF RFC 7845)推荐的。第5.1节第5项说:

  

Ogg Opus播放器应该按照以下步骤选择播放采样率:

     
      
  1. 如果硬件支持48 kHz播放,请以48 kHz进行解码。
  2.   
  3. 否则,如果硬件的最高可用采样率是支持的速率,则以此采样率进行解码。
  4.   
  5. 否则,如果硬件的最高可用采样率低于48 kHz,则在下一个更高的Opus支持率下解码,使其高于最高可用硬件速率并重新采样。
  6.   
  7. 否则,以48 kHz解码并重新采样。
  8.   

由于FFmpeg和大多数硬件支持48 kHz播放,48 kHz用于解码FFmpeg中的Opus。原始采样率存储在Ogg容器的OpusHead数据包中,因此如果您愿意,可以使用解析器或其他播放器检索它,但FFmpeg会忽略它,只是以48 kHz进行解码。