文章标题
2015-07-07 18:14
225 查看
MP3文件格式学习
概述
MP3 文件是由帧(frame)构成的,帧是 MP3 文件最小的组成单位。MP3 的全称应为MPEG1 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),Frame, TAG_V1(ID3V1)ID3V2
包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量
Frame
.
.
.
Frame
一系列的帧,个数由文件大小和帧长决定
每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定
每个FRAME又分为帧头和数据实体两部分
帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立
ID3V1
包含了作者,作曲,专辑等信息,长度为128BYTE。
帧格式
1.帧头格式
帧头长4字节,对于固定位率的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;
MP3帧长取决于位率和频率,计算公式为:
mpeg1.0
layer1:帧长= (48000*bitrate)/sampling_freq + padding
layer2&3:帧长= (144000*bitrate)/sampling_freq + padding
mpeg2.0
layer1:帧长= (24000*bitrate)/sampling_freq + padding
layer2&3:帧长= (72000*bitrate)/sampling_freq + padding
例如
位率为64kbps,采样频率为44.1kHz,padding(帧长调节)为1时,帧长为210字节。帧头后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。
相关文章推荐
- 红黑树
- Android-Universal-Image-Loader 图片异步加载类库的使用
- [leetcode]Basic Calculator(java)
- Android View绘制流程
- 响应式web设计读书笔记
- [SoapUI] SoapUI+Groovy中"org.apache.xmlbeans.XmlException: error:
- VS2008 32+win7 64+mysqlServer 64+mysql-connector-c-6.1.6-win32
- Masonry介绍与使用实践:快速上手Autolayout
- 策略模式(strategy)
- 第一个自定义HTML网页
- CentOS 安装jdk1.7 32位
- Spring
- Maven 修改本地存储库位置
- ListView适配器之增强版BaseAdapter
- 子网掩码详解
- 兔子c++
- 定做景德镇陶瓷杯应该注意那些细节。
- Android第四十二期 - 关于微信手势退出Activity的操作
- Android第四十二期 - 关于微信手势退出Activity的操作
- 怎么查看linux服务器有cpu