参考站点:音频编解码——格式篇(优快云)
wav格式介绍:
一、结构
wave文件是用于多媒体文件存储的microsoft RIFF的子集,Microsoft RIFF是资源交换档案标准。RIFF文件的标准形式是文件头(file heder)、数据块(data chunk).WAVE文件是一个将RIFF文件的数据块分成了两部分,一个是”fmt chunck“(格式块),一个是”data chunk“(数据块)。
文件结构如下图所示:
(1)文件头部分(RIFF文件标识段+WAVE 文件头标识段+声音数据格式说明)
格式如下:
(2)数据体部分
首先是数据体格式说明:现有一个“data”字符标记接下来都是样本数据,然后给出样本数据的长度。
接着是样本数据部分,见图1.
二、代码
(1)文件头
struct RIFF_HEADER
{
char szRiffID[4]; // 四个字符'R','I','F','F',小尾字节序,低字节存高位
DWORD dwRiffSize;//文件总数据量(即除去开头8字节),大尾字节序,低字节存低位
char szRiffFormat[4]; //四个字符 'W','A','V','E'
};
(2)fmt结构体
struct FMT_BLOCK
{
char szFmtID[4]; // 'f','m','t',三个字符,最后一个字节为空格
DWORD dwFmtSize;//fmt块的字节数(编码方式为pcm时为16,即下面结构体成员的字节数,不为pcm时,为),不包括前8个字节
WAVE_FORMAT wavFormat;// 上面那个结构体
};
WAVE_FORMAT是一个波形文件信息结构体,代码如下:
struct WAVE_FORMAT
{
WORD wFormatTag;// 编码方法
WORD wChannels;//通道数,1为单声道,2为双声道
DWORD dwSamplesPerSec;//采样率,即每秒的样本数
DWORD dwAvgBytesPerSec; //传输速率,每秒字节数=采样率*每个样点字节数(即下面的wBlockAlign)
WORD wBlockAlign; //每个样点字节数=样本宽度*通道数/8
WORD wBitsPerSample; //样本宽度,即一个样值用多少位表示,通常为8或16
};
(3)数据结构体
struct DATA_BLOCK
{
char szDataID[4]; // 四个字符'd','a','t','a'
DWORD dwDataSize;//数据块字节数,不含前8个字节
};
Q:
1、8bit和16bit样值的二进制编码表示方法一样吗?
2、现有的WAVE文件支持哪几种编码方法?
A:
1、8bit样值以无符号形式存储,取值范围是0-255,16bit样值以有符号的补码形式存储,取值范围是-32768-32767.
分别表示单声道、双声道音频数据时,格式如下:
2、查阅资料可知,目前的的wav文件支持以下十种编码算法:
简单介绍:
PCM:(paulse code modulation)脉冲编码调制,将模拟信号经过PCM电端机抽样、量化、编码,得到二进制码
ADPCM:自适应差分PCM编码。该算法利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用了自适应预测和自适应量化,即量化器和预测器的参数能随输入信号的统计特性自适应于或接近于最佳的参数状态。
可进一步探讨的问题:取样率转换 例如,48khz到44.1khz
取样率的转换可以通过抽取或插值,要将48khz转换到44.1khz需要先插值再抽取。
取48k和44.1k的最小公倍数7056k(48k*147,44.1k*160),将48khz的信号插成7056k,即每两个取样值之间插146个值,再将其抽取成44.1k,即每隔159个值抽一个。