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



这是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 认为音频帧到底是什么?如何找到输入音频的帧速率?

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

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

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

"框架"在这里是一个重载的术语。

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

但是,您的音频不是 PCM...是MP3。 MP3 帧的长度约为 26 毫秒。 其中 313 个加起来大约 8 秒。 这里的帧是一个无法独立解码的音频块。 (事实上,有些帧实际上依赖于通过位存储器的其他帧!

最新更新