多媒体文件格式解析之MP3
音频文件格式MP3
1. MP3是什么?
MP3是MPEG-1 Audio Layer 3的缩写,是当今较流行的一种数字音频编码和有损压缩格式,它设计用来大幅度地降低音频数据量,而对于大多数用户的听觉感受来说,重放的音质与最初的不压缩音频相比没有明显的下降。它是在1991年发明和标准化的。
MP3支持多种码率:32、40、48、56、64、80、96、112、128、160、192、224、256、320 kbit/s。目前128kbit/s是最常用的码率。
因为MP3是一种有损压缩格式,它提供了多种不同“比特率”(bit rate)的选项—也就是用来表示每秒音频所需的编码数据位数。典型的速度介于128kbps和320kbps(kbit/s)之间。与此对照的是,CD上未经压缩的音频比特率是1411.2 kbps(16 位/采样点 × 44100 采样点/秒 × 2 通道)。
Fraunhofer Gesellschaft(FhG)在他们的官方网站上,公布了下面的MPEG-1 Layer 1/2/3的压缩率和数据速率用于比较:
- Layer 1: 384 kbit/s,压缩率 4:1
- Layer 2: 192 - 256 kbit/s,压缩率 8:1-6:1
- Layer 3: 112 - 128 kbit/s,压缩率 12:1-10:1
不同层面之间的差别是因为它们使用了不同的心理声学模型导致的。
2. MP3文件的构成
典型的MP3文件包含:ID3v2(TAG)、Frame、ID3v1(TAG)
除了Frame其他部分都是可选的。
各部分功能如下:
- ID3v2 在文件开始的位置,包含了作者、作曲、专辑等信息,长度不固定,扩展了ID3v1 的信息量,可以存储歌词,该专辑的图片等大容量的信息。
- 一系列的音频数据的帧,在文件的中间位置,个数由文件大小和帧长决定。
每个帧的长度可能不固定,也可能固定,由位率bitrate决定。
每个帧又分为帧头和数据实体两部分。
帧头记录了mp3 的位率、采样率、版本等信息,每个帧之间相互独立。 - ID3v1在文件结尾的位置,包含了作者、作曲、专辑等信息,长度为128Byte。
MP3文件构成按照下面结构顺序存储:
mp3_file
{
// if existed
ID3v2_Tag
// at least one audio_frame decided by file size
for (;!file_eof;)
audio_frame
// if existed
ID3v1_Tag
}
之所以在MP3文件格式中添加ID3 Tag信息主要是因为原始的MP3音频帧格式不支持存储任何附加信息,为了提供针对MP3的描述信息,分别引入了ID3v1标准(1996年)、ID3v2标准(1998年)。ID3v1是一组附加在MP3文件后面的数据,位于文件结尾,它的长度是固定的128字节,该字段以"TAG"字符串作为开头。ID3v2位于MP3文件开头,并以帧的形式存储多个音频元数据,该字段必须以"ID3"作为开头,长度不定。
关于这两个字段的介绍建议参考ID3。
音频帧的构成
音频帧包含两部分:帧头和帧数据。
这里需要说明下,每个音频帧都是可以单独解码的。每一帧都包含完整的可解码信息,实际文件中可能变更编码信息。
音频帧头
音频帧头长度固定为4 Byte(32位),前12 bit固定是同步字节,其值为0xFFF。
对于固定位率的MP3文件,所有帧的帧头格式一样其数据结构如下:
typedef FrameHeader {
unsigned int sync: 11; //同步信息
unsigned int version: 2; //版本
unsigned int layer: 2; //层
unsigned int protection_bit: 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;
若protection_bit为1,则还要帧头最后添加16 bit的校验位。也可以参考下表:
Bits Meaning Value Note
1-12 Sync word 111111111111
13 Version 1 1 = MPEG-1
14-15 Layer 01 01 = Layer 3
16 protection_bit 1 1 = No
17-20 Bit rate 1000 1000 = 128 kbps
21-22 Frequency 00 00 = 44100 Hz
23 Pad bit 0 0 = Frame is no padded
24 Priv. bit 0 Unkown
25-26 Mode 01 Joint stereo
27-28 Mode extension 00 00 = Intensity and MS off
29 Copyright 0 0 = Not copyrighted
30 Original 0 0 = Not original
31-32 Emphasis 00 00 = None
一个音频帧的长度可以通过下面方式计算:
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
也可以直接使用同步字节切分比特流。
音频帧数据
目前比较多的MP3文件都是采用固定码率的编码(CBR)方式,其帧长度是固定的。也有一种VBR的格式,建议参考MP3文件格式简介。
参考资料
- ISO 11172-3 MPEG Audio specification
- ISO 13818_CHS_MPEG-2标准
- https://zh.wikipedia.org/wiki/ID3
- http://baike.baidu.com/link?url=w03WYIssuVFLjrhjztMlWqxkQW5Lt-4k4sEd7HcpJhSqy1VLR1HUQKaXxB4ZHa_qLOvdYy56kAX-WwLmNh8ola
- http://www.cnblogs.com/watertao/archive/2011/11/08/2241774.html
- http://blog.csdn.net/fulinwsuafcie/article/details/8972346#t13
多媒体文件格式解析之MP3的更多相关文章
- 多媒体文件格式分析 MP3文件结构及编解码流程
多媒体文件格式分析 http://blog.csdn.net/taniya001/article/details/7962864 多媒体文件格式分析 MP3文件结构及编解码流程 http://www. ...
- 多媒体文件格式(一):MP4 格式
在互联网常见的格式中,跨平台最好的应该就属MP4文件了.因为MP4文件既可以在PC平台的Flashplayer中播放,又可以在移动平台的Android.iOS等平台中进行播放,而且使用系统默认的播放器 ...
- 多媒体文件格式之MP4
[时间:2016-06] [状态:Open] 学习多媒体容器格式的目的 主要是为了回答以下问题: 该容器中数据是如何组织的? 该容器包含哪些编码格式的数据?这些数据是如何存储的? 该容器包含哪些元数据 ...
- mp4文件格式解析(转载)
mp4文件格式解析 原作:http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的 ...
- ArcGIS三大文件格式解析
原文:ArcGIS三大文件格式解析 Shape数据 Shapefile是ArcView GIS 3.x的原生数据格式,属于简单要素类,用点.线.多边形存储要素的形状,却不能存储拓扑关系,具有简单.快速 ...
- Android init.rc文件格式解析
/***************************************************************************** * Android init.rc文件格式 ...
- C++PE文件格式解析类(轻松制作自己的PE文件解析器)
PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣 ...
- 解析prototxt文件的python库 prototxt-parser(使用parsy自定义文件格式解析)
解析prototxt文件的python库 prototxt-parser https://github.com/yogin16/prototxt_parser https://test.pypi.or ...
- mp4文件格式解析(转)
mp4文件格式解析 MP4文件格式带数据详解 MP4文件格式的解析,以及MP4文件的分割算法
随机推荐
- Mac系统清理、占用空间大、空间不够、查看系统文件大小分布
背景: 最近老提示空间不够,很尴尬,一直弹系统提示 如图,256的空间,就剩下几个G了,其中最大头的系统占用:160G,占比60%多 正常情况下:我们可以点击管理,进入到系统磁盘优化界面: 这种适用于 ...
- wordpress搭建博客上传begin主题The themes is locked to another domain
如题, 在使用wordpress搭建个人博客过程中, 上传begin主题, 出现如下弹框的错误, 而且样式有误. 环境: Los Angeles CentOS 7 x64 nginx+mysql 解决 ...
- [转]2016年linux运维人员必会开源运维工具体系
linux运维人员必会开源运维工具体系 说明:不同的技术人员,不同的阶段确定知识边界非常重要,否则,就像马拉车,不知道终点在哪,累死也达不到目标.例如拿8K要学多少,拿15K要学多少.一个新手也许只想 ...
- 利用图片中的exif元数据批量查找图片中所包含的GPS信息
在图片的exif(交换图像文件格式)中标准定义了如何存储图像和音频文件的标准,而在这些标签中往往存在了一些容易被人们忽视却又重要的东西. 有一款工具名为exiftool,可以快速的解析所有标签,并将结 ...
- 树莓派进阶之路 (015) - 树莓派使用DS18B20模块测量温度
参考:http://shumeipai.nxez.com/2013/10/03/raspberry-pi-temperature-sensor-monitors.html 第一步,允许单总线接口 su ...
- 为什么 c = tf.matmul(a, b) 不立即执行矩阵乘法?
在 TensorFlow Python API 中,a.b 和 c 是 tf.Tensor 对象.Tensor 对象是指令结果的符号句柄,但它实际上并不存放指令的输出值.相反,TensorFlow ...
- Fragment使用具体解释
fragment是Google在3.0版本号中推出的新功能,如今已经增加到V4包中,假设要使用V4兼容包中的Fragment须要将Activity换成FragmentActivity,调用的getSu ...
- 你永远学不会的设计-->百度地图map api key 的设置
哈哈 说到咱的互联网大佬 baidu, 真是无人不知,无人不晓,可是多少人能领会他的设计哲学呢? 来看看吧.... 事情要从上周的一个小实验说起,目标是调用baidu map api 做个产品原型. ...
- 另辟蹊径 直取通州的“墨迹天气”APP应用的成功故事
一个天气应用,曾被认为是要挑战国家气象局,网站也莫名其妙地被封,两个合伙人先后离开.创始人金犁是如何把这么一款工具类应用做到人所共知的? 采访 | 郑江波 翟文婷 文 | 翟文婷 出生时间:1982年 ...
- 解决ssh连接慢(有时候等半分钟才出现密码输入提示)的方法
经常通过ssh 或者 scp 连接一堆远程主机,同样是 Linux 主机,其中一些创建 ssh 连接速度特别慢,连接建立之后执行操作速度却很正常,看来应该不是网络原因.解决的方法是通过ssh 的-v参 ...