ID3V2 中 APIC 帧标识 专辑封面。前几天 百度 谷歌 都没有找到具体的说明。有点小伤人。
最好参考 Android 中的 id3.cpp 以及一个java 开源 id3 库。找到这里的规格了。记录一下分享给需要的童鞋
数据帧头(固定 10个字节)
标签名 4 个字节 APIC
数据帧长度 4 个字节 XX XX XX XX
Flag标签 2 个字节
帧数据
描述信息的编码格式 1 个字节
MIME Type (可变字节)ANSIC 字符串 strlen 计算长度就可以了。(image/jpg)
图片类型 1 个字节
数据描述段 下面专门写
数据描述段
如果 描述信息的编码格式 0x00 好吧,这里的长度你可以用 strlen 来计算了
如果 描述信息的编码格式 0x01 好吧,按照 UNICODE 进行计算(这里之计算长度,每次加2 知道 遇见2个0 就OK了)
参考 Android 的代码实现:
static size_t StringSize(const uint8_t *start, uint8_t encoding) {
if (encoding == 0x00 || encoding == 0x03) {
// ISO 8859-1 or UTF-8
return strlen((const char *)start) + 1;
}
// UCS-2
size_t n = 0;
while (start[n] != '\0' || start[n + 1] != '\0') {
n += 2;
}
return n;
}
给一段实际数据:
-------------- 帧头区 ---------------
第一个红框 APIC
第二个绿框 数据长度
第三个红框 00 00 标识
------------------ 数据区-----------------
第一个蓝框 01 标识描述字段是 unicode
一串ANSIC 字符 image/jpeg 描述 MIME
第二个蓝框 03 标识 图片类型
FF FE 65 00 00 00 // 描述字段 (FF FE 标识大小端, 最后两个00 00 标识 Unicode 描述信息结束 )ANSIC 不列举了
FF D8 ........ 实际封面图片数据, JPEG 图片 一定是 FF D8 开始哦!
小结一下:
描述信息的编码 1个字节
MIME 字符串 N 个字节 strlen 计算
IMAGE 类型 1个字节
描述信息
实际图片数据