我知道我可以在SO上找到关于此问题的其他答案,但我希望得到一些真正了解MPEG-1 / MPEG-2(或显然是MP3)的人的澄清。
MPEG-1/2帧的开始是从字节边界开始的12个设置位,因此字节ff
f*
,其中*
是任意半字节。这12位称为同步字。这是在任何MPEG-1/2流中查找帧开始的有用特性。
我的第一个问题是:正式地,在其标题之外的MPEG-1/2帧的有效载荷中是否可以找到错误的同步字?
如果是这样,这是我的第二个问题:为什么同步字机制甚至存在呢?如果我们无法确保在阅读fff
时找到新框架,此同步字的目的是什么?
请不要在答案中考虑ID3;我已经知道可以在ID3v2有效载荷中找到的同步字,但这已经有很好的记录。
答案 0 :(得分:0)
我参与了MPEG-2流,更准确地说是Transport Streams(TS):我想我们可以找到相似之处。
TS由传输数据包组成,传输数据包有一个标头,以同步字节0x47
开头
我们也可以在TP的有效载荷中找到0x47
,但我们知道它不是同步字节,因为它没有对齐(TP的固定大小为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时找到了新的框架,目的是什么 这个同步字?
我们可以(相对)确定我们是否正在检查帧头的其余部分,而不仅仅是同步字。同步之后有一些位可用于:
使用.mp3,您必须使用这些有用的位来计算帧的大小。通过在查找下一个同步字之前跳过<frame-size>
个字节,可以避免有效负载中可能存在的任何错误同步。请参阅标题为&#34;如何计算帧长度&#34的部分;在that same link。