关于wav amr音频分析

关于wav amr音频分析

从事嵌入式开发过程中,如果遇到播放wav 和 amr格式音频的话,我们就必须要对这两种音频格式的数据有所了解,今天就简单介绍下这两种音频文件。

1.WAV文件
WAVE文件格式是Microsoft的RIFF规范的一个子集,用于存储数字音频,整个文件就是一个RIFF大块,它的基本形式包括两种块:fmt块,用于描述压缩格式、采样率等基本信息;data块。包含实际样本数据。
在这里插入图片描述
咋们先贴一张WAV文件的二进制数据图。
在这里插入图片描述
WAV文件=wav头+ 音频数据

先介绍下wav音频数据的头分析

地址/大小描述
00H 4 bytesRIFF
04H 4 bytes从此地址计算本文件的大小
08H 4 byteswav
0cH 4 bytesfmt
10H 4 bytes从此地址计算文件大小
14H 2 bytes编码格式0x0001代表pcm
16H 2 byteschannels,1-单声道,2-双声道
18H 4 bytessample rate 采用频率
1cH 4 bytesbitssample ratechannels/8 每秒传输字节数
20H 2 bytesbits*channels/8
22H 2 bytesbits(量化位数)
24H 4 bytes“data”
28H 4 bytes后面开始的语音数据的大小,真正的文件大小=这个值+0x2c
2cH …语音数据

c语言中对于一个wav头,如下

struct wav_header {
    uint32_t riff_id;
    uint32_t riff_sz;
    uint32_t riff_fmt;    /*  riff end  */
    uint32_t fmt_id;
    uint32_t fmt_sz;    /* fmt sz fmt大小 wav头中描述其格式占用字节数   */
    uint16_t audio_format;    /* fmt_sz start   */
    uint16_t num_channels;
    uint32_t sample_rate;
    uint32_t byte_rate;       /* sample_rate * num_channels * bps / 8 */
    uint16_t block_align;     /* num_channels * bps / 8 */
    uint16_t bits_per_sample;     /*  fmt_sz end   */
    uint32_t data_id;
    uint32_t data_sz;
};

一个wav文件偏移wav大小就是pcm格式的音频数据了,该数据可以被声卡直接播放。我们在编写程序时,如果要播放或者录制wav格式的音频该怎么办。
播放:
提取wav头文件,包括的一些重要参数,采样率,音频本身音频格式,通道,音频数据大小等,主要用于打开与设置pcm设备,然后将pcm音频数据直接送入声卡中播放即可。
录制:
创建一个文件,先写入wav结构体的头,然后使用音频应用接口从pcm设备中读取要录制的pcm数据后,直接写入,即可形成一个wav格式的音频。

2.amr格式音频
amr格式音频叫什么,自适应多速率编码格式,它分为两种,一种为amrnb,另一种为amrwb,两者区别如下:
amr-nb:语音带宽范围:300-3700Hz,8KHz采样频率
amr-wb:语音带宽范围:50~7000Hz,16KHz采样频率

简单说下amrnb音频格式
amrnb音频主要有如下编码方式
amr关键在于20ms采样一帧数据,这个是重点。
8KHz的采样频率,20ms采样一帧数据,每秒50帧数据,每帧数据8KHz/50=160个采样点,会得到一个数据长度的数据,amr是压缩型的数据,所以需要对采样数据经常信息提取,把数据进行压缩,重新编码,通过此法得到8中编码格式如下:

序号规格音频帧字节数帧头FT
0AMR 4.751304000001000000
1AMR 5.15140C 000011000001
2AMR 5.91614 000101000010
3AMR6.7181C 000111000011
4AMR 7.42024 001001000100
5AMR 7.95212C 001011000101
6AMR 10.22734 001101000110
7AMR 12.2323C 001111000111

下面看看amr格式文件二进制数据:
在这里插入图片描述
从上图可知,当前文件采用AMR12.2规格编码方式进行编码的,我们如果要播放此格式音频,如何提取数据,并且对数据进行节目呢?
1.偏移amr头 6个字节
2.读取一个字节数据,从中提取出本语音帧使用的规格,判断出字节数,在从数据中提取出语音帧。

一般语音帧帧头不属于上面的8种,采用直接跳过,往下读取的方法,最终将整个amr文件读取完毕为止。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值