MP3 和 ID3

February 24, 2009 3:35 pm UTC | In Tech

这是一个纯技术笔记贴,只供我自己和某些人参考,不解决任何实际问题。

1. MP3 数据量

MPEG audio frame header 可参考比如这里。MP3 最常见的的格式是:MPEG version 1, Layer 3, 44.1 kHz,所以 frame header 的前两个字节一般是 0xFF 0xFB

音频数据一般用 CD 音质:立体声,44.1 kHz 采样,16 bits ADC,数据量 1411 kbps。MP3 有损压缩到 192 kbps 一般足够普通音响使用,最高可以支持 320 kbps。

无损音频压缩一般可以压缩到一半(700 kbps 左右),常见格式 APE, Apple Lossless, FLAC。

2. MP3 的元数据 ID3 Tag

有两种常见的 MP3 Tag 用来存储歌曲信息:id3v1(文件末尾 128 个字节,以“TAG”开头)和 id3v2(一般在文件头,长度不定,以“ID3”开头)。id3v2 有过至少三个版本,最流行的是 id3v2.3(1999 年发布),最新的是 id3v2.4(2000 年发布)。id3 读写库:id3lib(比较老),libid3tag(from MAD)等。这些库一般优先使用 id3v2 的数据,如果某些域没有数据,再从 id3v1 里取。

id3v2 的 frame 数据长度要求至少一个字节。如果没有歌名信息,那么歌名这个 frame 应该去掉而不是留下 0 字节的歌名域(有些 mp3 管理器有这个问题)。有些 id3 读取库严格执行标准,碰到 id3v2 中出现 0 字节的 frame 不容错而是直接忽略掉整个 id3v2,造成无法读取部分 mp3 歌名(比如 libid3tag 以及基于它的 EasyTAG)。

3. ID3 Tag 的编码问题

id3v1 采用 ISO-8859-1 编码,在理论上,它是无法正确存储中文歌名的。id3v2.3 除了可以使用 ISO-8859-1 编码外,也可以使用带 BOM 的 UTF-16(原规定是 UCS-2,编码信息存储在文本 frame 数据第一个字节,id3v2.3 3.3 节)。尽管如此,很多中文 mp3 还是用 GBK 编码(并号称自己是 ISO-8859-1 编码)写入 id3v2.3,所以会和 id3v1 一样有编码问题(mojibake)。对于这类 mp3 文件,大多数 Windows 的播放器在中文区域下都可以正确显示中文歌名;但是 Mac 和 Linux 下一般要进行 mp3 tag 编码转换,比如:EasyTAGID3ModnLyrics。有些 tag 编码转换程序只能写入 id3v2.4,这个并不是最理想的,后面会解释。另外,针对 ISO-8859-1 编码的 tag,某些播放器会猜编码。歌名越长,猜中几率越高,但是一个字的歌名常常猜不对。

id3v2.4 除了可以用 UTF-16 外,也可以使用了 UTF-8 编码(id3v2.4 第 4 章)。电脑上的播放器现在应该都支持 id3v2.4,但是某些播放器(特别是便携设备上的)由于 codebase 的关系,可能还在使用只支持到 id3v2.3 的 id3 库。这些播放器一般不会直接忽略掉 id3v2.4 的 tag,但是不能读取 UTF-8 编码的歌名。这样看来,为避免编码问题,最好的做法是:用 UTF-16 编码写入 id3v2.3,并且删掉 id3v1;假如 tag 转换程序只能写入 id3v2.4,应该使用带 BOM 的 UTF-16 编码(id3v2.4 第 4 章:text encoding description byte = 0x01)。

补:Windows 资源管理器和 Windows Media Player 对 id3v2 的 Unicode 编码支持很差,上述做法不适用(谢谢 neturalyu 留言提醒)。

Tags: , ,

4 Comments »

RSS feed for comments on this post.

  1. A Core 伟大!

    Comment by kommit — February 24, 2009 9:44 pm UTC #

  2. 伟大!!!

    Comment by paranoia — February 24, 2009 10:45 pm UTC #

  3. 嗯,看不懂

    Comment by Carlking — February 25, 2009 8:39 pm UTC #

  4. 不错,挺有用的文章

    遗憾的是目前Windows和WMP好像不支持id3 v2.4

    我还要用WMP管理媒体。。只好用回id3v1

    Comment by neturalyu — February 25, 2009 8:51 pm UTC #

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

This weblog is licensed under a Creative Commons License.
Powered by WordPress. Theme based on Pool by Borja Fernandez.