摘要:在做音频项目开发时,经常会和音频打交道,会涉及到很多音频的基础知识。如音频格式,编解码,采样率、A/D,D/A转换等。本文旨在介绍歌曲ID3信息。如有错误,欢迎指正。

什么是ID3?

ID就是身份的意思,ID3就是表示MP3的身份。ID3是一种metadata容器,多应用于MP3格式的音频文件中。它可以将相关的曲名、演唱者、专辑、音轨数等信息存储在MP3文件中。 ID3,一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息。

为什么要ID3?

试想一下,如果没有ID3,那么我们如何判断一首歌的内容是什么呢?也许你会想到文件名。那又怎么知道这首歌演唱者和专辑名称等信息呢?不可能每首歌的演唱者和专辑名称都能记住。ID3就是做这样的事情,把歌曲名、演唱者、专辑等信息保存在MP3文件中。ID3就是MP3曲目的标签,有时也会把ID3称之为ID3Tags,其中的“Tag”在英文中名词的一个意思是“标签”,所以“ID3Tags”也就是“MP3文件曲目标签”的意思。

ID3的版本

ID3信息分为两个版本,V1和V2版本。其中V2有4个版本,最常用的是V2.3

V1和V2的区别: a,V2版一般位于mp3的开头,V1版的ID3在mp3文件的末尾128字节 b,V2是以ID3三个字符开头,V1以TAG三个字符开头 c,V2可以存储文字信息,和专辑图片等大容量信息。V1只能存储文字信息。 d,V2版本的ID3信息可以支持Unicode编码,V1版本是ANSI编码

ANSI编码:ID3v1中保存的字符串多采用ANSI编码。因此根据系统语言的不同所使用的编码是不同的。如果是简体中文系统使用的是GB2312,繁体中文就是BIG5,日文操作系统下面又是JIS编码。所以,如果MP3中仅有ID3v1的信息,那在不同语言的操作系统中的播放器里面显示的信息会是乱码。或者在windows里面正常的在linux系统下面就会是乱码。因为linux系统下面一般使用UTF-8编码。

现在我们听的歌曲一般都是ID3 V2版本,互联网时代,现在听歌都是走流媒体,如果还是ID3 V1版本,曲目的ID3相关信息,得听到歌曲末尾才能显示出来。这也是ID3 V2版本的ID3信息放在文件开头的原因

ID3格式介绍

ID3 V1格式

ID3v1保存在mp3尾部,固定为128字节,以TAG这三个字符开头。格式如下:

char Header[3]; 标签头必须是"TAG"否则认为没有标签 char Title[30]; 标题 char Artist[30]; 作者 char Album[30]; 专集 char Year[4]; 出品年代 char Comment[30]; 备注 char Genre; 类型/曲风

ID3 V1的信息都是按顺序存放,没有任何标识将其分开,比如标题、作者等信息不足30个字节,则使用’\0’补足,否则将造成信息错误。Genre使用原码表示,对照表如下: 其中0~79是标准的Genre,80至147是扩展的Genre 本文使用asfview.exe工具查看曲目的详细信息,主要是方便对MP3格式不熟的同学,也可以直接用支持十六进制显示的工具打开歌曲。后面也会介绍 如下是一个ID3 V1版本的例子:

ID3 V2格式

MP3的ID3v2.3版本文件基本分为两部分,一个为标签,其它的为数据。 文件标签分为标签头和标签帧

ID3 V2标签头

标签头有10个字节: 即在文件最开始的10个字节,它的数据结构如下: char Header[3];//这个字符串一定为"ID3" char version;//版本号 char revision;//副版本号,好像一直都是0,没看到过它有变过 char flags;//一些特殊的消息标记,只会使用此字节的高3位,其它的五位并没有什么用 char size[4];//代表整个标签帧的大小,但是不包括这开始的10个字节,所以这里得到的size需要加上10才代表整个标签帧的大小

ID3 V2标签帧

帧头的定义 帧标识:char ID[4];//用四个字符标识一个帧,表明这个帧的内容是什么 帧大小:char size[4];//帧内容的大小,不包括帧头 帧标记:char flags[2];//特殊的消息标记 常见的帧标识: TIT2:歌曲标题名字 TPE1:作者名字 TALB:作品专辑 TYER:作品产生年代 COMM:备注信息 APIC:专辑图片 帧标记说明:只定义了6位,另外的10位为0,一般这些标记也不用,通常为0。格式如下: flags %abc00000 ijk00000 a – 标签保护标志,设置时认为此帧作废 b – 文件保护标志,设置时认为此帧作废 c – 只读标志,设置时认为此帧不能修改 i – 压缩标志,设置时一个字节存放两个BCD 码表示数字 j – 加密标志(没有见过哪个MP3 文件的标签用了加密) k – 组标志,设置时说明此帧和其他的某帧是一组

以TIT2帧标识为例: 第一部分为1个字节,这个字节一定是[0x00,0x01,0x02,0x03]中的一种,0x00代表这个标签帧后续的数据为ISO-8859-1编码,0x01则是utf-16LE编码,0x02则是utf-16BE编码,0x03则是utf-8编码。

ISO-8859-1编码的歌曲 UTF-8编码的歌曲

用UltraEdit软件查看歌曲信息

ID3官网

想更详细了解ID3信息,请参考ID3官网: https://id3.org/