最近在传输手机录音时,遇到了AMR编码的问题,开始以为可以任意截断amr文件,加个文件头就可以播放的,后来发现是有问题,这样得到的amr音频有些不能正常播放,后来参看amr格式后,才知道amr文件是一帧一帧的,如果是按照完整的帧前面添加文件头,就没问题了,下面是参考的一篇文章: 原文地址:http://blog.csdn.net/dinggo/archive/2007/12/25/1966444.aspx 目录
1.
2.
3.
4.
5.
6.
7.
1.
现在很多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式。 AMR,全称是:Adaptive Multi-Rate,自适应多速率,是一种音频编码文件格式,专用于有效地压缩语音频率。 AMR音频主要用于移动设备的音频压缩,压缩比非常高,但是音质比较差,主要用于语音类的音频压缩,不适合对音质要求较高的音乐类音频的压缩。 下面是两个AMR示范文件,一个是新闻类,一个是歌曲,可以听出来,音乐类压缩成AMR格式后,音质大大降低。
2.
AMR有多种编码方式,每种编码方式的采样频率不同:
说明:
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文件头标志是6个字节。(最后一个字节是换行符“\n”) 后面就紧跟的是音频帧。这个文件是每帧32字节。
4.
AMR语音帧格式为帧头和语音数据组成。
AMR语音帧头占1个字节,如下图所示:
其中: P = 0; FT:Frame Type,对应不同编码模式。(参见“2. AMR编码方式”中表格中的说明) Q:帧质量指示器,0:表示为坏帧。 后面的P补0。
5.
下图是一个出现异常帧的示例:(zbc1217.amr)
从上图可以看见,本amr音频帧头都是0x3C,但是在0x000091e6处,帧头字节为0x44。与0x3C不一致。而在0x00009243处,才恢复到0x3C。 对异常帧的简单处理办法是,遇到异常帧就跳过异常帧。后面的读帧算法有描述。
6.
因为可能存在异常帧,所以不一定所有的语音帧大小一致,对于跟正常帧大小不一致的,或者帧头跟正常帧头不一致的,就不交给解码器,直接抛弃该坏帧。
读取帧的算法,用C语言来编写,readAMRFrame.c,JAVA可以用类似的方法。 下面是算法描述流程图。
7.
l http://www./rfc/rfc3267.txt http://ietfreport./rfc/PDF/rfc3267.pdf
l http://www./ftp/Specs/html-info/26104-CRs.htm
l http://www./ftp/Specs/html-info/26104.htm
l http://blog.csdn.net/windcao/archive/2006/01/04/570348.aspx
l http://www./blog/user1/11409/archives/2006/16832.html
l |
|