MP3文件中的ID3读取方法

MP3全称为 MPEG1 Layer-3 音频, MPEG1 是标准中的声音部分, MPEG1 根据压缩质量和编码规则分为三层, Layer-1 Layer-2 Layer-3 Layer-3的压缩比最高,MP3就专指MPEG1 Layer-3.

(一)MP3文件的组成

概述MP3文件由三部分组成, TAR_V2ID3V2) Frame TAR_V1ID3V1), ID3V1 ID3V2 中记录了歌曲的信息, 比如歌曲名, 歌手等信息, ID3V1在文件的最后128个字节中, ID3V2 在文件的最开头, 作为ID3V1信息的扩充, 大小事不固定的, FrameMP3中的重要部分, 是记录声音信息的部分, 每个Frame 包括 帧头,附加信息和主数据。

ID3V2ID3V2位于文件的最开头, 它包含一个10字节头标签:

char Header[3];    /*必须为"ID3"否则认为标签不存在*/

char Ver;    /*版本号ID3V2.3就记录3*/

char Revision;    /*副版本号此版本记录为0*/

char Flag;    /*存放标志的字节,这个版本只定义了三位*/

char Size[4];    /*标签大小,包括标签头的10个字节和所有的标签帧的大小*/


 

可以根据Header是否为ID3 来判断是否存在ID3v2信息, 头标签之后是 标签帧, 可以通过Size 求得 头标签和标签帧的总大小,Size4个字节, 么个字节的最高位不用, 取每个字节的低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

艺术家相当于ID3v1Artist

TPE4

翻译(记录员、修改员)

TYER

年代相当于ID3v1Year

USLT

歌词

TALB

专辑相当于ID3v1Album

TIT1

内容组描述

TIT2

标题相当于ID3v1Title

TIT3

副标题

TCON

流派(风格)相当于ID3v1Genre见下表

TBPM

每分钟节拍数

COMM

注释相当于ID3v1Comment

TDLY

播放列表返录

TRCK

音轨(曲号)相当于ID3v1Track

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个位都是有效的。

FrameFrame是 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

12字节

所有位均为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 364kbps是,值为0101

bits

V1,L1

V1,L2

V1,L3

V2,L1

V2,L2

V2,L3

0000

free

free

free

free

free

free

0001

32

32

32

32(32)

32(8)

8 (8)

0010

64

48

40

64(48)

48(16)

16 (16)

0011

96

56

48

96(56)

56(24)

24 (24)

0100

128

64

56

128(64)

64(32)

32 (32)

0101

160

80

64

160(80)

80(40)

64 (40)

0110

192

96

80

192(96)

96(48)

80 (48)

0111

224

112

96

224(112)

112(56)

56 (56)

1000

256

128

112

256(128)

128(64)

64 (64)

1001

288

160

128

288(144)

160(80)

128 (80)

1010

320

192

160

320(160)

192(96)

160 (96)

1011

352

224

192

352(176)

224(112)

112 (112)

1100

384

256

224

384(192)

256(128)

128 (128)

1101

416

320

256

416(224)

320(144)

256 (144)

1110

448

384

320

448(256)

384(160)

320 (160)

1111

bad

bad

bad

bad

bad

bad

V1 - MPEG 1    V2 - MPEG 2 and MPEG 2.5
L1 - Layer 1     L2 - Layer 2     L3 - Layer 3
"free"
表示位率可变    "bad"  表示不允许值

采样频率

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是才使用。

Value

强度立体声

MS立体声

00

off

off

01

on

off

10

off

on

11

on

on

版权

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不适用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值