在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.
什么是“音频框架”在我看来是可疑的。 This SO answer表示帧与样本同义,但这不是ffmpeg认为帧是什么。当我将一些音频重新采样到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认为音频帧实际上是什么?如何找到输入音频的帧频?
“帧”在这里有点重载。
在PCM中,一帧是一组同时发生的样本。如果您的音频为22.05 kHz,并且具有313个PCM帧,则时间长度大约为14毫秒,如您所愿。
但是,您的音频不是PCM,而是MP3。 MP3帧的长度约为26毫秒。其中313个加起来大约需要8秒。这里的帧是不能独立解码的音频块。 (实际上,某些帧实际上通过位存储库依赖于其他帧!)
FFmpeg在内部使用AVFrame结构来以块形式传输和处理所有媒体数据。每帧的样本数取决于解码器。对于视频,一帧由一个图片的所有像素数据组成,这是一个逻辑分组,尽管它也可以包含隔行视频流的两个半图片的像素数据。
对于音频,基于DCT的编解码器通常使用DCT窗口中使用的样本数量填充帧-如Brad所述,取决于采样率,AAC为1024,MP3为576/1152。 PCM样本是独立的,因此没有固有的构架概念,因此也没有帧大小。但是,样本仍需要容纳在AVFrame中,对于每个缓冲区中的平面PCM,ffmpeg默认为每帧1024个样本(每个通道一个)。
您可以使用ashowinfo过滤器显示帧大小。您也可以使用asetnsamples过滤器以自定义帧大小重新分组数据。