好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

MP3格式-写数据到MP3数据帧.docx

15页
  • 卖家[上传人]:鑫**
  • 文档编号:256368947
  • 上传时间:2022-02-19
  • 文档格式:DOCX
  • 文档大小:38.93KB
  • / 15 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • MP3格式-写数据到MP3数据帧 MP3格式音频文件构造解析 一、概述Layer-3 音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG音频文件是MPEG1 标准中的声音局部,也叫MPEG 音频层,它依据压缩质量和编码困难程度划分为三层,即Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件,并依据不同的用途,运用不同层次的编码MPEG 音频编码的层次越高,编码器越困难,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和6:1-8:1,而MP3 的压缩率那么高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩须要10MB的存储空间,而经过MP3 压缩编码后只有1MB 左右不过MP3 对音频信号采纳的是有损压缩方式,为了降低声音失真度,MP3采纳了“感官编码技术”,即编码时先对音频文件进展频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最终形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够到达比拟接近原音源的声音效果。

      二、整个MP3 文件构造:MP3 文件大体分为三局部:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)a). ID3V2 在文件起先的位置,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量b). 一系列的音频数据的帧,在文件的中间位置,个数由文件大小和帧长确定; 每个帧的长度可能不固定,也可能固定,由位率bitrate确定 每个帧又分为帧头和数据实体两局部帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立 c). ID3V1在文件结尾的位置,包含了作者,作曲,专辑等信息,长度为128Byte ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量 Frame 一系列的帧,个数由文件大小和帧长确定 . 每个FRAME的长度可能不固定,也可能固定,由位率bitrate确定 . 每个FRAME又分为帧头和数据实体两局部 . 帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立 Frame ID3V1 包含了作者,作曲,专辑等信息,长度为128BYTE 表格2.1 1、ID3V2 ID3V2 到此时此刻一共有4 个版本,但流行的播放软件一般只支持第3 版, 既ID3v2.3。

      由于ID3V1 记录在MP3 文件的末尾,ID3V2就只好记录在MP3 文件的首部了(假如有一天发布ID3V3,真不知道该记录在哪里)也正是由于这个缘由,对ID3V2 的操作比ID3V1 要慢而且ID3V2 构造比ID3V1 的构造要困难得多,但比前者全面且可以伸缩和扩展 下面就介绍一下ID3V2.3: 每个ID3V2.3 的标签都一个标签头和假设干个标签帧或一个扩展标签头组成关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧标签头和标签帧一起依次存放在MP3 文件的首部 1、标签头 在文件的首部依次记录10个字节的ID3V2.3 的头部数据构造如下: char Header[3]; /*必需为\否那么认为标签不存在*/ char Ver; /*版本号ID3V2.3 就记录3*/ char Revision; /*副版本号此版本记录为0*/ char Flag; /*存放标记的字节,这个版本只定义了三位,稍后具体讲解*/ char Size[4]; /*标签大小,包括标签头的10个字节和全部的标签帧的大小*/ 第5个字节:副版本号,为0 1〕标记字节 标记字节一般为0,定义如下: abc00000a -- 表示是否运用Unsynchronisation(这个单词不知道是什么意思,字典里也没有找到,一般不设置)b -- 表示是否有扩展头部,一般没有(至少Winamp 没有记录),所以一般也不设置 c -- 表示是否为测试标签(101.101%的标签都不是测试用的啦,所以一般也不设置) 第6个字节:存放标记的字节,只定义了三位,这里值为02〕标签大小一共四个字节,但每个字节只用7位,最高位不运用恒为0。

      所以格式如下 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx计算大小时要将0 去掉,得到一个28 位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如下:total_size = (Size[0]&0x7F)*0x200000+ (Size[1]&0x7F)*0x4000 + (Size[2]&0x7F)*0x80 +(Size[3]&0x7F)留意:这里的帧大小,并不包含帧头的10个字节,只表示帧内容的大小.这里0X4000,许多写的是0x400是错的.2、标签帧每个标签帧都有一个10个字节的帧头和至少一个字节的不固定长度的内容组成它们也是依次存放在文件中,和标签头和其他的标签帧也没有特别的字符分隔得到一个完整的帧的内容只有从帧头中的到内容大小后才能读出,读取时要留意大小,不要将其他帧的内容或帧头读入 帧头的定义如下:char ID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识参照表*/ char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/char Flags[2]; /*存放标记,只定义了6 位*/1〕帧标识用四个字符标识一个帧,说明一个帧的内容含义,常用的参照如下: TIT2=标题表示内容为这首歌的标题,下同 TPE1=作者 TALB=专集TRCK=音轨格式:N/M 其中N 为专集中的第N 首,M为专集中共M 首,N和M 为ASCII 码表示的数字TYER=年头是用ASCII 码表示的数字 TCON=类型干脆用字符串表示COMM=备注格式:\备注内容\,其中eng 表示备注所运用的自然语言2〕大小这个可没有标签头的算法那么麻烦,每个字节的8 位全用,格式如下 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 算法如下:int FSize = Size[0]*0x101000000 + Size[1]*0x10100+ Size[2]*0x101 + Size[3]; 留意:这里的帧大小,并不包含帧头的10个字节,只表示帧内容的大小3〕标记只定义了6 位,另外的10 位为0,但大局部的状况下16 位都为0 就可以了。

      格式如下:abc00000ijk00000a -- 标签爱护标记,设置时认为此帧作废 b -- 文件爱护标记,设置时认为此帧作废c -- 只读标记,设置时认为此帧不能修改(但我没有找到一个软件理睬这个标记) i -- 压缩标记,设置时一个字节存放两个BCD 码表示数字 j -- 加密标记(没有见过哪个MP3 文件的标签用了加密) k -- 组标记,设置时说明此帧和其他的某帧是一组值得一提的是winamp 在保存和读取帧内容的时候会在内容前面加个''\\0'',并把这个字节计算在帧内容的大小中2、音频数据帧每个帧都有一个帧头Header,长度是4Byte〔32bit〕,帧头后面可能有两个字节的CRC 校验值,这两个字节的是否存在确定于Header 信息的第16bit,为0 那么帧头后面无校验,为1 那么有校验,校验值长度为2 个字节,紧跟在Header 后面,接着就是帧的实体数据了,格式如下:1、 帧头格式帧头长4字节,对于固定位率的MP3文件,全部帧的帧头格式一样其数据构造如下(注:此构造要自己定义): typedef struct frameHeader {unsigned int sync1:8; //同步信息1 unsigned int error_protection:1; //CRC校验 unsigned int layer:2; //层 unsigned int version:2; //版本unsigned int sync2:3; //同步信息2 unsigned int extension:1; //版权 unsigned int padding:1; //填充空白字 unsigned int sample_rate_index:2; //采样率索引 unsigned int bit_rate_index:4; //位率索引 unsigned int emphasis:2; //强调方式 unsigned int original:1; //原始媒体 unsigned int copyright:1; //版权标记unsigned int mode_extension:2; //扩展模式,仅用于联合立体声unsigned int channel_mode:2; //声道模式 }FHEADER, *LPHEADER; 1〕计算帧长度 我们首先区分两个术语:帧大小和帧长度。

      帧大小即每帧采样数表示一帧中采样的个数,这是恒定值其值如下表所示 Layer 1 Layer 2 Layer 3 MPEG 1 MPEG 2(LSF) MPEG 2.5(LSF) 384 384 384 1152 1152 1152 1152 576 576 帧长度是压缩时每一帧的长度,包括帧头它将填充的空位也计算在内LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节当读取MPEG文件时必需计算该值以便找到相邻的帧留意:因为有填充和比特率变换,帧长度可能改变 从头中读取比特率,采样频率和填充的值后可以进展计算, LyaerI运用公式: 帧长度〔字节〕 = (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充 * 4 LyerII和LyaerIII运用公式: 帧长度〔字节〕= (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充 例:LayerIII 比特率 128000,采样频率 44101,填充0 =〉帧大小 417字节; 如图 2.3中,比特率为128K,采样率为44.1K,填充0,那么其帧长度为: (1152 / 8 * 128K)/44.1K = 417 (字节) 2〕每帧的持续时间 每帧的持续时间可以通过计算获得,下面给出计算公式 每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1010 如图 2.3中,其每帧时间为:1152 / 44.1K * 1010 = 26.12 (约等于26ms)假如是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应当通过计算来获的。

      3〕CRC校验假如帧头的校验位为0,那么帧头后就有一个16位的CRC值,这个值是big-endian的值,把这个值和该帧通过计算得出的CRC值进展比拟就可以得知该帧是否有效 4〕帧数据在帧头后边是Side Info(姑且称之为通道信息)对标准的立体声MP3文件来说其长度为32字节通道信息后面是Scale factor(增益因子)信息当解码器在读到上述信息后,就可以进展解码了图 2.3中地址为0x880到0x89F(含),此处数据全为0对于mp3来说此时此刻有两种编码方式,一种是C。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.