8

我现在正在做一些解码 MP3 文件的工作,但只是对 MP3 文件有一些基本的了解。这些天我为 MP3 实现了一个简单的解码器。在将解码结果与Maaate解码器的结果进行比较时,我遇到了这个问题。

我的解码器比 Maaate 解码器多提取一帧。仔细检查一个示例 MP3 文件的结果后,我发现第一帧异常。对于我的示例文件,第一帧的长度为 413 字节,帧头0xfffb9064与所有其他具有 100 字节长度和 header 的帧不同0xfffb1064

我的问题是:结果中的第一个“框架”是真正的框架吗?是这样,为什么看起来和别人不一样?如果不是,这个结构是用来做什么的,以及如何将它与其他结构区分开来,因为它们都共享帧同步代码0xfff

4

3 回答 3

4

MP3 流没有文件头。开始时只有一帧比其他帧长,这听起来有点奇怪,但这是完全合法的。

标题中的位有一个快速描述:http ://www.datavoyage.com/mpgscript/mpeghdr.htm

在您的情况下,两种类型的标头共有:

  • MPEG-1
  • 第 3 层
  • 不受保护
  • 44.1kHz
  • 无填充
  • 不是私人的
  • M/S联合立体声
  • 无版权
  • 原始媒体
  • 不强调

第一帧与其他帧的不同之处在于:

  • 128kbit(导致 417 字节帧减去 4 字节报头)

其余的是:

  • 32kbit(导致 104 字节帧减去 4 字节报头)

该页面中有一个公式用于根据标头计算帧大小:144 *比特率/采样率+填充。

我怀疑 128kbit 的第一帧是用于生成样本的编码器的伪影(错误)。在第一帧之后,它仍然是一个 32kbit 的恒定比特率文件。鉴于 MP3 解码器只有几帧才能产生输出,并且它不会在中途突然遇到比特率的颠簸,这不太可能破坏任何东西。

于 2011-04-19T17:33:02.783 回答
3

很可能第一帧是VBR帧。检查here并使用六边形编辑器。希望能帮助到你

于 2013-12-31T16:38:15.547 回答
3

第一帧可以用作通常所说的“LAME 标签”(不过,生成器的名称不必是 LAME)。

当编码器还不知道未来的数据将是什么时,已经(并且可能仍然)有一种方法可以在 ffmpeg 中创建此标签,因此 ffmpeg 将简单地使用一些默认值,例如 128kbps,而不是在您的 MP3 数据。

所以无论你有 CBR 还是 VBR 数据都不能基于那个帧。

要查看您是否有这样的标签,请至少打印出前 64 个字节(或使用十六进制编辑器),您应该会在开头附近看到字母“Info”(CBR)或“Xing”(VBR)(通常字节 0x24 左右)。eyeD3ffprobe能够解码这个标签。

我在这里有一个关于格式的页面。

于 2019-10-25T04:45:38.277 回答