可以在MPEG-1 / MPEG-2帧的有效载荷中找到错误的同步字吗?

时间:2013-06-11 19:01:14

标签: mp3 mpeg mpeg-2

我知道我可以在SO上找到关于此问题的其他答案,但我希望得到一些真正了解MPEG-1 / MPEG-2(或显然是MP3)的人的澄清。

MPEG-1/2帧的开始是从字节边界开始的12个设置位,因此字节ff f*,其中*是任意半字节。这12位称为同步字。这是在任何MPEG-1/2流中查找帧开始的有用特性。

我的第一个问题是:正式地,在其标题之外的MPEG-1/2帧的有效载荷中是否可以找到错误的同步字?

如果是这样,这是我的第二个问题:为什么同步字机制甚至存在呢?如果我们无法确保在阅读fff时找到新框架,此同步字的目的是什么?

请不要在答案中考虑ID3;我已经知道可以在ID3v2有效载荷中找到的同步字,但这已经有很好的记录。

2 个答案:

答案 0 :(得分:0)

我参与了MPEG-2流,更准确地说是Transport Streams(TS):我想我们可以找到相似之处。

TS由传输数据包组成,传输数据包有一个标头,以同步字节0x47开头 我们也可以在TP的有效载荷中找到0x47,但我们知道它不是同步字节,因为它没有对齐(TP的固定大小为188字节)。

  • 同步字为查看流的人提供了一个入口点,并允许程序将其进程与流同步,因此也就是名称。
  • 它还允许快速浏览和解析流:在TS中,您可以从数据包跳转到另一个数据包(检查标头,检查同步字节,跳过188个字节等)
  • 最后,这是一个安全措施,可以帮助您发现错误(例如,在传输过程中在流中,如果错误导致错误对齐,则在过程中)

这些论点是关于TS的,但我认为同样适用于您的情况:在有效负载中找到同步字应该不是问题,因为您应该始终能够区分有效负载和报头,大多数时候都需要长度信息(因为大小是像TP中那样固定的,或者因为你有TLV格式)。

答案 1 :(得分:0)

  

可以在MPEG-1/2的有效载荷中找到或不找到错误的同步字   框架,在它的标题之外?

根据this,"可以在任何二进制文件中轻松(并且经常)找到帧同步。"请参阅标题为" MPEG音频帧标题"

的部分

我用随机选择的.mp3歌曲证实了这一点(剥离了ID3标签)。它有5193个同步字,其中只有4898个被发现是有效的(使用代码的时间太长,不能包含在这里)。

>>> f = open('notag.mp3', 'rb')
>>> r=f.read()
>>> r.count(b'\xff\xfb')
5193
  

为什么同步字机制甚至存在呢?如果我们做不到   确保我们在阅读fff时找到了新的框架,目的是什么   这个同步字?

我们可以(相对)确定我们是否正在检查帧头的其余部分,而不仅仅是同步字。同步之后有一些位可用于:

  1. 识别误报或
  2. 为您提供有用的信息
  3. 使用.mp3,您必须使用这些有用的位来计算帧的大小。通过在查找下一个同步字之前跳过<frame-size>个字节,可以避免有效负载中可能存在的任何错误同步。请参阅标题为&#34;如何计算帧长度&#34的部分;在that same link