AMR文件结构

转自:http://blog.csdn.net/dinggo/article/details/1966444

https://blog.csdn.net/wlsfling/article/details/5875928

 

目录

1.    概述

2.    AMR编码方式

3.    AMR文件结构示范图

4.    AMR帧头格式分析

5.    异常帧分析

6.    AMR帧读取算法

7.    参考资料

1.      概述

现在很多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式。

 

AMR,全称是:Adaptive Multi-Rate,自适应多速率,是一种音频编码文件格式,专用于有效地压缩语音频率。

 

AMR音频主要用于移动设备的音频压缩,压缩比非常高,但是音质比较差,主要用于语音类的音频压缩,不适合对音质要求较高的音乐类音频的压缩。

 

下面是两个AMR示范文件,一个是新闻类,一个是歌曲,可以听出来,音乐类压缩成AMR格式后,音质大大降低。

编号

文件名

文件长度

时长

1

h.amr              (歌曲)

409KB

04:21

2

zbc1217.amr

242KB

02:36

 

 

 

 

 

 

 

2.        AMR编码方式

AMR有多种编码方式,每种编码方式的采样频率不同:

 

 

规格

比特率(kbps)

音频帧大小(字节)

帧头(1个字节)

FT

0

AMR 4.75

 

13

04 00000100

0000

1

AMR 5.15

 

14

0C 00001100

0001

2

AMR 5.9

 

16

14 00010100

0010

3

AMR 6.7

 

18

1C 00011100

0011

4

AMR 7.4

 

20

24 00100100

0100

5

AMR 7.95

 

21

2C 00101100

0101

6

AMR 10.2

 

27

34 00110100

0110

7

AMR 12.2

 

32

3C 00111100

0111

 

说明:

04 的二进制:00000100

0C 的二进制:00001100

 

说明:

l         比特率是指将数字声音由模拟格式转化成数字格式的采样率,采样率越高,还原后的音质就越好。

 

l         比特率值与现实音频对照:

16kbps=电话音质

24kbps=增加电话音质、短波广播、长波广播、欧洲制式中波广播

40kbps=美国制式中波广播

56kbps=话音

64kbps=增加话音(手机铃声最佳比特率设定值、手机单声道MP3播放器最佳设定值)

112kbps=FM调频立体声广播

128kbps=磁带(手机立体声MP3播放器最佳设定值、低档MP3播放器最佳设定值)

160kbps=HIFI高保真(中高档MP3播放器最佳设定值)

192kbps=CD(高档MP3播放器最佳设定值)

256kbps=Studio音乐工作室(音乐发烧友适用)

 

l         音频数据帧大小的计算:

amr 一帧对应20ms,那么一秒有50帧的音频数据。由于比特率不同,每帧的数据大小也不同。

如果比特率是12.2kbs,那么每秒采样的音频数据位数为:

12200 / 50 = 244bit = 30.5byte,取整为31字节。

取整要四舍五入。

再加上一个字节的帧头,这样数据帧的大小为32字节。

3.      AMR文件结构示范图

下面是一个AMR文件示范:

 

从图中可以看出,所有AMR文件头标志是6个字节。(最后一个字节是换行符“/n”)

后面就紧跟的是音频帧。这个文件是每帧32字节。

 

文件头

语音帧 1

语音帧 2

 

 

4.      AMR帧格式分析

 

AMR语音帧格式为帧头和语音数据组成。

帧头

语音数据

 

 

 

 

AMR语音帧头占1个字节,如下图所示:

 

0

1

2

3

4

5

6

7

P

FT

Q

P

P

0

 

 

 

 

0

0

0

 

 

其中:

P = 0;

FT:Frame Type,对应不同编码模式。(参见“2. AMR编码方式”中表格中的说明),

用法:在解析了音频帧的FT数据之后,就可以根据 “”AMR编码方式表格“”来确定这个音频文件的比特率。

Q:帧质量指示器,0:表示为坏帧。

后面的P补0。

5.      异常帧分析

下图是一个出现异常帧的示例:(zbc1217.amr)

 

 

从上图可以看见,本amr音频帧头都是0x3C,但是在0x000091e6处,帧头字节为0x44。与0x3C不一致。而在0x00009243处,才恢复到0x3C。

 

对异常帧的简单处理办法是,遇到异常帧就跳过异常帧。后面的读帧算法有描述。

 

6.      AMR帧读取算法

因为可能存在异常帧,所以不一定所有的语音帧大小一致,对于跟正常帧大小不一致的,或者帧头跟正常帧头不一致的,就不交给解码器,直接抛弃该坏帧。

 

读取帧的算法,用C语言来编写,readAMRFrame.c,JAVA可以用类似的方法。

下面是算法描述流程图。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

后记

采样率,比特率,文件格式的说明:

 

通俗的讲采样频率是指计算机每秒钟采集多少个信号样本。它用赫兹(Hz)来表示。

以上文中提到数据为例:

amr 一帧对应20ms,这个数值跟采样率的关系:

1s=1000ms

20ms = 1000ms/50

采样率为50hz

 

比特率:

音频文件专用算法:【比特率】(kbps)=【量化采样点】(kHz)×【位深】(bit/采样点)×【声道数量】(一般为2)

 

比特率】(kbps) = 采样率值×采样大小值×声道数 bps

 

以电话为例,每秒3000次取样,每次取样是7比特(bit),那么电话的比特率是21000。

 

反过来,知道了比特率跟采样率,可以知道每次采样的数据是多少bit,

12200 / 50 = 244bit = 30.5byte,取整为31字节。取整要四舍五入。

(为什么要四舍五入呢?猜测是因为在写入文件的时候是按照 8 bits = 1 byte 来对齐的)

 

 

https://zhidao.baidu.com/question/1539029237582451067.html

如果把原始16位深调到32位,那么精度增大。就像一座1000米的山,原来有10级台阶,现在修成100级台阶,但高度没变还是1000米。此外16位到32位也不是增加一倍,而是2的32-16=16次幂即65536倍。

 

量化精度:

    声波在转为数字的过程中不是只有采样率会影响原始声音的完整性,另一个亦具有举足轻重的参数——量化精度,也是相当的重要。一般来说,音质分辨率就是大家常说的bit数。目前,绝大多数的声卡都已经可以支持24bit的量化精度。

 那么,什么是量化精度呢?前面曾说明采样频率,它是针对每秒钟所采样的数量,而量化精度则是对于声波的“振幅”进行切割,形成类似阶梯的度量单位。所以,如果说采样频率是对声波水平进行的X轴切割,那么量化精度则是对Y轴的切割,

切割的数量是以最大振幅切成2的n次方计算,n就是bit数。

    举个例子,如果是8bit,那么在振幅方面的采样就有256阶,若是16bit,则振幅的计量单位便会成为65536阶,越多的阶数就越能精确描述每个采样的振幅高度。如此,也就越接近原始声波的“能量”,在还原的过程序也就越接近原始的声音了。

【转贴扫盲】位深度、采样率以及码率:

http://blog.renren.com/share/233588808/4959169016/0

原文地址:https://www.cnblogs.com/zhangxuan/p/8492905.html