精华内容
下载资源
问答
  • Mp3帧分析(数据帧

    千次阅读 2018-03-16 17:23:56
     头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于FRAMEHEADER 信息的第16bit, 为0 则头后面无校验,为1 则有校验,校验值长度为2 个字节,(后面是可变长度的附加信息,对于标准的MP3文件来说,其...


    转自:http://blog.csdn.net/xsjm206/article/details/6719958


    一、 帧

    帧头长4字节,是的,是4个字节,共32位。 帧头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于FRAMEHEADER 信息的第16bit, 为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节,(后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,本段括号内的文字内容有待商榷,暂时没见到这样的文件),紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。

    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;

    1.1  帧头4字节使用说明见表1。

                                                          表1 MP3帧头字节使用说明

    名称

    位长

    说          明

    同步信息

    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。

    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-调整,具体调整计算方法见下文。padding

    保留字

    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

    规律说明:根据上表的分析,所有的Mp3文件的数据帧开始的两个字节必需是“FF FA”或者 “FF FB”。

    1.2 MP3帧长的计算

    MP3帧长取决于位率和频率,计算公式为:

    Size=((采样个数  * (1 / 采样率))* 帧的比特率)/8  + 帧的填充大小

    对于Mp3格式,Size=((1152 * (1 / 采样率))* 帧的比特率)/8  + 帧的填充大小

                                      =144*帧的比特率/采样率+帧的填充大小

    a,帧的填充大小就是第23位的帧长调节,不是0就是1。

    b,采样个数:MPEG的不同规范(MPEG-1/2/3),以及同一规范中不同的 Layer(Layer I/II/III),每一帧
    所对应的采样数,都是固定的,其具体的值参见下表:表 4   MPEG帧的采样数索引表(单位:个/帧) 

     

    MPEG 1

    MPEG 2 (LSF)

    MPEG 2.5 (LSF)

    Layer I

    384

    384

    384

    Layer II

    1152

    1152

    1152

    Layer III

    1152

    576

    576

    3.举例说明

    本例是王菲的怀念(大小4,680,730 字节)

    前面的四个字节为“FF FB B0 64”对应的二进制串为“11111111  11111011  10110000  01100100”,参照前面的分析,第16位为“1”,则无校验数据;第17至20位为“1011”,则比特率=192kbps;第21至22位为“00”,则采样频率=44.1kHz;第23位为“0”,则帧长调整是0;所以帧长Size=144*192/44.1+0=626,前面除法需向下求整(但有时又是四舍五入)。所以在地址0x272处又开始了新的帧,我这里是“FF FB B0 44”。

    二 VBR 标志帧

          前面分析了帧的结构,Mp3文件分为CBR和VBR两种,这里着重分析一下VBR文件,VBR文件的第一个帧不是有效的数据帧,是它的标志帧。这种标志帧有Xing帧和VBRi帧。

    2.1 Xing 帧

           VBR 是XING 公司推出的算法,所以在MP3 的FRAME 里会有“XING"这个关键字(现在很多流行的小软件也可以进行VBR 压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3 文件中的第一个有效FRAME 里,它标识了这个MP3 文件是VBR 的。同时第一个FRAME 里存放了MP3 文件的FRAME 的总个数,这就很容易获得了播放总时间,同时还有100 个字节存放了播放总时间的100 个时间分段的FRAME 的INDEX,假设4 分钟的MP3 歌曲,240S, 分成100 段,每两个相邻INDEX 的时间差就是2.4S, 所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的FRAME 头。

    2.1.1 解析帧

    表2 VBR Xing文件第一帧结构

    字节

    说    明

    1-4

    标准声音帧头(Mp3时,为“FF FA xx xx”或者“FF FB xx xx”)

    5-40

    存放VBR文件标识“Xing”(58 69 6E 67),此标识具体位置视采用的MPEG标准和声道模式而定。标识的前后字节没有使用。

    37-40

    MPEG-1和非单声道(常见)

    注意:Mp3的就是这种情况,第5至36的数据存储的是前面提到过的32字节的边信息,无效边信息时是32字节的“00”

    22-25

    MPEG-1和单声道

    22-25

    MPEG-2和非单声道

    14-17

    MPEG-2和单声道

    41-44

    标志,说明是否存储了帧数、文件长度、目录表和VBR规模信息,如果存储了,则01 02 04 08。注意:如果四种信息都存储了则这4个字节为“00 00 00 0F”,即F的二进制是“1111”,相应地,如果存储了帧数、文件长度、目录表,则这4个字节为“00 00 00 0E”

    45-48

    帧数(包括第一帧)

    49-52

    文件长度

    53-152

    目录表,用来按时间进行字节定位。

    153-156

    VBR规模,用于位率变动音频质量指示,最差 0,最好 100,大端[可
    选]

    2.1.2 举例说明

    曲子是:刘德华 - 虹桥机场的咖啡厅.mp3(5,898,130字节,时长3分14秒)

    a,第37至40地址为“58 69 6E 67”,就是“Xing”标志了;

    b,第41至44地址为“00 00 00 0F”,这里是Flag了,表示该帧存储了帧数、文件长度、目录表和VBR规模信息。

    c,第45至48地址为“00 00 1D 11”,这里是文件的总帧数(包括第一帧),是big-endia的,(1*16^3+13*16^2+1*16+1)帧。

    d,第49至52地址为“00 59 FD DE”,这里是文件的总大小,也是Big-Endian的,(5*16^5+9*16^4+15*16^3+13*16^2+13*16+14)=5,897,694(字节), 但是右键文件的属性发现却是5,898,130字节,这多出来的字节暂时还没弄明白(郁闷中)。

    e,第53至152地址,就是一百个字节的目录表了(称作TOC表),如图蓝色地部分。

       TOC (Table of Contents)

                  Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately

                  solves problem with moving inside file.

                  Each Byte has a value according this formula:

                  (TOC[i] / 256) * fileLenInBytes

                  So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000

                  000 Bytes length) you can use:

                  TOC[(60/240)*100] = TOC[25]

                  and corresponding Byte in file is then approximately at:

                  (TOC[25]/256) * 5000000

                  If you want to trim VBR file you should also reconstruct Frames, Bytes and TOC

                  properly.

           TCO 索引的计算方式如下  文件长度 100 比如文件持续 240 秒,我需要跳到 60 秒,文件长度为 5000000 字节 计算如下TOC[(60/240)*100] =TOC[25] 然后相对于文件中的位置大约是在 (TOC[25]/256) * 5000000 如果要自己重建的话,基本是把这个步骤反过来做就可以了。要求准确的话,就需要根据时间点找到正确帧的位置然后再计算, 定位帧的做法都是从第一帧开始搜索。

    f,第153至156字节地址为“00 00 00 64”,,音频质量指示质量指示器,为 0(最好)-100(最差)的 Big-Endian 值,没想到这个文件的音质是最差的100。

    g,接下来是Lame版本的相关信息

    2.2 VBRI帧(该种文件没有找到,此部分内容是完全摘抄的,供参考)

    据了解,目前此头信息,只有用 Fraunhofer 的编码器生成的 MPEG音频文件,才会用到此
    头。其和Xing 头不一样,其放在第一个MPEG头的后面,大小正好是 32字节。其位置,
    长度和示例,都是以字节为单位。下表是 VBRi 头的具体格式及含义,单位为字节:

    位置 (字节)

    长度 (字节)

    含义

    示例

    0

    4

    4个 ASCII字符的 VBR 头ID: “VBRI”无NULL结尾

    “VBRI”

    4   

    2

    版本 ID,大端,类型:DWORD

    1

    2

    延迟,类型:float

    7344

    2

    音频质量指示

    75

    10     

    4

    文件总大小,大端,类型:DWORD

    45000

    14      

    4

    总的帧数,大端,类型:DWORD

    7344

    18

    2

    TOC 表的表项数目,大端,类型:WORD

    100

    20

    2

    TOC 表项的缩放因子,大端,类型:DWORD

    1

    22 

    2

    单个 TOC 表项的大小,单位字节,最大为 4,大端,

    类型:DWORD

    2

    24   

    2

    帧数/表项,大端,类型:WORD

    845

    26  

     

     

    用于检索的 TOC 表,整型值,可以通过每个表项大小乘于表项个数得到此 TOC 表的总大小,大端

     

    三 Info 帧

         info帧,结构和Xing帧是相同的,从一些网上的资料显示:这种类型的帧有点怪,在CBR文件中的第一个数据帧可以是Info帧,在VBR文件中的第一个数据帧也有可能是Info帧,但是我个人更倾向于认为第一个数据帧为Info帧的文件是CBR文件,比如Kugoo软件制作的铃声的第一帧都是Info帧,而且是CBR文件。在下一篇博文(四)怎样区分是否是固定位率文件和这个有关。

    展开全文
  • 头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于FRAMEHEADER 信息的第16bit, 为0 则头后面无校验,为1 则有校验,校验值长度为2 个字节,(后面是可变长度的附加信息,对于标准的MP3文件来说,其...

    一、 帧

    帧头长4字节,是的,是4个字节,共32位。 帧头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于FRAMEHEADER 信息的第16bit, 为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节,(后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,本段括号内的文字内容有待商榷,暂时没见到这样的文件),紧接其后的 是压缩的声音数据,当解码器读到此处时就进行解码了。

    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;

    1.1  帧头4字节使用说明见表1。

                                                          表1 MP3帧头字节使用说明

     

    名称

    位长

    说          明

    同步信息

    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。

    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-调整,具体调整计算方法见下文。padding

    保留字

    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

    规律说明:根据上表的分析,所有的Mp3文件的数据帧开始的两个字节必需是“FF FA”或者 “FF FB”。

    1.2 MP3帧长的计算

    MP3帧长取决于位率和频率,计算公式为:

    Size=((采样个数  * (1 / 采样率))* 帧的比特率)/8  + 帧的填充大小

    对于Mp3格式,Size=((1152 * (1 / 采样率))* 帧的比特率)/8  + 帧的填充大小

                                      =144*帧的比特率/采样率+帧的填充大小

    a,帧的填充大小就是第23位的帧长调节,不是0就是1。

    b,采样个数:MPEG的不同规范(MPEG-1/2/3),以及同一规范中不同的 Layer(Layer I/II/III),每一帧
    所对应的采样数,都是固定的,其具体的值参见下表:表 4   MPEG帧的采样数索引表(单位:个/帧)

     

    MPEG 1

    MPEG 2 (LSF)

    MPEG 2.5 (LSF)

    Layer I

    384

    384

    384

    Layer II

    1152

    1152

    1152

    Layer III

    1152

    576

    576

    3.举例说明

    本例是王菲的怀念(大小4,680,730 字节)

    前面的四个字节为“FF FB B0 64”对应的二进制串为“11111111  11111011  10110000  01100100”,参照前面的分析,第16位为“1”,则无校验数据;第17至20位为“1011”,则比特率=192kbps;第21至22位为 “00”,则采样频率=44.1kHz;第23位为“0”,则帧长调整是0;所以帧长Size=144*192/44.1+0=626,前面除法需向下求 整(但有时又是四舍五入)。所以在地址0x272处又开始了新的帧,我这里是“FF FB B0 44”。

    二 VBR 标志帧

          前面分析了帧的结构,Mp3文件分为CBR和VBR两种,这里着重分析一下VBR文件,VBR文件的第一个帧不是有效的数据帧,是它的标志帧。这种标志帧有Xing帧和VBRi帧。

    2.1 Xing 帧

           VBR 是XING 公司推出的算法,所以在MP3 的FRAME 里会有“XING"这个关键字(现在很多流行的小软件也可以进行VBR 压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3 文件中的第一个有效FRAME 里,它标识了这个MP3 文件是VBR 的。同时第一个FRAME 里存放了MP3 文件的FRAME 的总个数,这就很容易获得了播放总时间,同时还有100 个字节存放了播放总时间的100 个时间分段的FRAME 的INDEX,假设4 分钟的MP3 歌曲,240S, 分成100 段,每两个相邻INDEX 的时间差就是2.4S, 所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的FRAME 头。

    2.1.1 解析帧

    表2 VBR Xing文件第一帧结构

     

    字节

    说    明

    1-4

    标准声音帧头(Mp3时,为“FF FA xx xx”或者“FF FB xx xx”)

    5-40

    存放VBR文件标识“Xing”(58 69 6E 67),此标识具体位置视采用的MPEG标准和声道模式而定。标识的前后字节没有使用。

    37-40

    MPEG-1和非单声道(常见)

    注意:Mp3的就是这种情况,第5至36的数据存储的是前面提到过的32字节的边信息,无效边信息时是32字节的“00”

    22-25

    MPEG-1和单声道

    22-25

    MPEG-2和非单声道

    14-17

    MPEG-2和单声道

    41-44

    标志,说明是否存储了帧数、文件长度、目录表和VBR规模信息,如果存储了,则01 02 04 08。注意:如果四种信息都存储了则这4个字节为“00 00 00 0F”,即F的二进制是“1111”,相应地,如果存储了帧数、文件长度、目录表,则这4个字节为“00 00 00 0E”

    45-48

    帧数(包括第一帧)

    49-52

    文件长度

    53-152

    目录表,用来按时间进行字节定位。

    153-156

    VBR规模,用于位率变动音频质量指示,最差 0,最好 100,大端[可
    选]

    2.1.2 举例说明

    曲子是:刘德华 - 虹桥机场的咖啡厅.mp3(5,898,130字节,时长3分14秒)

    a,第37至40地址为“58 69 6E 67”,就是“Xing”标志了;

    b,第41至44地址为“00 00 00 0F”,这里是Flag了,表示该帧存储了帧数、文件长度、目录表和VBR规模信息。

    c,第45至48地址为“00 00 1D 11”,这里是文件的总帧数(包括第一帧),是big-endia的,(1*16^3+13*16^2+1*16+1)帧。

    d,第49至52地址为“00 59 FD DE”,这里是文件的总大小,也是Big-Endian的, (5*16^5+9*16^4+15*16^3+13*16^2+13*16+14)=5,897,694(字节), 但是右键文件的属性发现却是5,898,130字节,这多出来的字节暂时还没弄明白(郁闷中)。

    e,第53至152地址,就是一百个字节的目录表了(称作TOC表),如图蓝色地部分。

       TOC (Table of Contents)

                  Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately

                  solves problem with moving inside file.

                  Each Byte has a value according this formula:

                  (TOC[i] / 256) * fileLenInBytes

                  So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000

                  000 Bytes length) you can use:

                  TOC[(60/240)*100] = TOC[25]

                  and corresponding Byte in file is then approximately at:

                  (TOC[25]/256) * 5000000

                  If you want to trim VBR file you should also reconstruct Frames, Bytes and TOC

                  properly.

           TCO 索引的计算方式如下  文件长度 100 比如文件持续 240 秒,我需要跳到 60 秒,文件长度为 5000000 字节 计算如下TOC[(60/240)*100] =TOC[25]/256) * 5000000 如果要自己重建的话,基本是把这个步骤反过来做就可以了。要求准确的话,就需要根据时间点找到正确帧的位置然后再计算, 定位帧的做法都是从第一帧开始搜索。

    f,第153至156字节地址为“00 00 00 64”,,音频质量指示质量指示器,为 0(最好)-100(最差)的 Big-Endian 值,没想到这个文件的音质是最差的100。

    g,接下来是Lame版本的相关信息

    2.2 VBRI帧(该种文件没有找到,此部分内容是完全摘抄的,供参考)

    据了解,目前此头信息,只有用 Fraunhofer 的编码器生成的 MPEG音频文件,才会用到此
    头。其和Xing 头不一样,其放在第一个MPEG头的后面,大小正好是 32字节。其位置,
    长度和示例,都是以字节为单位。下表是 VBRi 头的具体格式及含义,单位为字节:

     

    位置 (字节)

    长度 (字节)

    含义

    示例

    0

    4

    4个 ASCII字符的 VBR 头ID: “VBRI”无NULL结尾

    “VBRI”

    4   

    2

    版本 ID,大端,类型:DWORD

    1

    2

    延迟,类型:float

    7344

    2

    音频质量指示

    75

    10     

    4

    文件总大小,大端,类型:DWORD

    45000

    14      

    4

    总的帧数,大端,类型:DWORD

    7344

    18

    2

    TOC 表的表项数目,大端,类型:WORD

    100

    20

    2

    TOC 表项的缩放因子,大端,类型:DWORD

    1

    22 

    2

    单个 TOC 表项的大小,单位字节,最大为 4,大端,

    类型:DWORD

    2

    24   

    2

    帧数/表项,大端,类型:WORD

    845

    26  

     

     

    用于检索的 TOC 表,整型值,可以通过每个表项大小乘于表项个数得到此 TOC 表的总大小,大端

     

    三 Info 帧

         info帧,结构和Xing帧是相同的,从一些网上的资料显示:这种类型的帧有点怪,在CBR文件中的第一个数据帧可以是Info帧,在VBR文件中的第 一个数据帧也有可能是Info帧,但是我个人更倾向于认为第一个数据帧为Info帧的文件是CBR文件,比如Kugoo软件制作的铃声的第一帧都是 Info帧,而且是CBR文件。在下一篇博文(四)怎样区分是否是固定位率文件和这个有关。

    转载于:https://www.cnblogs.com/shakin/p/4012780.html

    展开全文
  • MP3详解

    千次阅读 2018-03-14 10:00:42
    写在前面 最近正在学习并整理音视频相关材料,我习惯性的把最近学到的东西分享出来。如果大家感兴趣,可以订阅我的专题 视频播放器...每一包含了一个头以及其后的音频数据。同一个文件每一的音频数据的采样...

    写在前面

    最近正在学习并整理音视频相关材料,我习惯性的把最近学到的东西分享出来。如果大家感兴趣,可以订阅我的专题 视频播放器和音视频基础知识

    正文

    MP3方面的资料网上现有的都大同小异,我是参考了一篇网上的博客。原文地址是:原文在这里,感谢博主的博客。

    MP3音频帧

    一个MPEG音频文件是由很多帧数据组成。每一帧包含了一个帧头以及其后的音频数据。同一个文件每一帧的音频数据的采样次数总是相同的。Layer II,II,III的音频帧头都是相同的,不同之处体现在音频数据的编码方式。帧本身是由slot组成的。Layer I的slot大小是4字节,其余情况是1字节。

    除了Layer之外,MPEG音频本身也有3个版本,这个几个版本的不同之处体现在能处理的采样率不同(参考 表2.1.2)。MPEG 1 (ISO/IEC 13818-3) 和MPEG**2**(ISO/IEC 1117**2**-3)是ISO标准. MPEG**2**.5对MPEG**2**进行的非官方的扩展,它是为了支持更低的采样率。MPEG**2**/2.5 也常被简称为LSF(Low SamplingFrequencies),既低采样率。每个版本的MPEG都有3种不同的Layer。如果你想知道关于MPEG音频文件的更多的技术细节,请参考规范说明。你可以在www.**MP**3-Tech.org找到规范说明和许多其他关于MPEG有用的信息。

    一个文件可以被编码成恒定比特率(CBR)或可变比特率(VBR),这意味着每帧可以有不同的比特率。可变比特率的质量往往比恒定比特率编码的文件更高,因为他们可以在需要的地方使用更高的比特率。

    MPEG音频帧头

    帧头位于每帧的开始处,大小通常是32bits(若Protection bit为1,则还要帧头最后添加16bits的校验位),并具有以下格式。帧头中第0位是最高有效位(MSB)。在头位的0是最重要的一点完整的头(最高位)。请注意,位置是从零开始的,位置,长度和示例都是用位格式表示。

    起始位置大小作用示例
    011帧同步标识,11个‘1’。用于定位帧头起始位置11111111111
    112MPEG音频版本 ID:
    00:MPEG version2.5
    01:reserved
    10:MPEG Version 2
    11:MPEG Version 1
    01
    132Layer 序列号:
    00 - reserved
    01 - Layer III
    10 - Layer II
    11 - Layer I
    01
    151Protection bit:
    0 - protected by 16 bit CRC following header
    1 - no CRC
    1
    164比特率索引1001
    202采样率索引11
    221Padding bit:
    如果设置了,则用一个slot填充数据(slot对框架大小的计算很重要)
    Layer I的slot大小是4字节,其余情况是1字节。
    1
    231保护位1
    242channel模式:
    00 - 立体声
    01 - 联合立体声(立体声)
    10 - 双通道(两个单声道)
    11 - 单声道
    注意:双通道文件由两个独立的单声道组成。每一个都只使用了文件的一半比特率。大多数解码器将其输出为立体声,但情况并非总是如此。
    00
    262模式扩展(只用于联合立体声)00
    281版权位1
    291原始位1

    30|2|Emphasis:
    00 - none
    01 - 50/15 ms
    10 - reserved
    11 - CCIT J.17
    很少用|00|

    MPEG Audio Frame Header

    抽样速率指定每秒钟有多少个样本被记录。每个MPEG版本可以处理不同的samplingrates。

    采样率索引MPEG-1 (Hz)MPEG-2 (Hz)MPEG-2.5 (Hz)
    00441002205011025
    01480002400012000
    1032000160008000
    11reservedreservedreserved

    MPEG 采样率索引表

    比特率的单位是 kbit/s。请注意,这里的kbit/s指的是1000bit/s,而不是1024!比特率指数1111保留,不应该被使用。在MPEG音频标准中有一个自由格式描述。这个自由格式意味着该文件是以恒定比特率编码的,但不是预定义的编码比特率。只有极少数的解码器能够处理这种文件。
    MPEG 采样率索引表

    在MPEG-1 LayerII中,只有某些比特率和某些模式的组合是允许的(如下表)。在MPEG -2/2.5,没有此限制。下表是允许的比特率和模式的组合:

    比特率允许的模式
    freeall
    32单声道
    48单声道
    56单声道
    64all
    80单声道
    96all
    112all
    128all
    160all
    192all
    224立体声,强度立体声,双通道
    256立体声,强度立体声,双通道
    320立体声,强度立体声,双通道
    384立体声,强度立体声,双通道

    对于计算帧的大小,你需要每帧的MPEG音频数据的样本数。你可以使用下面的表来获取每帧的MPEG音频数据的样本数:下图是每一帧数据的采样数

    MPEG 1MPEG 2 (LSF)MPEG 2.5 (LSF
    Layer I384384
    Layer II11521152
    Layer III1152576

    帧大小的计算公式如下:
    帧大小 = ( 每帧采样次数 × 比特率(bit/s) ÷ 8 ÷采样率) + Padding

    由于舍入误差,官方公式计算帧的大小是一个有点不同。根据ISO标准,你需要以slot为单位计算帧大小,然后截断这个数字成为整数,之后与槽的大小相乘。你可以在CMPAHeader类中计算帧大小的正确方法。

    在实际项目开发中,对一帧的数据进行处理的时候,缓冲区里存放的数据大小需要比计算出的一帧大小要大一些,比如再多上8个字节。

    扩展模式用于加入信息,没有使用的立体声效果,从而减少所需的比特位数据。这些比特位数据是在联合立体模式下编码器动态确定的,每一帧的联合立体模式都可以改变,甚至打开或关上。对于其它的声道模式,扩展模式是无效的。

    MPEG音频文件的完整的频率范围被划分成多个子带。共有32个子带。对于Layer I、II,the two bits in the header determine the frequency range (bands)where the intensity stereo is applied。在这个频率范围内,只有一个通道被存储。所有其他的子带包含两个独立声道的信息。对于Layer III,这两个位决定使用哪一种类型的关节立体声(增强立体声和/或M / S立体声)。
    扩展模式

    CRC校验

    若保护位为0,则音频帧中会包含一个16位的CRC(循环冗余校验和)。这个校验和直接跟踪帧头和大字. 为了验证CRC,你必须计算音频帧的校验和,并与存储的CRC进行比较。若不等,则可能传输途中数据被损坏。检查CRC也有利于来验证你真的发现了一帧的开始位置,因为同步位在相同的情况下也发生在一个帧的数据中。

    CRC是采用计算的CRC - 16算法(生成器polynom 0x8005),也是一帧的一部分。下面的数据被认为是CRC:帧头的最后两个字节,和音频数据中一些紧接CRC字段的比特位。当计算CRC的时候,需要跳过校验和字段。不幸的是,在Layer II中没有简单的方法来计算出用于计算校验和的必要帧的数量。

    你需要帧头之外的其它信息来计算所需的比特位。但是,从帧头信息中可以计算出在Layer I和Layer III中保护比特位的数量。

    对于Layer III,在计算CRC的时候,你需要考虑完整的边信息。

    边信息紧接着帧头。它包含了一些解码器会用到的一些信息,用于解码器控制音频流的播放,但不包含实际的音频数据。下表显示了所有Layer III文件的边信息的大小。

    MPEG 1MPEG 2/2.5 (LSF)
    立体声,联合立体声,双通道32
    Mono17

    对于Layer I的文件,你必须考虑到扩展模式(见表2.1.6)。然后你可以以下公式计算出用于计算CRC的比特位的数量:

    4 * ( 声道数 * bound of intensity stereo + (32 - bound of intensity stereo) );

    这可以被读成两倍的立体声子带加上单子带的数量和结果乘以4。对于简单的mono帧,这等于128,因为通道的数目是1,而强度立体声的边界是32,这意味着没有强度立体声。对于立体帧,这是256。有关更多信息,请查看类CMPAFrame中的rc代码。

    CBR

    可以通过以下公式可以获取播放时长 (仅适用于恒定码率文件):

    播放时长 = ( 文件大小 – ID3大小 ) × 8 ÷ 比特率(bit/s)

    VBR头

    有些文件的编码是可变比特率模式(VBR)的。为了估计这些文件的时间,你必须知道整个文件的平均比特率。它常常与第一帧的码率相差很多,因为最低的比特率可用在音乐沉默时(尤其是在开始时)。要获得这个平均率,你必须通过所有的帧中的文件,并计算出每帧的比特率,相加的总和除以帧数。而这不是一个好的做法(很慢)。在第一帧的音频数据区中存在一个附加的VBR头。它包含了文件中的帧的总数,有了总帧数,我们可以用以下公式计算音频的播放时长:

    Duration = 总帧数 * 每帧采样数 / 采样率

    而且,VBR头往往会包含一个表,当在文件中寻找位置的时候会利用到这张表。

    因为这不是一个好的实践(非常慢),在firstframe(在框架标题之后)的数据部分中存在附加的VBR头。它们包含了文件中所有帧的总数,你可以用下面的公式来计算时间的持续时间:

    XING头

    大部分可变比特率编码的文件都会包含这个头。这个头位于第一个音频帧头之后的某个位置(后面会有具体介绍)。包含XING头的整个第一帧没有音频数据,因此,即使解码器不认识XING头,也可以解码该文件。

    在Layer III文件中,XING头紧接着边信息之后。因此,你可以通过使第一帧帧头起始地址加上帧头大小(4个字节),然后再加上边信息大小(参考表2.2.1),就可以得到XING头的位置。虽然Layer III有边信息,但是Layer I、II、III都不用考虑16比特位的CRC(如果有的话)。

    XING头起始位置 = MPEG第一帧帧头起始位置 + 帧头大小 + 边信息大小。

    帧头大小 = 4(或6,当Protection bit==0时,帧头后会有16bit=2byte的CRC)。

    为了读出这个头,你必须找到第一个MPEG音频帧头,然后去定位XING头的起始位置。XING头的格式如下:(请注意,位置是从零开始的。位置,长度和例子是以字节格式)下面表格是XING 头格式

    位置长度说明示例
    044个ASCII字符的VBR头ID,要么’ Xing ‘或’ Info ‘,而不是null终止“Xing”
    44标志显示当前字段的标志,与逻辑或逻辑相结合。字段是强制性的。
    0x00000001 - Frames field is present
    0x00000002 - Bytes field is present
    0x00000004 - TOC field is present
    0x00000008 - Quality indicator field is present
    0x0007(指帧、字节和TOC有效)
    84Number of Frames as Big-Endian DWORD (optional)7344
    8 or 124Number of Bytes in file as Big-Endian DWORD (optional)45000
    8, 12 or 16100100 TOC entries for seeking as integral BYTE (optional)
    8, 12, 16, 108, 112 or 1164Quality indicator as Big-Endian DWORDfrom 0 - best quality to 100 - worst quality (optional)0

    根据上面的格式说明,一个XING头必须至少包含ID字段和Flags字段,其余的字段是依靠与Flags字段的,并且是可选的。在一些情况下,CBR文件中也会包含这个头,在这种情况下,ID值一般用”Info”来标识

    这里存在关于XING头的LAME扩展,它是由公同的LAME编码器来使用的,但我并没有过多考虑这一点,因为它不是必需的计算播放时长的因素。这里是为信息标签的MP3文件链接

    VBRI 头

    据我所知,这个头只存在与用Fraunhofer编码器编码的MPEG音频文件中。它和XING头不同。你可以在第一帧音频帧头之后的32个字节偏移处准确地定位这个头。

    VBRI头起始位置 = MPEG第一帧帧头起始位置 + 帧头大小 + 32。

    帧头大小 = 4(或6,当Protection bit==0时,帧头后会有16bit=2byte的CRC)。

    请注意,位置是从零开始的。位置,长度和例子是字节格式表示。下面表格是:VBRI Header

    位置长度说明示例
    044个ASCII字符的VBR头ID,总是“VBRI”,而不是null终止‘VBRI’
    42版本号1
    62Delay as Big-Endian float7344
    82质量指标75
    104字节数作为大字节数45000
    144帧数作为大字的DWORD7344
    182在TOC表中作为big - endian单词的条目数100
    202Scale factor of TOC table entries as Big-Endian DWORD1
    222Size per table entry in bytes (max 4) as Big-Endian WORD2
    242Frames per table entry as Big-Endian WORD845
    26TOC entries for seeking as Big-Endian integral. From size per table entry and number of entries, you can calculate the length of this field.

    MP3的文件的内容组织结构

    所以,总结起来,一般的MP3文件所包含的内容如 下:

    [ID3。。。] ID3 V2的头,大多数最新的MP3,都有这个头
    [APE 头] 用于APE格式的头,现在也用于MPEG
    第一帧包 含:
    1. MPEG 音频头, 通常大小为4字节.(当Protection bit==0时,帧头后会有16bit=2byte的CRC,此时帧头大小为6字节)
    2. 边信息,9/17/32 字节
    [3.Xing 头] 8-120字节,如果是VBR,多数都有此Xing头,而且只有第一帧有
    。。。。。音频数据。。。。。
    第二帧(帧头,边信息,数据。。。)
    第三帧(帧头,边信息,数据。。。)
    。。。
    最后一帧(帧头,边信息,数据。。。)
    [TAG 。。。] 128字节的ID3 V1信息,如果没有前面的ID3 V2,多数都有这个ID3 V1的头

    注:[]号内的,表示,可选,即如果有的话。

    展开全文
  • MP3结构

    千次阅读 2012-05-30 10:53:01
    MP3帧包括以下4个部分: 1、头:比特流中包含同步和状态信息的部分。 2、错误校验:比特流中包含查错信息的部分。 3、音频信息:比特流中包含音频采样点信息的部分。 4、辅助数据:比特流中用于辅助数据的部分...


    原文地址:http://www.eefocus.com/jjbearustc/blog/07-09/3716_3e901.html

    MP3帧包括以下4个部分:

    1、帧头:比特流中包含同步和状态信息的部分。

    2、错误校验:比特流中包含查错信息的部分。

    3、音频信息:比特流中包含音频采样点信息的部分。

    4、辅助数据:比特流中用于辅助数据的部分。

    一、帧头结构帧中的头32位是头信息

    Sgncword:同步字位串“1111,1111,1111”用掉头信息的前12位。

    ID:用来显示算法标识的一位,1表示MPEG音频,0保留。

    Layer:用来表示所使用的层的两位,11表示第一层,10表示第二层,01表示第三层,00保留。如果要改变层,则要求解码器重新复位。

    Protection_bit:用于表示在音频比特流中是否有冗余来完成查错和隐藏的一位。1为有,0为没有。

    Bit_rate_index:比特率索引表示比特速率,全零值表示“任意方式”条件。为了提供最小的可能的延迟和复杂度,在第一、二层中解码器没有必要要求支持连续变化的。第三层通过转换bit_rate_index位支持可变比特率。

    Sampling_frequency:用来表示所使用的层的两位,00表示44.1kHz,01表示48kHz,10表示32kHz,11表示保留。

    Padding_bit:如果该位为1,那么在MP3的一帧中就可以含有一个额外的数据片来根据平均比特率来调整采样频率;在其他情况下该位置为0,并且该位在采样率44.1kHz下有效。

    Private_bit:该位是专用使用位,该位将来由ISO使用。

    Mode:在第三层中,加入立体声模式是增强立体声模式或是混合立体声模式。00表示立体声,01加入立体声模式(增强立体声模式或混合立体声模式),10表示双通道,11表示单通道。

    Mode extension表示是采用哪一种加入立体声的编码方法。通过下表可以决定如何使用增强立体声和混合立体声这两种模式。

     

    增强立体声

    混合立体声

    00

    不采用

    不采用

    01

    采用

    不采用

    10

    不采用

    采用

    11

    采用

    采用

                            

    Copyright:如果该位等于0那么在编码数据流中就没有版权限制。如果等于1,那么有版权保护。

    Riginal/home:如果该位等于0, 那么编码数据流是拷贝而来的,如果为1,那么编码数据流是原始的未经拷贝的。

    Emphasis:表示应当使用的不被强调的类型。

    二、错误校验部分crc_check

    是一个编码比特流中的用于任意错误检测的16位奇偶校验字。

     三、音频数据部分

    allocation[sb]:表示在子带sb中用来表示每个采样点的比特的个数。对单声道的子带或采用加入立体声模式的子带有效。

    scalefactor[sb]:表示用来与子带sb中的重量化采样点相乘的子带因子。其由六个比特组成一个无符号整数,作为在子带因子表中用来检索的一个索引。

    sample[sb][s]:在子带sb中的第s个采样点的编码表示,用于单声道模式和增强立体声模式中的子带采样点数据的表示。

    Main_data_end:主数据结束的值,用于决定一帧中主数据的最后一位在比特流中的位置。主结束值以下一帧的帧头为参考的,以字节为标量的负的偏移来指出最后一位在比特流主数据部分中的位置。

    Main_data_beg:可以给出一帧中的主数据部分起始端在比特流中的位置。这个位置等于前一帧的主数据结束位置加上一位[g1] ;主数据结束位置可以从前一帧的main_data_end中得到。

    Scfsi[scfsi band]:比例因子选择信息。提供了比例因子的数目的信息,这些比例因子要传送给子带sb及在这一帧中这些比例因子在哪一部分有效。第三层使用变化的scfsi_band给每组定标因子而不是每个定标因子提供scfsi的值。scfsi的值控制了在微粒中定标因子的使用:如果scfsi的值为0,定标因子是分别传送给每一个微粒;如果scfsi的值为1,传送给微粒1的定标因子对微粒2来说也是有效的。

    scfsi[scfsi_band][ch]:与scfsi[scfsi_band]作用一样,用于双声道模式、立体声模式和增强立体声模式中一个通道的比例因子选择信息。

    part2_3_length[gr]:这个值包含了主数据部分中用于表示定标因子和霍夫曼编码数据的比特的数目。因为边带信息的长度总是相同的,所以这个值可以用于计算出每个微粒主信息的起始端和辅助信息的位置。

    part2_length:该值包含了在主数据中用于定标因子的比特的数目。其值以下列方式给出:

    对于switch_point= 0,

    part2_length = 11 * slen1 + 10 * slen2 对于长窗(窗类型为0,1和3),和par2_length= 18 * slen1 + 18 * slen2,对于短窗(窗类型为2)

    对于switch_point = 1,

    part2_length = 17 * slen1 + 18 * slen2(窗类型为2)。对于长窗,part2_length在窗类型为0,1和3下的值和在switch_point= 0的值是一样的。

    big_values[gr]:每一个颗粒的频谱值是用不同的霍夫曼码表编码而成的。从零到奈奎斯特采样频率的整个频段范围可以划分为几个区域:每个区域用不同的霍夫曼码表编码。区域的划分是以最大的量化值作为依据的,这个依据在设想高频的值的幅度比较小或根本就不需要编码这个条件下成立的。从最高频率开始,队成对的量化值为0的值的数目进行记数,所得的数目用rzero表示。然后再将量化值中满足成两对的其绝对值不超过1的个数进行计数,其数目可以用count1表示。那么还有偶数个量化值留下来,最后留下来的值的频带范围会一直下延到零,在这一频段范围内的值就称为big_values。

    global_gain[gr]:量化阶大小信息是在边带信息中的global_gain变量传送的,并且该值是对数量化的。

    scale_compress[gr]:依据下表选择用于传送定标因子所需比特数目。如果窗类型为0、1或3:slen1:用于表示0到10子带的定标因子的长度;slen2:用于表示11到20子带的定标因子的长度。如果窗类型为2并且switch_point为0:slen1:用于表示0到5子带的定标因子的长度;slen2:用于表示6到11子带的定标因子的长度。如果窗类型为2并且switch_point为1:slen1:用于表示0到7子带的定标因子的长度(长窗定标因子子带)和从4到5的定标因子的长度(窗定标因子子带)。slen2:用于表示6到11子带的定标因子的长度。

    blocksplit_flag[gr]:用于表示一个数据块使用不止一个正常窗的标志。如果该标志被置为1,那么其他几个变量会按缺省值设置。region_addressl = 8(在窗类型为1或为3)region_addressl= 9(在窗类型为2)region_addressl = 0,在这种情况下区域2的长度为0。如果该标志没有置为1,那么窗类型为0。

    block_type[gr]:表示在第三层一帧中每个颗粒所用的窗的类型。类型0:保留;类型1:起始窗;类型2:3个短窗;类型3:结束窗。

    witch_point[gr]:表示长/短转换的分离点。

    cb_limit:对应长窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数21。

    cb_limit_short:对应短窗的定标因子子带的数目,对于第三层的所有模式和采样频率来说该值为一个常数12。

    table_select[region][gr]:依据最大量化值和信号本地的数据来采用不同的霍夫曼码表来进行编码,总共有32个霍夫曼码表。

    subblock_gain[window][gr]:表示源自全局增益的对应一个子窗的增益偏移,该值仅仅用于窗类型为短窗的情况下,在译码器子窗的值必须除以4的subblock_gain(window)的幂次加以修正。

    region_address1[gr]:是一个对频谱的进一步划分来提高霍夫曼编码器的性能,可以说是对由big_values所描述的区域详细划分,以获得一个比较好的错误控制和编码效率。可以划分为3个区域,每个区域根据其最大量化值和本地信号数据使用不同的霍夫曼码表进行编码。region_address[1,2]的值用于指向所划分的区域的边界,区域边界是以将频谱划分成关键子带来排列的。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数,如果switch_point为0,在一个微粒中的定标因子子带的数目为12 × 3=36;如果窗类型为2并且switch_point为1,定标因子子带的数目为8 + 9 × 3 = 35。region_address1统计一直到第一个区域最高频率边缘的定标因子子带的数目。

    region_address2[gr]:统计一直到第三个区域最高频率边缘的定标因子子带的局部或全部的数目。在窗类型为短窗的情况下,代表不同时间片的定标因子子带将分别计数。preglag[gr]:这是一个对量化值的额外高频的放大的一个简捷途径,如果该值置1,将有一个表中的值加入到定标因子中去。

    scalefac_scale[gr]:根据scale_scale使用2或根号2组为量化阶的容量定标因子进行对数量化。scalefac_scale为0量化阶为1.414;scalefac_scale为1量化阶为2。count1table_select[gr]:该标志用来选择在前面提到的count1区域所使用霍夫曼码表。

    scalefac[sb][gr]:定标因子用于对量化噪声染色,如果量化噪声用比较合适的形状进行染色,那么量化噪声就阿可以完全被屏蔽掉。在第三层中,定标因子在解码器中用于获得对应每个数据块的划分因子,跨越好几个频率谱线的这些数据块叫做定标因子子带,并且像关键子带一样尽可能紧的加以选择。

    haffman_code_bits:对于小于等于15的所有量化值可以用一个霍夫曼码直接编码,一般使用(x,y)来表示。如果量化值的幅度超过15,ESC码就用来标识这些值。如果一对数据不全为0,那么会有一或两位比特附加到霍夫曼码字上。

    四、辅助数据Ancillary_bit:辅助位由用户定义。


     [g1]为什么?

    展开全文
  • 音频大小计算

    千次阅读 2015-01-20 10:53:47
    首先我们计算一秒钟总的数据量,采样间隔采用20ms的话,说明每秒钟需采集50次,这个计算大家应该都懂,那么总的数据计算为 一秒钟总的数据量 =8000 * 2*16/8 = 32000 所以每音频数据大小 = 32000/50 = 640 每...
  • 音频大小的计算

    2020-10-28 17:15:16
    MP3大小1152个sample,采样率为44100Hz ,播放时长: mp3 dur=1152/44100 = 0.02608s=26.08ms pcm: 假设音频采样率 = 8000,采样通道 = 2,位深度 = 8,采样间隔 = 20ms 首先我们计算一秒钟总的数据量,采样...
  • mp3帧头分析

    2018-04-10 15:38:33
    1.介绍这篇文章的目的是讲解MPEG音频头的结构(包括XING和VBRI)。并能尽快和精确地计算一个MPEG文件的...2.MPEG音频一个MPEG音频文件是由很多帧数据组成。每一包含了一个头以及其后的音频数据。同一个文件...
  • Mp3文件由帧组成,帧分成标签帧和数据帧,本文就Mp3文件的帧进行分析。 一、标签帧 MP3帧头中除了存储一些象private、copyright、original的简单音乐说明信息以外,没有考虑存放歌名、作者、专辑名、年份 等...
  •  MP3文件按(frame)依次存储,解码时也是逐解码,所以我们应该首先弄清MP3帧内的数据的封装形式。的结构如下图所示:    图中sync表示同步字,每一以同步字开始;side info表示边信息;main_...
  • C语言解析MP3数据结构

    2019-12-04 23:59:23
    本章博客编写的初始原因:MP3一般有CBR和VBR两种格式,其中,正常的VBR会把总帧数记录在MP3数据帧的第一帧中,从而利用总帧数计算MP3的总时间。但是,偶尔会遇到一些mp3文件,它是VBR格式,却没有在第一个数据帧记录...
  • MP3文件如何计算总播放时间

    千次阅读 2013-07-14 15:50:36
    MP3文件是一种流媒体文件格式,所以没有文件头,也就是说没有关于文件的一些信息,文件的一开始就媒体数据。因此,要通过一定的计算方法来计算出一个MP3文件的总的播放时间。 MP3文件根据比特率是否变化可以分为VBR...
  • MP3数据结构

    2019-10-11 08:38:48
    MP3全称为MPEG Audio Layer 3,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为.mp3的文件,基本保持源文件的音质,MP3是ISO/MPEG标准的一部分,现已形成MPEG Layer1、Layer...
  • 首先我们计算一秒钟总的数据量,采样间隔采用20ms的话,说明每秒钟需采集50次,这个计算大家应该都懂,那么总的数据计算为 一秒钟总的数据量 =8000 * 2*16/8 = 32000 所以每音频数据大小 = 32000/50 = 640...
  • MP3帧头格式(CBR,VBR)

    千次阅读 2015-02-03 16:08:16
    1.介绍 这篇文章的目的是讲解MPEG音频头的结构(包括XING和VBRI)。并能尽快和精确地计算一个MPEG文件的播放时长。因此不会涉及到关于音频数据的编...一个MPEG音频文件是由很多帧数据组成。每一包含了一个头以
  • 除去头尾的ID3之外,剩下的就是音频数据,这部分数据由跟解码相关的信息及编码组成,整个数据区被分成一,每一的结构都包括四字节的头,跟着的可能是两字节的CRC,之后是边信息,边信息的长度跟版本和层级...
  • 采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。...例如:sample_rate = 44100HZ时, 计算出的时长为26.122ms,这就是经常听到的mp3播放时间固定为26ms的由来。
  • 最近做的项目中,MP3的解码用了JLayer解码器,在播放TTS语音的时候总是出现最后一个字播一半,另一半被吞掉的问题,而对于相同的云端下发的TTS,iOS版本的App却没有这个问题,所以自然要去对比一下解码前-解码后的...
  • 关于MP3文件播放时间的计算

    千次阅读 2008-08-22 09:03:00
    小琢磨了一下mp3的格式,因为很想计算出其文件播放时长 根据RFC文档上的说法,只要知道文件的长度,播放的比特率(bitRate),采样率(Simpling Frequency Rate)以及 填充位数(Padding bits),以及“恒定每26ms能...
  • MP3帧头格式(CBR,VBR), 附源码

    千次阅读 2012-12-14 10:40:53
    1.介绍 这篇文章的目的是讲解MPEG音频头的结构(包括XING和VBRI)。并能尽快和精确地计算一个MPEG文件的播放时长。因此不会涉及到关于音频数据的编...一个MPEG音频文件是由很多帧数据组成。每一包含了一个头以
  • 4.3.1. 常见MPEG的音频数据大小是418字节 14 5. MP3的播放时间的计算公式及XING和VBRI头介绍 16 6. 计算CBR和VBR的MP3文件的播放时间的步骤 24 7. MP3相关的一些知识点的解释 27 7.1. MP3的文件的内容组织结构 27 ...
  • ffmpeg 计算有多少个样本

    千次阅读 2018-11-23 20:46:03
      FFmpeg中相关数据格式 AVPacket: 存储解码前数据(编码数据:H264/AAC等...AVFrame: 存储解码后数据(像素数据:YUV/RGB/PCM等)存储原始数据(即非压缩数据,视频:YUV,RGB;音频:PCM) typedef struct AVFrame ...
  • 音频码流(冗余数据占的比例): 先简单讲一下对于ADTS header的结构的理解:  1)ADTS header位于每一个aac的开头,长度一般是7字节(也可以是9字节的,没见过)。  2)每个aac的长度固定为1024个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,600
精华内容 3,440
关键字:

mp3数据帧计算