amr文件格式分析【转http://blog.csdn.net/dinggo/article/details/1966444】
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) |
音频帧大小(字节) |
帧头(字节) |
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 |
说明:
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编码方式”中表格中的说明)
Q:帧质量指示器,0:表示为坏帧。
后面的P补0。
5. 异常帧分析
下图是一个出现异常帧的示例:(zbc1217.amr)
从上图可以看见,本amr音频帧头都是0x3C,但是在0x000091e6处,帧头字节为0x44。与0x3C不一致。而在0x00009243处,才恢复到0x3C。
对异常帧的简单处理办法是,遇到异常帧就跳过异常帧。后面的读帧算法有描述。
6. AMR帧读取算法
因为可能存在异常帧,所以不一定所有的语音帧大小一致,对于跟正常帧大小不一致的,或者帧头跟正常帧头不一致的,就不交给解码器,直接抛弃该坏帧。
读取帧的算法,用C语言来编写,readAMRFrame.c,JAVA可以用类似的方法。
下面是算法描述流程图。
7. 参考资料
l rfc3267
http://www.rfc-editor.org/rfc/rfc3267.txt
http://ietfreport.isoc.org/rfc/PDF/rfc3267.pdf
l 3GPP TS 26.104 V 6.1.0 (2004-03)
http://www.3gpp.org/ftp/Specs/html-info/26104-CRs.htm
l 3GPP AMR Floating-point Speech Codec
http://www.3gpp.org/ftp/Specs/html-info/26104.htm
l “amr编程汇总”
http://blog.csdn.net/windcao/archive/2006/01/04/570348.aspx
l 关于AMR文件格式的解释
http://www.mcublog.com/blog/user1/11409/archives/2006/16832.html
l
转载于:https://www.cnblogs.com/songtzu/archive/2013/03/15/2961519.html
amr文件格式分析【转http://blog.csdn.net/dinggo/article/details/1966444】相关推荐
- Mysql分析-profile详解(转http://blog.csdn.net/ty_hf/article/details/54895026)
一.前言 当我们要对某一条sql的性能进行分析时,可以使用它. Profiling是从 mysql5.0.3版本以后才开放的. 启动profile之后,所有 查询包括错误的语句都会记录在内. 关闭会话 ...
- 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)
权限设计(转:http://blog.csdn.net/chexlong/article/details/37697555) 1. 前言: 权限管理往往是一个极其复杂的问题,但也可 ...
- http://blog.csdn.net/luoshengyang/article/details/6651971
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6651971 在Android系统中,提供了独特 ...
- http://blog.csdn.net/baidu_31657889/article/details/52315902
Java技术--你真的了解String类的intern()方法吗 转载 2016年08月25日 16:30:14 标签: java intern / intern / java 技术 6542 0.引 ...
- http://blog.csdn.net/LANGXINLEN/article/details/50421988
GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时候,无意中发现了 @Trinea在GitHub上的一个项目 Android开源项目分类汇总, 由于类容太多了,我没有一个个完整地 ...
- http://blog.csdn.net/hguisu/article/details/8836819
1. MySql+Memcached架构的问题 Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. ...
- git创建使用1https://blog.csdn.net/Hanani_Jia/article/details/77950594
这篇文章是我自己写的关于GitHub的内容,从我刚听到这个直到设置成功每一步都有详细的步骤来解释,其中有一些截图或者代码来自于网上. 首先,我先对GitHub来一个简单的介绍,GitHub有一个很强大 ...
- http://blog.csdn.net/neiloid/article/details/7037093#
1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): androi ...
- 嵌入式c程序易错点(转自http://blog.csdn.net/zhzht19861011/article/details/45508029)
今天第一次在网上发表博客,虽然是转载的别人的文章,但还是有点小激动.转载的这篇文章里提到的问题很多都自己亲自踩过,有个别还踩过多次(感觉自己有点傻),也许是亲生经历的原因,看完后果断的转了,以后可以经 ...
最新文章
- 终于有人把 SpringBoot 项目的Http客户端工具说清楚了!
- CPU亲和性的使用与机制--含Xen中VCPU和PCPU的綁定方法
- iOS开发之Masonry框架源码深度解析
- SpringFlux入门(上篇)
- Hibernate ORM框架学习日记基础篇-1
- 请求模式解决共享资源冲突
- rgb cmyk lab的区别
- angular面试题及答案_关于最流行的Angular问题的StackOverflow上的48个答案
- 如果误删谷歌浏览器的书签,怎么恢复
- LeetCode 1249. 移除无效的括号(栈+set / deque)
- kali2020.3 安装IDA freeware
- 常用的国产计算机软件,国产常用操作系统介绍,亲身使用告诉你答案!
- 教室录播系统方案_录播教室技术解决方案
- 京东开始卖钻石了!?
- ATmega16 单片机 AVR单片机 自动计价电子秤
- 快捷方式右键菜单、任务管理器等,使用“打开文件所在位置”出现“该文件没有与之关联的应用来执行该操作”的问题解决方案
- c语言字符串求n的阶乘,C语言求n的阶乘(n!)
- 使用java生成折线图_Java折线图简单绘制
- WiFi 信号强度和网速有关系吗?
- 必备工具:使用Pentaho进行数据迁移
热门文章
- 五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)
- 01.神经网络和深度学习 W4.深层神经网络(作业:建立你的深度神经网络+图片猫预测)
- LeetCode 1176. 健身计划评估(滑动窗口)
- 程序员面试金典 - 面试题 16.04. 井字游戏(计数)
- LeetCode 第 16 场双周赛(402/822,前48.9%)
- axure选中后横线切换_Axure8.0|动态面板内容简单切换技巧
- 海洋分享lol皮肤插件_LOL战斗之夜客户端BUG频出服务器爆满!如何提前领取皮肤?...
- python xlrd使用_python处理Excel xlrd的简单使用
- 炼丹必备!推荐一个超级好用的机器学习云平台
- Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Nacos