为什么同一个 MP3 的标签在每个播放器里都不一样
MP3 保存标题和艺人的位置不止一处,而是两处。它们相隔多年、由不同的标准写成,也没有任何规则要求两者一致。再加上第三个来源——播放器第一次扫描该文件时缓存下来的内容——就出现了日常里最常见的局面:同一首曲子在三台设备上有三种标注。
每个 MP3 都可以同时带两套标签
较早的格式 ID3v1 是贴在文件末尾的一个固定 128 字节的块。它只能放下三十个字符的标题、三十个字符的艺人、三十个字符的专辑和四个字符的年份,除此之外什么都放不下。字段填满之后,多出来的部分会被直接截掉。
较新的格式 ID3v2 位于文件开头,实际上没有长度限制,保存着现代播放器显示的一切:音轨号与碟片号、作曲者、注释、歌词、封面图。本世纪写出的文件大多两套都有,因为标签软件为了照顾老旧设备,仍在继续写那个旧块。
没有任何机制让两者保持同步。你在某个软件里改了标题,可能只更新了新标签,文件末尾却留着一份过期的副本,而另一个播放器偏偏更相信它。
非英文文字只能在其中一套标签里存活
ID3v1 里根本没有字符编码这个概念。它就是一串字节,按读取程序假定的某种旧编码来解释,于是中文、韩文、日文、西里尔字母和带重音的拉丁字母,要么变成乱码,要么变成一串问号。
ID3v2 的做法是在每个文本帧的开头放一个表示编码的字节,这样标题就能以 UTF-8 或 UTF-16 保存,在任何地方都能正确读回。同一首曲子在一个应用里标题正常、在另一个应用里是一排问号,原因就是两个应用读的根本不是同一套标签。
封面存在标签里面,而不是文件旁边
专辑封面嵌在 ID3v2 的图片帧中,带着类型(正面封面、背面封面、艺人照片)和图片本身的字节。放在文件旁边的 folder.jpg 只是一种约定,有的播放器认,有的完全不看。
所以封面在手机上出现、在电脑播放器里不出现,通常说明图片只存在于其中一处。这也解释了为什么一张专辑会比需要的大出好几兆:把一张大封面嵌进每一首曲子,就等于每个文件各存了一份。
播放器记住的是它第一次读到的内容
多数音乐软件在首次扫描文件夹时会建立一个媒体库数据库,之后就从这个数据库读取。你在磁盘上重写标签并不会更新媒体库,于是文件明明是对的,界面上仍然是旧名字。
在断定标签没改成功之前,先让播放器重新扫描,或者把曲目移除再重新加入。关于标签的抱怨里,有相当一部分其实是缓存过期,而不是标签过期。
音轨号,以及它出人意料的冲突
最初的 ID3v1 完全没有音轨号。后来的修订版从三十字节的注释字段末尾借走两个字节腾出位置,所以只有当注释不超过二十八个字符时,音轨号才存在。
这是写进格式本身的一个取舍:长注释和音轨号无法同时存进旧标签。如果你的音轨号只在某一个播放器里消失,这就是一个很可能的原因。
文件本身告诉你的事
在标签之外,音频的第一帧带着比特率、采样率和声道模式,它们描述的是真正编码出来的内容,而不是标签的说法。一个被标成高音质、帧里却写着 96 kbps 的文件,并不会因为改了标注就变好。
时长是类似的陷阱。恒定比特率的文件根本不保存长度,播放器只能按文件大小估算;所以缺少正确头部的可变比特率文件,常常显示错误的时长,拖动进度条也不准。
如何理清一个自相矛盾的文件
在改动任何东西之前,先把两套标签都读一遍,弄清出问题的播放器信的是哪一套。如果两者不同,这个差异本身就是答案,处理方式要么是修正过期的那一套,要么是把旧块整个删掉。
真要写入时,请选择用 Unicode 编码写 ID3v2 的标签软件;只有在你的设备里确实还有东西需要旧块时,才保留它。同一个文件里存在两个真相来源,正是当初制造出这个问题的安排。