为了教育目的,我想尝试自己阅读ID3标签,而没有一个库。我必须为学校做一个关于如何去做的报告。
首先,我读取了ID3头(前10个字节)。它起作用了。现在,我尝试读取第一个帧头,它几乎在我的所有文件中,直接跟随在ID3头之后。因此没有扩展的标头。帧头也应该是10个字节,对吗?那我就有麻烦了。
我检查的所有文件中的帧头结构如下:
+------------+
- Frame ID -
+------------+
- Frame Size -
+------------+
- Frame Flags-
+------------+ 在那之后,这个值应该跟着,对吧?如果id是TALB (相册),它应该是专辑名。这个值应该是帧大小值的大小。但是,我所有的文件在相册名称之前都有一个0x03,实际上在所有帧之前,并且帧大小也高了一个。示例:
帧ID = TIT2
帧大小=13(0x03为12+1)
旗帜..。
值= (0x03字符)3门向下
这个值是什么意思?我读了一些关于文本编码的内容,这个值是:
$03 UTF-8 UTF-8编码UNICODE.以00美元结束。
但我没有看到文本编码值放置在哪个部分。
这是我的代码(简化),用于读取框架标题的值:
//Method from a FrameHeader Class, takes 10 bytes as parameter
void setHeader( char* value ){
int i = 0;
for(; i < 4; i++ ){
identifier += value[i];
}
for(; i < 8; i++ ){
size = size << 8 | static_cast<unsigned char>(value[i]);
}
for(; i < 10; i++ ){
flags += value[i];
}
}
memblock = new char[10];
iStream.read( memblock, 10 );
FrameHeader frameHeader;
frameHeader.setHeader( memblock );
memblock = new char[ frameHeader.getSize() ];
iStream.read( memblock, frameHeader.getSize() );
cout << "Frame Indentifier : " << frameHeader.getIdentifier() << endl;
cout << "Frame Size : " << frameHeader.getSize() << endl;
cout << "Frame value : " << memblock << endl;*/我希望我的问题是清楚的。我不能上传这份文件,因为这是一首有版权的歌曲,我会因此而陷入法律的困境。
我从这个来源上得到了所有的信息。
发布于 2014-10-26 17:54:31
找到的字节是一个编码字节。来自id3v2.4.0-structure.txt
允许不同类型的文本编码的框架包含文本。 编码描述字节。可能的编码: $00 ISO-8859-1 ISO-8859-1以00美元结束。$01 UTF-16 UTF-16编码的Unicode与BOM。同一帧中的所有字符串应具有相同的字节顺序。以00美元结束。$02 UTF-16 BOM -16编码的Unicode没有BOM。以00美元结束。$03 UTF-8 UTF-8编码UNICODE.以00美元结束。
和:
依赖于编码的字符串在框架描述中表示。 按编码作为文本字符串,或全文字符串。 根据编码是否允许换行符。的空字符串 类型$01 (以空结尾)可能后面跟着Unicode BOM。 由Unicode NULL ($FF FE 00或$FE FF 00)执行。
除了结构文档之外,您还需要引用帧描述文件,它将告诉您框架是如何构造的。TIT2是一个文本框架。TIT2的框架描述在4.2节下。文本信息帧,它显示应该存在一个文本编码字节:
“文本信息帧”的标题,ID:"T000“- "TZZZ",不包括4.2.6中描述的"TXXX”。 根据编码编码$xx信息文本字符串
本质上,您需要同时引用这两个文档,因为有些框架具有这个字节,而有些没有,而有些框架(如果要实现它们)确实需要非常特殊的处理。例如,看看APIC框架,它允许将art嵌入到标签中。
也许值得指出的是,编写一个完整的、功能完整的ID3V2解码器是一项主要任务(我一直在那里)。有标准的几种版本,使用标准的每个版本制作的标签确实存在于野外;更不用说加密、压缩和不同步等选项,以及由破损的编码器制作的标签问题了。对于像您这样的项目,我只需要实现几个最常见框架的读取。如果您也在编写标记,请小心逐字写出尚未实现读取的任何框架。
除了引用的资源外,维基百科关于ID3的文章可能也很有用。
发布于 2014-10-26 17:35:54
从您的链接页面:
允许不同类型的文本编码的帧包含文本编码描述字节。可能的编码: $00 ISO-8859-1 ISO-8859-1以00美元结束。 $01 UTF-16 UTF-16编码的Unicode与BOM。同一帧中的所有字符串应具有相同的字节顺序。以00美元结束。 $02 UTF-16 BOM -16编码的Unicode没有BOM。以00美元结束。 $03 UTF-8 UTF-8编码UNICODE.以00美元结束。
这意味着根据编码类型的字符串字段的第一个字节将始终是这些字节之一,该字节将选择用于文本的编码。但是,您将无法找到编码的字面名称。
请注意,有类型为文本字符串的麻生太郎字段缺少该字节,并假定为ISO8859-1。
在您的文件中,0x03意味着下面的文本是UTF-8编码的.
https://stackoverflow.com/questions/26575659
复制相似问题