MP3 和 ID3

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

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: encodingid3mp3

原文在:http://blog.wuxinan.net/archives/507

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值