ffmpeg认为音频帧和音频采样有何差异?

3

在ffmpeg的手册页中,有一个引人注目的选项:

-aframes number (output)
    Set the number of audio frames to output. This is an obsolete alias for "-frames:a", which you should use instead.


我觉得“音频帧”这个词很含糊。这个SO回答说帧和采样是同义词,但ffmpeg认为帧不可能就是采样。看看我重新采样一些音频到22.05 kHz并恰好为313帧的例子:
$ ffmpeg -i input.mp3 -frames:a 313 -ar:a 22.05K output.wav

如果“帧”和“样本”是同义词,我们预计音频时长为0.014秒,但实际时长为8秒。ffmpeg认为我的输入帧率为39.125。
这里发生了什么?ffmpeg认为音频帧真正是什么?我该如何找到输入音频的帧率?
2个回答

4

FFmpeg内部使用AVFrame结构来以块的形式传递和处理所有媒体数据。每帧中的样本数量取决于解码器。对于视频而言,一帧由一个画面的所有像素数据组成,这是一种逻辑分组,虽然它也可以包含交错视频流的两个半画面的像素数据。

对于音频,基于DCT编解码器的解码器通常使用DCT窗口中使用的样本数填充帧 - 这是AAC的1024,MP3的576/1152(如Brad所提到的),具体取决于采样率。PCM样本是独立的,因此不存在固有的分帧概念,因此没有帧大小的概念。但是样本仍需要容纳在AVFrames内,ffmpeg默认将每个缓冲区中平面PCM的帧大小设置为1024个样本(每个通道一个)。

您可以使用ashowinfo过滤器来显示帧大小。您还可以使用asetnsamples过滤器将数据重新组合为自定义帧大小。


3

在这里,“frame”是一个有点多义的术语。

在PCM中,一帧是同时发生的一组样本。如果您的音频为22.05 kHz,并且您有313个PCM帧,则其时间长度约为14毫秒,正如您所期望的那样。

然而,您的音频不是PCM格式...它是MP3。一个MP3帧大约长26毫秒。313个帧加起来大约是8秒钟。这里的帧是一块无法独立解码的音频(实际上,有些帧通过比特保留池彼此相互依赖!)


完美的答案。一些后续问题:MP3的确切帧率是多少?PCM中的样本同时发生是什么意思? - Mossmyr
2
@Mossmyr 更准确地说,MP3每个MPEG帧都有固定数量的PCM样本。 因此,每帧有1152个样本。 但是,根据文件编码方式,也可能是576个。 另请参阅:https://hydrogenaud.io/index.php?topic=85125.0 至于PCM帧,我的意思是,如果您有多个声道(即立体声),则每个通道将同时播放不同的样本。 但是,它们一起组成一个单独的帧。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接