ffmpeg不尊重作品输出中的采样率

Ada*_*dam 2 ffmpeg opus

我正在捕获到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

我尝试了很多采样率排列,简化为单个音频输入等-总是得到相同的结果。

有任何想法吗?

Cor*_*lks 6

这个问题应该在“超级用户”上提出并回答,因为它是关于使用软件而不是编程。但是,由于我知道答案,所以我还是会发布一个。

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

但是FFmpeg将以48 kHz的速率对Opus进行解码,即使它以较低的采样率进行编码也是如此。您可以在libopusdec.c(此处此处)中对此进行验证。

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

Ogg Opus播放器应根据以下过程选择播放采样率:

  1. 如果硬件支持48 kHz播放,请以48 kHz解码。
  2. 否则,如果硬件的最高可用采样率是受支持的速率,请以该采样率解码。
  3. 否则,如果硬件的最高可用采样率小于48 kHz,则以高于最高可用硬件率的下一个更高Opus支持的速率进行解码,然后重新采样。
  4. 否则,以48 kHz解码并重新采样。

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

  • 感谢那。我还应该提到,VLC 还报告该文件为 48Khz - 并且文件大小太大而不能达到 16khz - 所以我非常有信心它实际上每秒包含 48000 个样本数据......我解码了文件转换为 WAV,然后使用 opusenc 将其压缩回 16Khz,并且它更小.... (2认同)