首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MP3文件使用同步安全整数?

为什么MP3文件使用同步安全整数?
EN

Stack Overflow用户
提问于 2011-03-08 01:33:59
回答 3查看 3.3K关注 0票数 10

我开始在c++中读取MP3文件。

一切都很顺利,直到我阅读了ID3-Tag的规范。在ID3v2报头中有一些关于其大小的信息存储在所谓的同步安全整数中。这是一个四字节的整数,其中每个字节的最高有效位被设置为零。

我发现了如何将其转换为普通整数,但我不禁要问自己,为什么整数值要以如此不必要的复杂方式存储。

我希望有人能告诉我为什么它是这样存储的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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++中,可以使用如下代码将同步安全整数转换为整数:

代码语言:javascript
复制
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;
}

希望这能有所帮助。

票数 28
EN

Stack Overflow用户

发布于 2011-05-10 01:41:52

除了上面的回答之外,我还想从我的博客中添加一个页面:http://phoxis.org/2010/05/08/synch-safe/

票数 3
EN

Stack Overflow用户

发布于 2011-03-08 01:51:46

6.2。同步安全整数

在标签的某些部分中,使用不同步方案是不方便的,因为不同步数据的大小是事先不知道的,这对于大小描述符是特别有问题的。ID3v2中的解决方案是使用同步安全整数,其中永远不会有任何假同步。同步安全整数是保持其最高位(第7位)为零的整数,从而使8位中的7位可用。因此,32位同步安全整数可以存储28位信息。

来自http://www.id3.org/id3v2.4.0-structure

这与他们在给定文档中所说的“不同步”密切相关,你应该阅读整个第6章。所有这些都与最大限度地兼容广泛的软件和硬件有关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5223025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档