【问题标题】:What does ffmpeg think is the difference between an audio frame and audio sample?ffmpeg 认为音频帧和音频样本之间的区别是什么?
【发布时间】:2020-02-11 18:56:07
【问题描述】:

在 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 说 frame 是 sample 的同义词,但这不能是 ffmpeg 认为的 frame。当我将一些音频重新采样为 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 frame-rate


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      “框架”在这里有点过分了。

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

      但是,您的音频不是 PCM……它是 MP3。 MP3 帧的长度约为 26 毫秒。其中 313 个加起来约为 8 秒。这里的帧是不能独立解码的音频块。 (事实上​​,有些帧实际上是通过比特库依赖于其他帧的!)

      【讨论】:

      • 完美答案。一些后续问题:MP3的确切帧率是多少? PCM中可以同时出现样本是什么意思?
      • @Mossmyr MP3 每个 MPEG 帧有固定数量的 PCM 样本。因此,每帧 1152 个样本。但是,它也可能是 576,具体取决于文件的编码方式。另请参阅:hydrogenaud.io/index.php?topic=85125.0 至于 PCM 帧,我的意思是,如果您有多个通道(即立体声),那么每个通道上将同时播放不同的样本。但是,它们一起构成了一个框架。
      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 2017-02-28
      相关资源
      最近更新 更多