ffmpeg 认为音频帧和音频样本之间有什么区别?

What does ffmpeg think is the difference between an audio frame and audio sample?

这是 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.

'audio frame' 对我来说似乎是个问题。 This SO answer 说 frame 是 sample 的同义词,但这不可能是 ffmpeg 认为 frame 的意思。看看这个例子,当我将一些音频重新采样到 22.05 kHz 并且长度正好是 313 帧时:

$ ffmpeg -i input.mp3 -frames:a 313 -ar:a 22.05K output.wav

如果 'frame' 和 'sample' 是同义词,我们预计音频持续时间为 0.014 秒,但实际持续时间为 8 秒。 ffmpeg 认为我输入的帧率是 39.125.

这是怎么回事? ffmpeg 认为音频帧到底是什么?我该如何找到我的输入音频的这个帧速率?

这里的 "frame" 是一个有点重载的术语。

在 PCM 中,帧是同时出现的一组样本。如果您的音频是 22.05 kHz 并且您有 313 个 PCM 帧,那么它的时间长度将如您预期的那样约为 14 毫秒。

但是,您的音频不是 PCM...它是 MP3。一个 MP3 帧长约 26 毫秒。其中 313 条加起来约 8 秒。这里的帧是一段不能独立解码的音频。 (事实上​​ ,某些框架实际上通过位库依赖于其他框架!)

FFmpeg 在内部使用 AVFrame 结构来传送和处理块中的所有媒体数据。每帧的样本数取决于解码器。对于视频,一帧由一张图片的所有像素数据组成,这是一个逻辑分组,尽管它也可以包含隔行扫描视频流的两个半图片的像素数据。

对于音频,基于 DCT 的编解码器的解码器通常使用 DCT window 中使用的样本数填充帧 - 正如 Brad 提到的那样,AAC 为 1024,MP3 为 576/1152,具体取决于采样率。 PCM 样本是独立的,因此没有内在的成帧概念和帧大小。然而,样本仍然需要包含在 AVFrame 中,对于每个缓冲区中的平面 PCM,ffmpeg 默认为每帧 1024 个样本(每个通道一个)。

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