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
AMR文件结构的更多相关文章
- AMR音频文件格式分析
AMR音频文件格式分析 1 概要 如今非常多智能手机都支持多媒体功能,特别是音频和视频播放功能,而AMR文件格式是手机端普遍支持的音频文件格式.AMR,全称是:Adaptive Multi-Rate, ...
- [转]Patch文件结构详解
N久不来 于是不知道扔在哪儿于是放这里先 如果你觉得碍事的话 帮我扔到合适的版块去.. 导读这是一篇说明文 它介绍了标准冒险岛更新文件(*.patch;*.exe)的格式文章的最后附了一段C#的参考代 ...
- 《深入理解Java虚拟机》类文件结构
上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...
- 了解npm的文件结构(npm-folders)和配置文件(npm-mrc)
一.npm的文件结构 npm的安装: 本地安装 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm ...
- jvm--1.class文件结构
1.字节码(1)bytecode是构成平台无关性的基石 (2)当jvm发展到1.7-1.8的时候,jvm设计者通过,JSR-292,基本可以让其他语言运行在jvm上面. 如,Clojure , Gro ...
- Nova PhoneGap框架 第五章 文件结构
一个好的项目架构必然有着合理的文件结构,如果一个项目的文件组织混乱,那么可以断言一定是项目架构有问题. 合理的文件结构能够帮你更清晰的管理你的文件,并且当需要添加新的文件的时候,你的程序员很清楚应该加 ...
- 再探.NET的PE文件结构(安全篇)
一.开篇 首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软 ...
- 【来至百度百科】linux文件结构
文件结构 /:根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. /bin:bin 就是二进制(binary)英文缩写.在一般的系统当中,都可以在这个目录 ...
- ffmpeg常用转换命令,支持WAV转AMR
音频转换: 1.转换amr到mp3: ffmpeg -i shenhuxi.amr amr2mp3.mp3 2.转换amr到wav: ffmpeg -acodec libamr_nb -i shenh ...
随机推荐
- PL/SQL Developer过期解决方法
参考资料: plsql过期解决方法 plsql永久注册码适用个版本 方法一: 1.首先,登陆PL/SQL Developer,PL/SQL Developer要到期了 2.输入指令“regedit”打 ...
- hdu 4349 Xiao Ming's Hope 规律
Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Linux CentOS 7 安装mongoDB(4.0.6)
在官网下载安装包: https://www.mongodb.com/download-center/community 或者通过wget下载 wget https://fastdl.mongodb.o ...
- vue自定义错误界面
方案一: 当输入错误链接错误或者找不到页面,在router里可以定义一个404页面,具体可以这样做:在routes里面这样写: { path:'*', component:error, name:'e ...
- 基于python Arcface 实现人脸检测和识别
虹软的人脸识别技术也是很强的,重要的是他免费提供了离线的sdk,还提供了实例,这个是目前几家研究人脸识别的大公司里面少有的.识别能力正常用还是可以的.我这个代码是调用的离线sdk实现的 ``` fro ...
- Codeforces 374D - Inna and Sequence
374D - Inna and Sequence 思路: 树状数组+二分 因为被删的点最多N=1e6个,所以复杂度N*logN*logN 前段时间做过一道一样的题,这类题基本套路二分找没删除前的位置 ...
- 批标准化 Batch Normalization
2018-12-05 20:28:15 在机器学习领域有一个很重要的假设,即独立同分布假设,也就是说训练集和测试集是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障.而 ...
- (转+整理)C#中使用GUID
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...
- 在Spring Boot中使用 @ConfigurationProperties 注解, @EnableConfigurationProperties
但 Spring Boot 提供了另一种方式 ,能够根据类型校验和管理application中的bean. 这里会介绍如何使用@ConfigurationProperties.继续使用mail做例子. ...
- SVN图标各种标注
黄色感叹号(有冲突):--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人 ...