4

我正在捕获 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,asetpts=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:音频:opus,48000 Hz,立体声,s16,延迟 156 ,填充0元数据:编码器:Lavc57.54.100 libopus

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

有任何想法吗?

4

1 回答 1

8

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

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 解码。

于 2016-08-27T23:44:28.070 回答