Wav文件必须有文件头,下面是它的结构 typedef struct _WAVE_HEAD { char flag[4]; //"RIFF"标志 int nLen;//文件长度 char name[4]; //"WAVE"标志 char format[4];//"fmt"标志 char temp[4]; //--------------------以下16个字节内空为 WAVEFORMATEX(多 WORD cbSize;)结构的内容 short nType;//格式类别(10H为PCM形式的声音数据) short nChannel;//通道数,单声道为1,双声道为2 int nSamplerate;//采样率(每秒样本数),表示每个通道的播放速度, int nTransferSpeed;//波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。 //数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。 short nAdjust;//每样本字节数 short nBits;//每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。 // WORD cbSize; /* the count in bytes of the size of */ WAVEFORMATEX结构才有,Wave文件头没有 char dataflag[4];//数据标记符"data" int nData;//语音数据的长度 }
m_wavFmt.cbSize = 0;
m_wavFmt.nChannels = nChannel;
m_wavFmt.nSamplesPerSec = nSample;
m_wavFmt.wBitsPerSample = nBit;
m_wavFmt.nBlockAlign = m_wavFmt.nChannels * m_wavFmt.wBitsPerSample / 8;
m_wavFmt.nAvgBytesPerSec = m_wavFmt.nBlockAlign * m_wavFmt.nSamplesPerSec;其中 nChannel = 2;
nSample = 44100;
nBit = 8;
CFile file();
file.Open("Test.wav", CFile::modeCreate | CFile::modeWrite);然后在OnMM_WIM_DATA()函数中将接收的数据写入文件.
typedef struct _WAVE_HEAD
{
char flag[4]; //"RIFF"标志
int nLen;//文件长度
char name[4]; //"WAVE"标志
char format[4];//"fmt"标志
char temp[4];
//--------------------以下16个字节内空为 WAVEFORMATEX(多 WORD cbSize;)结构的内容
short nType;//格式类别(10H为PCM形式的声音数据)
short nChannel;//通道数,单声道为1,双声道为2
int nSamplerate;//采样率(每秒样本数),表示每个通道的播放速度,
int nTransferSpeed;//波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
//数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
short nAdjust;//每样本字节数
short nBits;//每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
// WORD cbSize; /* the count in bytes of the size of */ WAVEFORMATEX结构才有,Wave文件头没有 char dataflag[4];//数据标记符"data"
int nData;//语音数据的长度
}
DWORD dwWavFormatSize = 18;
m_pWaveFile->SeekToBegin();
m_pWaveFile->Write("RIFF", 4);
unsigned int Sec = sizeof(PBYTE) + dwWavHdrSize;
m_pWaveFile->Write(&Sec, sizeof(Sec));
m_pWaveFile->Write("WAVE",4);
m_pWaveFile->Write("fmt ",4);
m_pWaveFile->Write(&dwWavFormatSize, sizeof(dwWavFormatSize));
m_pWaveFile->Write(&m_wavFmt.wFormatTag ,sizeof(m_wavFmt.wFormatTag));
m_pWaveFile->Write(&m_wavFmt.nChannels, sizeof(m_wavFmt.nChannels));
m_pWaveFile->Write(&m_wavFmt.nSamplesPerSec, sizeof(m_wavFmt.nSamplesPerSec));
m_pWaveFile->Write(&m_wavFmt.nAvgBytesPerSec, sizeof(m_wavFmt.nAvgBytesPerSec));
m_pWaveFile->Write(&m_wavFmt.nBlockAlign, sizeof(m_wavFmt.nBlockAlign));
m_pWaveFile->Write(&m_wavFmt.wBitsPerSample, sizeof(m_wavFmt.wBitsPerSample));
m_pWaveFile->Write(&m_wavFmt.cbSize, sizeof(m_wavFmt.cbSize));
m_pWaveFile->Write("data",4);
我把nChannel = 2; 改成nChannel = 1;
就没有这个问题了,不知道这是什么原因