我现在正在做一些解码MP3文件的工作,但只是对MP3文件有一些基本的了解。这些天我实现了一个简单的MP3解码器。将解码结果与Maaate解码器的解码结果进行比较时,我遇到了这个问题。
我的解码器提取的帧数比Maaate解码器多一个。在仔细检查样本MP3文件的结果后,我发现第一帧是异常的。对于我的示例文件,第一帧长413字节,帧头0xfffb9064
与所有其他帧不同,长度为100字节,标题为0xfffb1064
。
我的问题是:
结果中的第一个“框架”是真实的框架吗?是这样,为什么它似乎与其他人不同?如果没有,这个结构用于什么以及如何将它们与其他结构区分开来共享帧同步代码0xfff
?
答案 0 :(得分:3)
MP3流没有文件头。你开始时只有一帧比其他帧长,听起来有点奇怪,但这完全合法。
快速描述标题中的位:http://www.datavoyage.com/mpgscript/mpeghdr.htm
在您的情况下,两种类型的标题共享:
第一帧与其他帧的不同之处在于:
其余的是:
该页面中有一个公式用于根据标题计算帧大小:144 *比特率/采样率+填充。
我怀疑128kbit的第一帧是用于生成样本的编码器的伪像(bug)。在第一帧之后,它仍然是32kbit的恒定比特率文件。鉴于MP3解码器在有几帧之前无法产生输出,并且它不会突然在比特率中途突然出现,这不太可能让任何事情感到不安。
答案 1 :(得分:0)
第一帧可以用作通常称为“ LAME标签”(不过,生成器的名称不必是LAME)。
当编码器尚不知道将来的数据是什么时,已经有(可能仍然是)在ffmpeg中创建此标签的方法,因此ffmpeg会使用一些默认值(例如128kbps)代替MP3数据中定义的速度。
因此,您是否拥有CBR或VBR数据都不能基于该问题。
要查看是否具有这样的标签,请至少打印出前64个字节(或使用十六进制编辑器),并且应该看到字母“ Info”(CBR)或“ Xing”(VBR)非常接近开始(通常在字节0x24附近)。 eyeD3
和ffprobe
可以解码此标签。
我有一个有关here格式的页面。
答案 2 :(得分:-1)
很可能第一帧是VBR帧。 检查[here]并使用hexa编辑器。希望它有所帮助