Android 音乐信息乱码

来源:互联网 发布:团员考试答案软件 编辑:程序博客网 时间:2024/06/16 02:30

有哪些问题导致:

1、google mediaScanner 的缺陷
2、qcom MP3 PARSER的问题 (找QCOM)

Google不支持针对每个TAG ITEM 单独处理, 而是假设ID3 中所有的TAG类型都是一种编码格式

摘自百度百科:
ID3 V2 (一般是V2.3)
帧头的定义如下:
char FrameID[4]; /用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表/
char Size[4]; /帧内容的大小,不包括帧头,不得小于1/
char Flags[2]; /存放标志,只定义了6位,稍后详细解说/

1.帧标识
用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
TIT2=标题 表示内容为这首歌的标题,
TPE1=作者
TALB=专集
TRCK=音轨 格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
TYER=年代 是用ASCII码表示的数字
TCON=类型 直接用字符串表示
COMM=备注 格式:”eng\0备注内容”,其中eng表示备注所使用的自然语言

下面摘自:http://article.yeeyan.org/view/460289/398443

一般来说,一个字符串表示范围在20 FF的ISO-8859-1字符。这种字符串在帧描述中表示为,或者如果允许换行则为。所有Unicode字符串使用16位Unicode 2.0((ISO/IEC 10646-1:1993, UCS-2)。Unicode字符串必须以Unicode BOM(FFFF FE FF)开头来识别字节顺序。

所有数字字符串和URL必须编码为ISO-8859-1。如果编码为ISO-8859-1则必须以00Unicode 00 00。一般来说,换行符是被禁止的。在ISO-8859-1中,如果允许换行则只能用$0A表示换行。

对于允许不同类型文字编码的帧,在其帧大小之后紧跟一个字符编码描述位。如果使用ISO-8859-1则该位应为00使Unicode 01。依赖于字符编码的字符串表示为,或者如果允许换行则表示为。

对于NULL结尾的空Unicode字符串,在Unicode DOM之后跟随一个Unicode NULL(FFFE0000 EF FF 00 00)。

三个字节的语言字段用户描述帧内容的语言,其参照ISO-639-2标准。

0000 0000代表字符使用ISO-8859-1编码方式。
0000 0001代表字符使用UTF-16编码方式。 (FFFE开始标志,很多文件没有这个标志,软件兼容处理吧)
0000 0002代表字符使用 UTF-16BE编码方式。(BIG ENDIAN)
0000 0003代表字符使用UTF-8编码方式。

解决方案:
对每个TAG ITEM 单独测试码表,然后利用 ucnv_convertEx 将源编码格式转换为UTF-8格式
KK 的源码中有MediaScannerClient::convertValues,
这个函数循环处理了 mValues 这个数组。
很简单: 将这个函数改造成针对单个TAG item的函数。
然后改造 endFile, 针对单个ITAM处理即可。

附件:
一、Hex Workshop 打开 某MP3文件Skyfall 片段:
4944330400000000083D54504531000000060000004164656C655449543200000023000003536B7966616C6C2028E794B5E5BDB1E3808A303037E3808BE4B8BBE9A298E69BB229

逐一分析,先取 ID3V2头分析:
49 44 33 04 00000000083D (49 44 33 =ID3 ,在文件起始处那么就是ID3v2,04 代表为ID3V2.4
是否有扩展头,也在上面描述,这个略过。

然后是ID3 帧序列(帧1(帧头+帧体)、帧2、帧3~~~~)
54504531 000000 06 0000 00 4164656C65
[ Ascii: ID3……=TPE1…….Adele] 06是帧体长度, 00是帧体首字节,代表编码为 ISO-8859-1
54495432 000000 23 0000 03 536B7966616C6C2028E794B5E5BDB1E3808A303037E3808BE4B8BBE9A298E69BB229
[Ascii:TIT2…#…Skyfall (………007…………)] 23是帧体长度, 03是帧体首字节,代表编码为 UTF-8

二、Hex Workshop 打开另一个文件:黄昏.mp3
49443303000000016E515449
543200000005000001C49E0F66
54434F50000000 28 0000 00 B0AEC7E9B1A3CFCABAD0204C6F766520496E204120426F7820BEDED0C7D0C2B4BABEABD1A1BC
上面这行表示帧体为 ISO-8859-1编码,但是事实上编码内容上看是GBK。

1 0
原创粉丝点击