AMR文件结构解析——时长解析_amr文件头-程序员宅基地

技术标签: 时长  amr  解析  

一、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;//每一个数据帧对应20ms
		pos+=AMR_FRAME_SIZE[(int)toc];
	}

	duration+=500;//四舍五入
	duration/=1000;//转换为秒
	return duration;
}

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mijichui2153/article/details/98208195

智能推荐

fpga在线升级 linux_Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程-程序员宅基地

文章浏览阅读834次。Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程一:前言最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linux在ARM9上的移植,网上基本都是ZC702、zed的教程,这对于买了非标准板的人来说就不太友好,很多文件都不知道是怎么生成的。本着学习加分享的心态,把这两天移植linux的过程写下来,尽可能详细。驱动和..._zynq 7035移植linux

c语言中合法的变量名 a0,自考计算机基础与程序设计.ppt-程序员宅基地

文章浏览阅读709次。《自考计算机基础与程序设计.ppt》由会员分享,可在线阅读,更多相关《自考计算机基础与程序设计.ppt(36页珍藏版)》请在装配图网上搜索。1、C语言概述,共 26 页 第 2 页,第二章 C语言概述,第一节 程序设计语言的发展 第二节 C语言的特点 第三节 C语言的组成 第四节 简单的C程序介绍 第五节 C程序的上机步骤 第六节 TC(Turbo C)介绍,共 26 页 第 3 页,2-1程序设..._c语言合法变量名称

Linux内核处理并发与竞争的方法之自旋锁API函数-程序员宅基地

文章浏览阅读846次,点赞24次,收藏19次。Linux内核处理并发与竞争的方法之自旋锁API函数

亚马逊美国站绑定万里汇WorldFirst收款教程!_wordfirst收款-程序员宅基地

文章浏览阅读2.1k次。万里汇WorldFirst是亚马逊主要的收款方式之一,下面就以美国站为例,说说如何设置WorldFirst作为亚马逊收款账户?你可以在WorldFirst账户后台“货币账户”里,找到“您的货币账户”信息,找到WorldFirst美国银行账户信息(WF美元帐户),包括银行所在国家、银行账户持有人姓名(账户名)、9位汇款路径号码(ABA Routing Number)、银行账号。如果您还没..._wordfirst收款

Linux系统下Oracle数据库的启动与Oracle监听的启动_linux启动oracle服务和监听-程序员宅基地

文章浏览阅读647次。Oracle数据库是一种常用的关系型数据库管理系统,而在Linux操作系统上,我们需要进行一些特定的步骤来启动Oracle数据库和Oracle监听器。在本文中,我们将详细介绍如何在Linux系统下启动Oracle数据库和Oracle监听器,并提供相应的源代码示例。请注意,以上步骤是基于默认的Oracle安装和配置。因此,在实际操作中,请参考相关文档和官方指南,并根据具体情况进行适当调整。通过以上步骤,你已成功启动了Oracle数据库和Oracle监听器。现在,Oracle监听器已成功启动。_linux启动oracle服务和监听

_GLIBCXX_USE_CXX11_ABI 定义不一致带来的宕机问题-程序员宅基地

文章浏览阅读3.7k次,点赞9次,收藏11次。@TOC很久没有写文章了,记录一下ABI 是什么我们看看wiki定义: 应用二进制接口(英语:application binary interface,缩写为ABI)是指两程序模块间的接口,一个ABI定义了机器代码如何访问数据结构与运算程序,此处所定义的界面相当低端并且相依于硬件。而类似概念的API则在源代码定义这些,则较为高端,并不直接相依于硬件,通常会是人类可阅读的代码。一个ABI常见的样貌即是调用约定:资料怎么成为计算程序的输入或者从中得到输出;x86的调用约定即是一个ABI...__glibcxx_use_cxx11_abi

随便推点

通用RPC方案-程序员宅基地

文章浏览阅读37次。其中ServerChannelInitializer的initChannel为触发read事件时,在SerializeAdapterDecoder的decode方法的最后一个中加入ServerChannelHandler 继承 ChannelInboundHandlerAdapter继续处理read事件时,在ServerChannelHandler 的channelRead方法中使用线程池来处理读到的数据(可能是耗时操作)从而来保证不会由于处理请求导致work线程全部耗尽,而出现等待的情况。

OpenCasCade 从零开始到生成MFC单文档测试程序_wnt_wdriver.hxx-程序员宅基地

文章浏览阅读5.9k次,点赞4次,收藏17次。1.下载1.1. 安装程序 OpenCASCADExxx.exe(xxx为最新版本号,下同): http://www.opencascade.org/getocc/download/loadocc/1.2.文档OCCTDocumentationxxx.exe(xxx为最新版本号,下同): http://www.opencascade.org/getocc/download/_wnt_wdriver.hxx

java - 设计模式学习总结_java设计模式结课报告总结-程序员宅基地

文章浏览阅读870次。熟练掌握各种设计模式,并能在实际编程开发中灵活运用它们,不仅能使代码更规范,重用性更高,同时也能保证代码的可靠性,提高开发效率。这段时间又系统看了设计模式的相关内容,整理学习总结如下,文中内容如有表达有误的地方,还请指出,共同交流学习。一、概述二、7个设计原则三、创建型模式(5种)四、结构型模式(7种)五、行为型模式(11种)六、总结一、概述面向对象编程有七大原则,即经常提到_java设计模式结课报告总结

解决浏览器报错 Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location_webview报错vendor.1383dc26dbd21140b5be.js:6 uncaught-程序员宅基地

文章浏览阅读2.6k次。刷新页面报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: “/saleOrder/manage”.浏览器提示:<router-link>'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning_webview报错vendor.1383dc26dbd21140b5be.js:6 uncaught (in promise) navigation

Linux中断处理程序框架_中断服务函数基本框架怎么写-程序员宅基地

文章浏览阅读463次。设备的中断会打断内核进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。但是,这个良好的愿望往往与现实不吻合。在多数真实的系统中,当中断到来时,要完成的工作往往并不是短小的,它可能要进行大量的耗时处理。为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个部分:顶半部(Top Half) 和底半部(Botton Half..._中断服务函数基本框架怎么写

《Photoshop智能手机APP界面设计》学习笔记_photoshop中app首面设计-程序员宅基地

文章浏览阅读5.9k次,点赞3次,收藏9次。第一章 APP用户界面基础1.1 手机UI设计相关基本概念1.1.1 什么是UI设计UI(User's Interface)即用户界面,它不仅仅是美化界面,还需要研究用户,让界面变得更友好、简洁、舒适、易用。用户界面无处不在。它可以是登录界面,也可以是软件界面,手机、PC上都有;1.1.2 手机UI与平面UI的不同手机UI将范围基本锁定在手机的APP/客_photoshop中app首面设计

推荐文章

热门文章

相关标签