1

我知道我可以在 SO 上找到有关此问题的其他答案,但我想从真正了解 MPEG-1/MPEG-2(或 MP3,显然)的人那里得到澄清。

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

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

如果是这样,这是我的第二个问题:为什么同步词机制甚至存在呢?如果在读取时不能确定是否找到了新帧fff,那么这个同步字的目的是什么?

请不要在您的回答中考虑 ID3;我已经知道可以在 ID3v2 有效负载中找到的同步词,但这是有据可查的。

4

2 回答 2

1

我研究过 MPEG-2 流,更准确地说是传输流(TS):我想我们可以找到相似之处。

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

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

这些论点与 TS 有关,但我认为您的情况也是如此:在有效负载中找到同步字不应该成为问题,因为您应该始终能够区分有效负载和标头,大多数时候使用长度信息(或者因为大小是固定的,就像在 TP 中一样,或者因为您有TLV格式)。

于 2014-08-26T07:40:42.067 回答
0

是否可以在 MPEG-1/2 帧的有效载荷中,在其标头之外找到错误的同步字?

据此 “可以在任何二进制文件中轻松(并且非常频繁地)找到帧同步。” 请参阅标题为“MPEG 音频帧头”的部分

我用我随机选择的一首 .mp3 歌曲确认了这一点(去掉了 ID3 标签)。它有 5193 个同步字,其中只有 4898 个被发现是有效的(使用的代码太长,无法包含在此处)。

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

为什么同步字机制甚至存在呢?如果我们在读取 fff 时无法确定是否找到了新帧,那么这个同步字的用途是什么?

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

  1. 识别误报或
  2. 给你有用的信息

对于 .mp3,您必须使用这些有用的位来计算帧的大小。通过在查找下一个同步字之前跳过<frame-size>字节,您可以避免有效负载中可能存在的任何错误同步。请参阅同一链接中标题为“如何计算帧长度”的部分。

于 2018-04-22T18:13:25.000 回答