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

ffmpeg在opus输出中不遵守采样率,ffmpeg,opus,Ffmpeg,Opus,我正在将一个实时音频流捕获到Opus,无论我选择什么样的音频采样率,我都会得到48khz的输出 这是我的命令行 ./ffmpeg-f alsa-ar 16000-i sysdefault:CARD=CODEC-f alsa-ar 16000-i系统默认值:卡=编解码器\u 1-过滤器\u复合体 连接=输入=2:channel_layout=立体声:地图=0.1-FR\| 1.0-FL,asetpts=expr=N/SR/TB -ar 16000-ab 64k-c:opus-vbr关闭-压缩级别5

我正在将一个实时音频流捕获到Opus,无论我选择什么样的音频采样率,我都会得到48khz的输出

这是我的命令行

./ffmpeg-f alsa-ar 16000-i sysdefault:CARD=CODEC-f alsa-ar 16000-i系统默认值:卡=编解码器\u 1-过滤器\u复合体 连接=输入=2:channel_layout=立体声:地图=0.1-FR\| 1.0-FL,asetpts=expr=N/SR/TB -ar 16000-ab 64k-c:opus-vbr关闭-压缩级别5输出.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

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


有什么想法吗?

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

FFmpeg将以指定的采样率对OPU进行编码。您可以在libopusenc.c(和)的源代码中验证这一点

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

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

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

  • 如果硬件支持48 kHz播放,则以48 kHz解码
  • 否则,如果硬件的最高可用采样率是支持的速率,则以该采样率解码
  • 否则,如果硬件的最高可用采样率小于48 kHz,则以高于最高可用硬件速率的下一个更高Opus支持速率解码并重新采样
  • 否则,以48 kHz解码并重新采样

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

    谢谢。我还应该提到,VLC还报告文件为48Khz——文件大小太大,无法达到16khz——因此我非常有信心,它实际上每秒包含48000个样本数据。。。。我把文件解码成WAV,然后用opusenc把它压缩回16Khz,它小得多。。。。