我最近正在研究ID3v2.4.0。阅读2.4.0文档时,我发现了一个我无法理解的特殊部分-- sync-safe整数。为什么ID3v2要使用这种方法?
当然,我知道为什么ID3v2使用非同步方案,该方案用于防止MPEG解码器将ID3标签视为MPEG同步数据。但我不能理解的是,为什么是同步安全整数而不是不同步方案(=插入$00)。
为什么他们在表示标签大小而不是插入$00时采用同步安全的整数?这两种方法产生完全相同的效果。
ID3v2文档说,非同步数据的大小事先是未知的。但这句话说不通。如果标签数据存储在缓冲区中,则只需将有问题的字符替换为$FF 00,就可以知道非同步数据的大小。
有谁能帮我吗?
发布于 2011-10-27 15:58:40
为了简单起见,我假设unsynch/synch方案只有在用于mpeg文件时才有意义。
读取这四个字节并将其转换为常规整数非常简单:
// pseudo code
uint32_t size;
file.read( &size, sizeof(uint32_t) );
size = (size & 0x0000007F) |
( (size & 0x00007F00) >> 1 ) |
( (size & 0x007F0000) >> 2 ) |
( (size & 0x7F000000) >> 3 );如果它们使用与帧数据相同的不同步方案,则需要单独读取每个字节,查找FF00模式,然后逐个字节重建整数。此外,如果由于插入的不同步字节,报头中的“size”字段可以是可变数量的字节,则整个报头将是可变数量的字节。对他们来说,更简单的说法是“报头总是10个字节大小,看起来像这样……”。
ID3v2文档称,事先不知道非同步数据的大小。但这句话说不通。如果标签数据存储在缓冲区中,则只需将有问题的字符替换为$FF 00,就可以知道非同步数据的大小。
你是对的,这没有任何意义。写入id3v2报头和帧报头的大小是应用不同步(如果有的话)后的大小。但是,允许在不取消同步的情况下写入帧数据,因为id3v2可能用于标记mp3以外的文件,其中取消同步/同步的概念没有意义。我认为6.2节想说的是‘无论这是一个mp3文件,或者帧是不同步/同步写入的,帧大小总是以一种mpeg同步安全的方式写入’。
ID3v2.4帧可以在帧头中设置“数据长度指示器”标志,在这种情况下,您可以发现同步后缓冲区有多大。请参阅规范的4.1.2节。
有谁能帮我吗?
编写了符合规范的id3v2标签阅读器的人给出了一些有用的建议:不要试图理解规范。它肯定是由狂人和虐待狂写的。再看一遍就让我做噩梦了。
https://stackoverflow.com/questions/7898991
复制相似问题