一、AMR简介

基于新的网络和新的要求,无论是从节省传输频带资源,还是保持线路通信的高效率等方面来看,研究采用各种可变速率语音编码技术的系统都有重要意义。目前为了适应此需要提出了AMR(Adaptive Multi-rate) 的概念,即自适应多速率语音编码器,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声通话。AMR又分为两种,一种是AMR-NB(AMR-NarrowBind),语音带宽范围:300-3700Hz,8KHz采样频率;另外一种是AMR-WB(AMR WideBand),语音带宽范围50-7000Hz,16KHz采样频率。但考虑语音的短时相关性,每帧长度均为20ms。这两种编码器根据带宽的要求虽然选用了不同的速率,但有异曲同工之处.

总之,知道AMR是一种压缩比较大的、多用于人声通话的语音编码技术就好了。关于AMR-NB和AMR-WB网上有较多的介绍此处也不在重复。另一个比较重要的点是“每帧长度均为20ms”,这对我们接下来解析时长比较有用。

二、AMR文件结构解析

AMR文件由文件头和数据帧组成,文件头标识占6个字节,后面紧接着的就是音频帧了,如下:

文件头(6字节)
语音帧1
语音帧2
......
语音帧n

1、文件头。关于文件头单声道和多声道情况下文件的头部是不一致的,单声道情况下的文件头只包括一个Magic number,而多声道情况下文件头既包含Magic number,在其之后还包含一个32位的Chanel description field。多声道情况下的32位通道描述字符,前28位都是保留字符,必须设置成0,最后4位说明使用的声道个数。此处我们知道占6个字节就好了。

2、语音数据。

(1)语音帧块。文件头之后就是时间连续的语音帧块了,也就是说语音帧还存在以帧块为维度的划分。每个帧块包含8位组对齐的语音帧,相对于若干个声道,从第一个声道开始一次排列。

(2)语音帧。语音帧的组成包括两部分:帧头和帧内容。每个帧都是8位组对齐的。其实语音帧就可以理解为视频的一帧一帧的画面,语音帧的概念与之相同。

1)帧头:每一帧都是从一个8位的帧头开始,而且其中的P为填充位必须设为0(感觉就是第一个bit必为0的意思)。

帧头(8bit) 帧内容(字节数因编码模式而不同)

2)语音帧的编码模式有如下八种,他们的音频帧的大小是不同的,比特率也是不同的。

注意,这些模式会在同一个文件amr文件中共存,这也就是Adaptive Multi-rate的真实含义吧。

模式

规格

比特率(kbps)

音频帧大小(字节)

帧头(字节)

FT

0

AMR 4.75

4.75

13

04     00000100

0000

1

AMR 5.15

5.15

14

0C    00001100

0001

2

AMR 5.9

5.90

16

14     00010100

0010

3

AMR 6.7

6.70

18

1C    00011100

0011

4

AMR 7.4

7.40

20

24     00100100

0100

5

AMR 7.95

7.95

21

2C    00101100

0101

6

AMR 10.2

10.20

27

34     00110100

0110

7

AMR 12.2

12.20

32

3C     00111100

0111

由以上表格可知,八种模式的是可以根据帧头进行区分的。这个在后续的解析amr文件获取语音时长的代码中会体现出来。

3、音频数据帧大小的计算:AMR 一帧对应20ms,那么一秒有50帧的音频数据。由于比特率不同,每帧的数据大小也不同。如果比特率是12.2kbs,那么每秒采样的音频数据位数为:

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

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

三、解析AMR文件的时长

根据以上介绍我们此处给出解析AMR文件获取语音时长的C++代码。

uint64_t getDuration(std::string fileContent)
{uint64_t duration=0;//语音持续时长//音频帧在八种编码模式下的帧内容占用字节数int AMR_FRAME_SIZE[8] = { 13, 14, 16, 18, 20, 21, 27, 32};size_t pos=0;//pos用来指示位置size_t length=fileContent.length();char toc;//toc每次代表帧头,通过运算可以知道属于哪种编码模式pos+=6;//跳过文件头的6个字节while(pos<length){toc=fileContent[pos];//toc赋值帧头toc=toc & 0x78;//对照表格帧头的编码一目了然toc=toc>>3;//对照表格帧头的编码一目了然if(toc>=8)toc=0;duration+=20;//每一个数据帧对应20mspos+=AMR_FRAME_SIZE[(int)toc];}duration+=500;//四舍五入duration/=1000;//转换为秒return duration;
}

关于时长读取提供如下具体测试代码,见本人上传资源【解析amr文件时长c++实例代码(包含arm示例文件)】。

AMR文件结构解析——时长解析相关推荐

  1. mp3、amr、wav三种音频格式时长获取

    在平时开发过程中可能遇到需要上传相关音频文件到后台,并且计算各种音频文件的时长,因此对三种音频格式(mp3.amr和wav)的时长计算进行了简单的调研,现将相关实现记录一下,也方便需要的朋友查看. ( ...

  2. php 获取视频首帧,PHP获取视频的第一帧与时长

    //获得视频文件的缩略图 function getVideoCover($file,$time,$name) { if(empty($time))$time = '1';//默认截取第一秒第一帧 $s ...

  3. java ffmpeg 获取视频时长_Java通过调用FFMPEG获取视频时长

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  4. 王者荣耀服务器信息共享,王者荣耀账号时长共享含义及作用解析

    王者荣耀最近专门推出了一个针对未成年人的账号时长共享,很多小伙伴都在问这个账号时长共享是干嘛的?小编就为大家带来了王者荣耀账号时长共享含义及作用解析! 王者荣耀账号时长共享什么意思 "账号时 ...

  5. iframe标签解析腾讯视频链接的获取不到总时长的解决方案(Txp.play.js)

    记一次项目总结: 腾讯视频(Txp.play.js) <iframe> API 的使用 由于视频URL是来自腾讯视频,所以会出现一个这样的情况:无法获取到用户所看的该视频的总时长,那麽就得 ...

  6. 解析视频分辨率和时长

    解析视频分辨率和时长 下载工具 使用的工具是:FFmpeg 分为win 和 linux 需要提前安装 FFmpeg windows版本 linux版本 有道笔记 windows 安装 将下载的进行解压 ...

  7. 如何计算加班时长?全面解析加班计算方法及注

    介绍加班时长的计算方法,包括工时制与计件制的计算方式,以及法定假日加班和休息日加班的计算方法和注意事项,帮助员工和雇主更好地管理加班情况. 一.工时制的加班计算方法 1.日常加班 工时制的员工日常加班 ...

  8. 苹果svg解析自适应长图

    IPhone12自适应长图svg解析 原文链接:https://mp.weixin.qq.com/s/S0fpT4JbdVvdKDXG5BemWw 参考:https://developers.weix ...

  9. 石家庄:市环保局长解析持续雾霾天气原因 2013-02-05 来源:搜狐网

    石家庄:市环保局长解析持续雾霾天气原因 2013-02-05 来源:搜狐网 持续的雾霾和污染天气引发市民的思考,燕赵都市报(网)关于"面对空气重污染,城市该如何应对"的讨论自发起以 ...

  10. 17.4 class文件结构 - 使用javap指令解析Class文件

    使用javap指令解析Class文件 解析字节码的作用 通过反编译生成的字节码文件,我们可以深入的了解java代码的工作机制.但是,自己分析类文件结构太麻烦了!除了使用第三方的jclasslib工具之 ...

最新文章

  1. SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法(转)
  2. System.Web
  3. Android到底何去何从?来自腾讯、阿里、京东、网易、美图等大咖为你揭晓
  4. java黄油刀_一篇文章玩转ButterKnife,让代码更简洁
  5. python字符串的表示_Python字符串方法总结
  6. Redis为什么变慢了?一文详解Redis性能问题 | 万字长文
  7. 给恋爱中的女孩的忠告
  8. python基础之五大标准数据类型
  9. web项目怎么打包上线_如何打包发布Web Application应用程序
  10. leetcode刷题日记-在线选举
  11. Jenkinsfile脚本实现master、slave节点(agent)共享内容
  12. 《社会心理学》第一章读书笔记
  13. 电商平台中的9种共性推荐策略
  14. 软考常考知识点整理-项目生命周期、信息系统生命周期与产品生命周期
  15. HDOJ Saving HDU JAVA 2111
  16. Linux编辑器-gcc/g++使用
  17. 118.【微信小程序 - 02】
  18. RemotelyAnywhere 远程管理软件
  19. Python学习之-分支语句
  20. 计算机网络与安全专业属工程类,信息安全专业属于什么专业类别

热门文章

  1. es 同步期间数据更新_在大流行期间成为数据科学家的感觉如何
  2. android常见的限制符和屏幕适配
  3. 英语: 听力(Listening)
  4. 操写一盒酥三字于盒上
  5. php time()的用法,PHP timezone_name_from_abbr() 函数用法及示例
  6. 2017-2018-2 1723《程序设计与数据结构》问题汇总 (更新完毕)
  7. 数据分析--Python连接阿里云数据库
  8. 在树莓派计算模块CM4 eMMC上安装Ubuntu Desktop 21.04
  9. GIS入门进阶之015
  10. 业务层战略制定的思路和方法_如何确保公司年度战略目标落地—打造战略执行的方法论...