我开始在c++中读取MP3文件。
一切都很顺利,直到我阅读了ID3-Tag的规范。在ID3v2报头中有一些关于其大小的信息存储在所谓的同步安全整数中。这是一个四字节的整数,其中每个字节的最高有效位被设置为零。
我发现了如何将其转换为普通整数,但我不禁要问自己,为什么整数值要以如此不必要的复杂方式存储。
我希望有人能告诉我为什么它是这样存储的。
发布于 2011-04-14 00:56:34
为了理解为什么使用同步安全整数,稍微了解一下MP3数据的格式以及媒体播放器如何播放MP3文件是很有帮助的。MP3数据以一系列帧的形式存储在文件中。每个帧包含一小段以MP3格式编码的数字音乐,以及有关帧本身的一些元数据。每个MP3帧的开头有11位(有时是12位),全部设置为1。这就是所谓的同步,这是媒体播放器在尝试播放MP3文件或流时所寻找的模式。如果播放器找到这个11位序列,那么它就知道它找到了可以解码和回放的MP3帧。
请参阅:www.id3.org/mp3Frame
正如您所知道的,ID3标记包含有关整个曲目的数据。在2.x版和更高版本中,ID3标记位于文件的开头,甚至可以嵌入到MP3流中(尽管这并不常见)。ID3标签的报头包含32位大小字段,该字段指示标签中有多少字节。无符号32位整数可以容纳的最大值是0xFFFFFFFFF。因此,如果我们在size字段中写入0xFFFFFFFF,我们就声明了一个非常大的标记(实际上太大了)。当播放器尝试播放文件或流时,它会查找MP3数据帧的11位序列,但是会在ID3标签报头中找到size字段并尝试播放该标签,因为size字段设置了前11位。这通常听起来不是很好,这取决于你的音乐品味。解决方案是创建一个整数格式,该格式不包含所有1的11位序列。因此是同步安全的整数格式。
在C/C++中,可以使用如下代码将同步安全整数转换为整数:
int ID3_sync_safe_to_int( uint8_t* sync_safe )
{
uint32_t byte0 = sync_safe[0];
uint32_t byte1 = sync_safe[1];
uint32_t byte2 = sync_safe[2];
uint32_t byte3 = sync_safe[3];
return byte0 << 21 | byte1 << 14 | byte2 << 7 | byte3;
}希望这能有所帮助。
发布于 2011-05-10 01:41:52
除了上面的回答之外,我还想从我的博客中添加一个页面:http://phoxis.org/2010/05/08/synch-safe/
发布于 2011-03-08 01:51:46
6.2。同步安全整数
在标签的某些部分中,使用不同步方案是不方便的,因为不同步数据的大小是事先不知道的,这对于大小描述符是特别有问题的。ID3v2中的解决方案是使用同步安全整数,其中永远不会有任何假同步。同步安全整数是保持其最高位(第7位)为零的整数,从而使8位中的7位可用。因此,32位同步安全整数可以存储28位信息。
来自http://www.id3.org/id3v2.4.0-structure
这与他们在给定文档中所说的“不同步”密切相关,你应该阅读整个第6章。所有这些都与最大限度地兼容广泛的软件和硬件有关。
https://stackoverflow.com/questions/5223025
复制相似问题