WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种。符合 RIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。数据块的记录方式是little-endian字节顺序,标志符并不是字符串而是单独的符号。
【公式】
WAV文件所占容量 =(采样频率×时间×声道)×采样位数/8(1字节=8bit)
= ( nSamplesPerSec * t * nChannels ) * wBitsPerSample / 8
WAV文件播放时间 = 数据大小 / 每秒播放字节数
t = dwDataSize / nAvgBytesperSec
nAvgBytesPerSec = nChannels * nSamplesPerSec * wBitsPerSample / 8
WAV PCM文件,只是在PCM(脉冲编码调制)数据基础上加了个 46字节的文件头,分别对应WAVEHEADINFO结构体各成员, 整个文件由文件头+Data组成,Data主要存储的数据为采样值,即Cool Edit pro工具波形图中的Y(smpl)值;
【相关头定义】
#define BUFSIZE 4
#pragma pack(push) //保存对齐状态
#pragma pack(1) //设定为1字节对齐
//WAVEFORMAT结构定义如下:
struct WAVEFORMAT
{
WORD wFormatag; //编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
WORD nChannls; //声道数,单声道为1,双声道为2;
DWORD nSamplesPerSec; //采样频率;
DWORD nAvgBytesperSec; //每秒的数据量;
WORD nBlockAlign; //块对齐;
};
struct PCMWAVEFORMAT
{
WAVEFORMAT wf;//波形格式;
WORD wBitsPerSample; //WAVE文件的采样大小;
};
struct FMT_BLOCK
{
char szFmtTag[BUFSIZE];// "RIFF"
DWORD dwDataSize;
char szFormatType[BUFSIZE];// "WAVE"
char szFmtID[BUFSIZE];// 'f','m','t',' '
DWORD dwFmtSize;
PCMWAVEFORMAT wavFormat;
WORD dwOther; // 2字节额外补充信息
};
// Data Chunk头结构定义如下:
struct DATA_BLOCK
{
char szDataID[BUFSIZE];// 'd','a','t','a'
DWORD dwDataSize;
};
struct WAVEHEADINFO
{
FMT_BLOCK fmtBlock;
DATA_BLOCK dataBlock;
};
#pragma pack(pop)//恢复对齐状态
【参考资料】