概述
最近做音频解码,要求WAV输出,在网上查了一些资料,结合libao里的audio_out_wav.c,在完成要求同时,对WAV头的格式进行了一些分析,写下来备忘。
首先是网上的资料,来自http://blog.csdn.net/yzhouen/archive/2006/06/07/777459.aspx。
WAVE文件格式说明表
| 偏移地址 | 字节数 | 数据类型 | 内 容 |
文件头 | 00H | 4 | char | "RIFF"标志 |
04H | 4 | long int | 文件长度 | |
08H | 4 | char | "WAVE"标志 | |
0CH | 4 | char | "fmt"标志 | |
10H | 4 |
| 过渡字节(不定) | |
14H | 2 | int | 格式类别(10H为PCM形式的声音数据) | |
16H | 2 | int | 通道数,单声道为1,双声道为2 | |
18H | 2 | int | 采样率(每秒样本数),表示每个通道的播放速度, | |
1CH | 4 | long int | 波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。 | |
20H | 2 | int | 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。 | |
22H | 2 |
| 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。 | |
24H | 4 | char | 数据标记符"data" | |
28H | 4 | long int | 语音数据的长度 |
然后是,libao的关键代码,我做过一些删减以突出重点,可以当成伪代码来看:
#define WAVE_FORMAT_PCM1
unsigned charwav_header[] = {
'R', 'I', 'F', 'F', //"RIFF"标志
0xfc, 0xff, 0xff, 0xff, //文件长度
'W', 'A', 'V', 'E', //"WAVE"标志
'f', 'm', 't', ' ', //"fmt"标志
16, 0, 0, 0, //过渡字节(不定)
WAVE_FORMAT_PCM, WAVE_FORMAT_PCM >>8,// 格式类别
0, 0, //声道数
0, 0, 0, 0, //采样率
0, 0, 0, 0, //位速
0, 0, //一个采样多声道数据块大小
16, 0, //一个采样占的bit数
'd', 'a', 't', 'a', //数据标记符"data"
0xd8,0xff, 0xff, 0xff //语音数据的长度,比文件长度小36
};
store2(wav_header + 22, chans);
store4(wav_header + 24, sample_rate);
store4(wav_header + 28, sample_rate * 2 * chans);//为什么乘2呢?因为此时是16位的PCM数据,一个采样占两个byte。
store2(wav_header + 32, (2 * chans));
store4(wav_header + 4, size + 36);
store4(wav_header + 40, size);
在裸PCM数据前加上合适的WAV头,播放器就能正常播放了。
这个就是没有扩展信息的WAV头的格式了,共44个字节,一般用于单声道、双声道16位PCM数据格式的音频。如果有扩展信息,WAV头还要大22个字节,共56个字节。我没有用到扩展信息的WAV头,希望知道的同志分享一下啊。
最后
以上就是俊逸墨镜为你收集整理的WAV头格式分析的全部内容,希望文章能够帮你解决WAV头格式分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复