MP3全称为 MPEG1 Layer-3 音频, MPEG1 是标准中的声音部分, MPEG1 根据压缩质量和编码规则分为三层, Layer-1, Layer-2, Layer-3, Layer-3的压缩比最高,MP3就专指MPEG1 Layer-3.
(一)MP3文件的组成
概述:MP3文件由三部分组成, TAR_V2(ID3V2), Frame, TAR_V1(ID3V1), ID3V1 和 ID3V2 中记录了歌曲的信息, 比如歌曲名, 歌手等信息, ID3V1在文件的最后128个字节中, ID3V2 在文件的最开头, 作为ID3V1信息的扩充, 大小事不固定的, Frame是MP3中的重要部分, 是记录声音信息的部分, 每个Frame 包括 帧头,附加信息和主数据。
ID3V2:ID3V2位于文件的最开头, 它包含一个10字节头标签:
char Header[3]; /*必须为"ID3"否则认为标签不存在*/
char Ver; /*版本号ID3V2.3就记录3*/
char Revision; /*副版本号此版本记录为0*/
char Flag; /*存放标志的字节,这个版本只定义了三位*/
char Size[4]; /*标签大小,包括标签头的10个字节和所有的标签帧的大小*/
可以根据Header是否为ID3 来判断是否存在ID3v2信息, 头标签之后是 标签帧, 可以通过Size 求得 头标签和标签帧的总大小,Size共4个字节, 么个字节的最高位不用, 取每个字节的低7位组成一个二进制数, 这个数就是头标签和标签帧的总大小, 标签帧的大小是不固定的, 标签帧中存储了具体ID3V2信息, 每个标签帧包括一个帧头和数据实体,数据实体的大小必须大于或等于1, 帧头定义如下:
char FrameID[4]; /*用四个字符标识一个帧,说明其内容*/
char Size[4]; /*帧内容的大小,不包括帧头,不得小于 1*/
char Flags[2]; /*存放标志,只定义了 6 位*/
FrameID 中标记了此标签帧中的数据表示的是什么, 比如歌手, 歌名, 等,具体的表示如下:
TEXT: | 歌词作者 | TENC: | 编码 |
WXXX: | URL链接(URL) | TCOP: | 版权(Copyright) |
TOPE: | 原艺术家 | TCOM: | 作曲家 |
TDAT: | 日期 | TPE3: | 指挥者 |
TPE2: | 乐队 | TPE1: | 艺术家相当于ID3v1的Artist |
TPE4: | 翻译(记录员、修改员) | TYER: | 年代相当于ID3v1的Year |
USLT: | 歌词 | TALB: | 专辑相当于ID3v1的Album |
TIT1: | 内容组描述 | TIT2: | 标题相当于ID3v1的Title |
TIT3: | 副标题 | TCON: | 流派(风格)相当于ID3v1的Genre见下表 |
TBPM: | 每分钟节拍数 | COMM: | 注释相当于ID3v1的Comment |
TDLY: | 播放列表返录 | TRCK: | 音轨(曲号)相当于ID3v1的Track |
TFLT: | 文件类型 | TIME: | 时间 |
TKEY: | 最初关键字 | TLAN: | 语言 |
TLEN: | 长度 | TMED: | 媒体类型 |
TOAL: | 原唱片集 | TOFN: | 原文件名 |
TOLY: | 原歌词作者 | TORY: | 最初发行年份 |
TOWM: | 文件所有者(许可证者) | TPOS: | 作品集部分 |
TPUB: | 发行人 | TRDA: | 录制日期 |
TRSN: | Intenet电台名称 | TRSO: | Intenet电台所有者 |
TSIZ: | 大小 | TSRC: | ISRC(国际的标准记录代码) |
TSSE: | 编码使用的软件(硬件设置) | UFID: | 唯一的文件标识符 |
AENC: | 音频加密技术 |
Size 表示 此标签帧的数据的大小, 每个字节的8个位都是有效的。
Frame:Frame是 mp3 数据部分, 每个帧有帧头和数据构成,枕头内容如下:
typedef FrameHeader {
unsigned int sync: 11; //同步信息
unsigned int version: 2; //版本
unsigned int layer: 2; //层
unsigned int error protection: 1; // CRC校验
unsigned int bitrate_index: 4; //位率
unsigned int sampling_frequency: 2; //采样频率
unsigned int padding: 1; //帧长调节
unsigned int private: 1; //保留字
unsigned int mode: 2; //声道模式
unsigned int mode extension: 2; //扩充模式
unsigned int copyright: 1; // 版权
unsigned int original: 1; //原版标志
unsigned int emphasis: 2; //强调模式
}HEADER, *LPHEADER;
名称 | 位长 | 说 明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
同步信息 | 11 | 第1、2字节 | 所有位均为1,第1字节恒为FF。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版本 | 2 | 00-MPEG 2.5 01-未定义 10-MPEG 2 11-MPEG 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
层 | 2 | 00-未定义 01-Layer 3 10-Layer 2 11-Layer 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CRC校验 | 1 | 0-校验 1-不校验 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
位率 | 4 | 第3字节 | 取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。
V1 - MPEG 1 V2 - MPEG 2 and MPEG 2.5 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
采样频率 | 2 | 采样频率,对于MPEG-1: 00-44.1kHz 01-48kHz 10-32kHz 11-未定义 对于MPEG-2: 00-22.05kHz 01-24kHz 10-16kHz 11-未定义 对于MPEG-2.5: 00-11.025kHz 01-12kHz 10-8kHz 11-未定义 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
帧长调节 | 1 | 用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
保留字 | 1 | 没有使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
声道模式 | 2 | 第4字节 | 表示声道, 00-立体声Stereo 01-Joint Stereo 10-双声道 11-单声道 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
扩充模式 | 2 | 当声道模式为01是才使用。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版权 | 1 | 文件是否合法,0-不合法 1-合法 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
原版标志 | 1 | 是否原版, 0-非原版 1-原版 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
强调方式 | 2 | 用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。 00-未定义 01-50/15ms 10-保留 11-CCITT J.17 |
如果有CRC 效验, 则在帧头候面还有 2个字节的 CRC 效验。
一)帧长
MP3帧长的计算,也就是 一个 帧的数据的大小, 对于CBR文件, 比特率是固定的, 计算公式为:
Size=((采样个数 * (1 / 采样率))* 帧的比特率)/8 + 帧的填充大小
其中, 采样个数是指每个帧有多少个采样,大小事固定的, 如表:
| MPEG 1 | MPEG 2 (LSF) | MPEG 2.5 (LSF) |
Layer I | 384 | 384 | 384 |
Layer II | 1152 | 1152 | 1152 |
Layer III | 1152 | 576 | 576 |
采样率是指采样频率, 单位是KHz, 比特率(bitrate)指比特位速率, 单位是Kbps, 表示每秒钟音乐的数据流大小, 根据公式可以求得帧长。
二)每帧持续时间
对于CBR文件, 每帧的持续时间是固定的, 计算公式为:
每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000
三)MP3的总时长:
因为对于CBR文件, 每帧的持续时间是固定的, 只要知道所有帧的大小, 就可以 用这个总大小除以 每个帧的大小, 便得到了总的帧数, 进而就可以求得总时间。如下:
播放时间 = 总帧bytes ÷ 比特率 × 8000
以上对帧的计算只针对CBR文件, 对于VCR不适用。