{
typedef struct _TWavHeader
{
long rId;
long rLen;
long wId;
long fId;
long fLen;
WORD wFormatTag;
WORD nChannels;
long nSamplesPerSec;
long nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
long dId;
long wSampleLength;
}TWavHeader;
TWavHeader wh;
wh.rId = 0x46464952;
wh.rLen = 36;
wh.wId = 0x45564157;
wh.fId = 0x20746d66;
wh.fLen = 16;
wh.wFormatTag = 1;
wh.nChannels = wChannels;
wh.nSamplesPerSec = lRate;
wh.nAvgBytesPerSec = wChannels * lRate * (wResolution / 8);
wh.nBlockAlign = wChannels * (wResolution / 8);
wh.wBitsPerSample = wResolution;
wh.dId = 0x61746164;
wh.wSampleLength = 0;
int nHandle = FileCreate(strFileName);
FileSeek(nHandle, 0, 0);
FileWrite(nHandle, &wh, sizeof(wh));
FileClose(nHandle);
}
2 个解决方案
#1
wav文件包括头和数据两部分,其结构如下:(从文件头开始依次排列)
1)首先是字符串“RIFF” ,占4个字节。
2)波形块的大小:DWORD,占4字节。波形块的大小=(文件大小-8)
3)字符串"WAVE",占4个字节。
4)字符串“fmt ”,占4个字节,注意fmt后有个空格字符(0x20)。
5)格式块的大小,DWORD,占4个字节
6)格式块,VC中用WAVEFORMATEX结构体描述,占18个字节,可用sizeof(WAVEFORMATEX)计算。
其中WAVEFORMATEX结构体的定义为:(更详细的描述可以参考msdn)
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
7)字符串"data",占4个字节。
8)波形数据的大小,DWORD,占4个字节。
9)声音数据,大小在8)中描述。
以下是一个波形文件样本的头部:
00000000h: 52 49 46 46 E6 E4 05 00 57 41 56 45 66 6D 74 20 ; RIFF驿..WAVEfmt
00000010h: 12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 ; ........@...€>..
00000020h: 02 00 10 00 00 00 64 61 74 61 C0 E4 05 00 ; ......data冷..
从该样本可以看出:
该波形文件波形块的大小为386278(0x0005E4E6),波形文件大小为:386278+8 =386286字节;
格式块的大小(WAVEFORMATEX结构体)为18字节;
波形数据的大小为386240字节(0x0005E4C0);
就是说你想要的数据应该就在这两个数据其中一个
格式块(WAVEFORMATEX结构体)中定义的声音数据属性为:
wFormatTag=0x0001 即WAVE_FORMAT_PCM ;
nChannels = 0x0001 即单声道;
nSamplesPerSec = 0x00001F40 即采样率8000Hz;
nAvgBytesPerSec = 0x00003E80 即平均字节速率16000字节(16bit量化),可以根据该数据估计缓冲区的大小;
nBlockAlign = 0x0002 即块联合为2字节(16bit量化,2字节表示一个采样点,播放时必须从以块为单位从块头开始播放);
wBitsPerSample = 0x0010 即每个采样点的比特值为16(16bit量化)。nBlockAlign值即由该值除以8计算出来;
cbSize不使用,填0x0000。
1)首先是字符串“RIFF” ,占4个字节。
2)波形块的大小:DWORD,占4字节。波形块的大小=(文件大小-8)
3)字符串"WAVE",占4个字节。
4)字符串“fmt ”,占4个字节,注意fmt后有个空格字符(0x20)。
5)格式块的大小,DWORD,占4个字节
6)格式块,VC中用WAVEFORMATEX结构体描述,占18个字节,可用sizeof(WAVEFORMATEX)计算。
其中WAVEFORMATEX结构体的定义为:(更详细的描述可以参考msdn)
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
7)字符串"data",占4个字节。
8)波形数据的大小,DWORD,占4个字节。
9)声音数据,大小在8)中描述。
以下是一个波形文件样本的头部:
00000000h: 52 49 46 46 E6 E4 05 00 57 41 56 45 66 6D 74 20 ; RIFF驿..WAVEfmt
00000010h: 12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 ; ........@...€>..
00000020h: 02 00 10 00 00 00 64 61 74 61 C0 E4 05 00 ; ......data冷..
从该样本可以看出:
该波形文件波形块的大小为386278(0x0005E4E6),波形文件大小为:386278+8 =386286字节;
格式块的大小(WAVEFORMATEX结构体)为18字节;
波形数据的大小为386240字节(0x0005E4C0);
就是说你想要的数据应该就在这两个数据其中一个
格式块(WAVEFORMATEX结构体)中定义的声音数据属性为:
wFormatTag=0x0001 即WAVE_FORMAT_PCM ;
nChannels = 0x0001 即单声道;
nSamplesPerSec = 0x00001F40 即采样率8000Hz;
nAvgBytesPerSec = 0x00003E80 即平均字节速率16000字节(16bit量化),可以根据该数据估计缓冲区的大小;
nBlockAlign = 0x0002 即块联合为2字节(16bit量化,2字节表示一个采样点,播放时必须从以块为单位从块头开始播放);
wBitsPerSample = 0x0010 即每个采样点的比特值为16(16bit量化)。nBlockAlign值即由该值除以8计算出来;
cbSize不使用,填0x0000。
#2
WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见附表。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。
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 语音数据的长度
PCM数据的存放方式:
样本1 样本2
8位单声道 0声道 0声道
8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)
16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节
16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节
WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。
样本大小 数据格式 最大值 最小值
8位PCM unsigned int 225 0
16位PCM int 32767 -32767
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。
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 语音数据的长度
PCM数据的存放方式:
样本1 样本2
8位单声道 0声道 0声道
8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)
16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节
16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节
WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。
样本大小 数据格式 最大值 最小值
8位PCM unsigned int 225 0
16位PCM int 32767 -32767
#1
wav文件包括头和数据两部分,其结构如下:(从文件头开始依次排列)
1)首先是字符串“RIFF” ,占4个字节。
2)波形块的大小:DWORD,占4字节。波形块的大小=(文件大小-8)
3)字符串"WAVE",占4个字节。
4)字符串“fmt ”,占4个字节,注意fmt后有个空格字符(0x20)。
5)格式块的大小,DWORD,占4个字节
6)格式块,VC中用WAVEFORMATEX结构体描述,占18个字节,可用sizeof(WAVEFORMATEX)计算。
其中WAVEFORMATEX结构体的定义为:(更详细的描述可以参考msdn)
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
7)字符串"data",占4个字节。
8)波形数据的大小,DWORD,占4个字节。
9)声音数据,大小在8)中描述。
以下是一个波形文件样本的头部:
00000000h: 52 49 46 46 E6 E4 05 00 57 41 56 45 66 6D 74 20 ; RIFF驿..WAVEfmt
00000010h: 12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 ; ........@...€>..
00000020h: 02 00 10 00 00 00 64 61 74 61 C0 E4 05 00 ; ......data冷..
从该样本可以看出:
该波形文件波形块的大小为386278(0x0005E4E6),波形文件大小为:386278+8 =386286字节;
格式块的大小(WAVEFORMATEX结构体)为18字节;
波形数据的大小为386240字节(0x0005E4C0);
就是说你想要的数据应该就在这两个数据其中一个
格式块(WAVEFORMATEX结构体)中定义的声音数据属性为:
wFormatTag=0x0001 即WAVE_FORMAT_PCM ;
nChannels = 0x0001 即单声道;
nSamplesPerSec = 0x00001F40 即采样率8000Hz;
nAvgBytesPerSec = 0x00003E80 即平均字节速率16000字节(16bit量化),可以根据该数据估计缓冲区的大小;
nBlockAlign = 0x0002 即块联合为2字节(16bit量化,2字节表示一个采样点,播放时必须从以块为单位从块头开始播放);
wBitsPerSample = 0x0010 即每个采样点的比特值为16(16bit量化)。nBlockAlign值即由该值除以8计算出来;
cbSize不使用,填0x0000。
1)首先是字符串“RIFF” ,占4个字节。
2)波形块的大小:DWORD,占4字节。波形块的大小=(文件大小-8)
3)字符串"WAVE",占4个字节。
4)字符串“fmt ”,占4个字节,注意fmt后有个空格字符(0x20)。
5)格式块的大小,DWORD,占4个字节
6)格式块,VC中用WAVEFORMATEX结构体描述,占18个字节,可用sizeof(WAVEFORMATEX)计算。
其中WAVEFORMATEX结构体的定义为:(更详细的描述可以参考msdn)
typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;
7)字符串"data",占4个字节。
8)波形数据的大小,DWORD,占4个字节。
9)声音数据,大小在8)中描述。
以下是一个波形文件样本的头部:
00000000h: 52 49 46 46 E6 E4 05 00 57 41 56 45 66 6D 74 20 ; RIFF驿..WAVEfmt
00000010h: 12 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 ; ........@...€>..
00000020h: 02 00 10 00 00 00 64 61 74 61 C0 E4 05 00 ; ......data冷..
从该样本可以看出:
该波形文件波形块的大小为386278(0x0005E4E6),波形文件大小为:386278+8 =386286字节;
格式块的大小(WAVEFORMATEX结构体)为18字节;
波形数据的大小为386240字节(0x0005E4C0);
就是说你想要的数据应该就在这两个数据其中一个
格式块(WAVEFORMATEX结构体)中定义的声音数据属性为:
wFormatTag=0x0001 即WAVE_FORMAT_PCM ;
nChannels = 0x0001 即单声道;
nSamplesPerSec = 0x00001F40 即采样率8000Hz;
nAvgBytesPerSec = 0x00003E80 即平均字节速率16000字节(16bit量化),可以根据该数据估计缓冲区的大小;
nBlockAlign = 0x0002 即块联合为2字节(16bit量化,2字节表示一个采样点,播放时必须从以块为单位从块头开始播放);
wBitsPerSample = 0x0010 即每个采样点的比特值为16(16bit量化)。nBlockAlign值即由该值除以8计算出来;
cbSize不使用,填0x0000。
#2
WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。WAVE文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分。WAVE文件各部分内容及格式见附表。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。
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 语音数据的长度
PCM数据的存放方式:
样本1 样本2
8位单声道 0声道 0声道
8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)
16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节
16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节
WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。
样本大小 数据格式 最大值 最小值
8位PCM unsigned int 225 0
16位PCM int 32767 -32767
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本是交替出现的。
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 语音数据的长度
PCM数据的存放方式:
样本1 样本2
8位单声道 0声道 0声道
8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)
16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节
16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节
WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。
样本大小 数据格式 最大值 最小值
8位PCM unsigned int 225 0
16位PCM int 32767 -32767