关于wav amr音频分析
从事嵌入式开发过程中,如果遇到播放wav 和 amr格式音频的话,我们就必须要对这两种音频格式的数据有所了解,今天就简单介绍下这两种音频文件。
1.WAV文件
WAVE文件格式是Microsoft的RIFF规范的一个子集,用于存储数字音频,整个文件就是一个RIFF大块,它的基本形式包括两种块:fmt块,用于描述压缩格式、采样率等基本信息;data块。包含实际样本数据。
咋们先贴一张WAV文件的二进制数据图。
WAV文件=wav头+ 音频数据
先介绍下wav音频数据的头分析
地址/大小 | 描述 |
---|---|
00H 4 bytes | RIFF |
04H 4 bytes | 从此地址计算本文件的大小 |
08H 4 bytes | wav |
0cH 4 bytes | fmt |
10H 4 bytes | 从此地址计算文件大小 |
14H 2 bytes | 编码格式0x0001代表pcm |
16H 2 bytes | channels,1-单声道,2-双声道 |
18H 4 bytes | sample rate 采用频率 |
1cH 4 bytes | bitssample ratechannels/8 每秒传输字节数 |
20H 2 bytes | bits*channels/8 |
22H 2 bytes | bits(量化位数) |
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 |
---|---|---|---|---|
0 | AMR 4.75 | 13 | 0400000100 | 0000 |
1 | AMR 5.15 | 14 | 0C 00001100 | 0001 |
2 | AMR 5.9 | 16 | 14 00010100 | 0010 |
3 | AMR6.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 |
下面看看amr格式文件二进制数据:
从上图可知,当前文件采用AMR12.2规格编码方式进行编码的,我们如果要播放此格式音频,如何提取数据,并且对数据进行节目呢?
1.偏移amr头 6个字节
2.读取一个字节数据,从中提取出本语音帧使用的规格,判断出字节数,在从数据中提取出语音帧。
一般语音帧帧头不属于上面的8种,采用直接跳过,往下读取的方法,最终将整个amr文件读取完毕为止。