16,473
社区成员
发帖
与我相关
我的任务
分享
void CAudioRecorder::onWimData(PWAVEHDR pWaveHdr)
{
m_dwDataLength += pWaveHdr->dwBytesRecorded;
/*
RIFF WAVE Chun 12
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'RIFF' |
----------------------------------
| Size | 4 Bytes | |
----------------------------------
| Type | 4 Bytes | 'WAVE' |
----------------------------------
*/
/*
Format Chunk 26
====================================================================
| | 字节数 | 具体内容 |
====================================================================
| ID | 4 Bytes | 'fmt ' |
--------------------------------------------------------------------
| Size | 4 Bytes | 数值为16或18,18则最后又附加信息 |
-------------------------------------------------------------------- ----
| FormatTag | 2 Bytes | 编码方式,一般为0x0001 | |
-------------------------------------------------------------------- |
| Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 | |
-------------------------------------------------------------------- |
| SamplesPerSec | 4 Bytes | 采样频率 | |
-------------------------------------------------------------------- |
| AvgBytesPerSec| 4 Bytes | 每秒所需字节数 | |===> WAVE_FORMAT
-------------------------------------------------------------------- |
| BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) | |
-------------------------------------------------------------------- |
| BitsPerSample | 2 Bytes | 每个采样需要的bit数 | |
-------------------------------------------------------------------- |
| bsp; | 2 Bytes | 附加信息(可选,通过Size来判断有无) | |
-------------------------------------------------------------------- ----
*/
/*
Fact Chunk (可选)
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'fact' |
----------------------------------
| Size | 4 Bytes | 数值为4 |
----------------------------------
| data | 4 Bytes | |
----------------------------------
*/
/*
Data Chunk 8
==================================
| |所占字节数| 具体内容 |
==================================
| ID | 4 Bytes | 'data' |
----------------------------------
| Size | 4 Bytes | |
----------------------------------
| data | | |
----------------------------------
*/
DWORD dwFileLength = 12 + 26 + 8 + m_dwDataLength; //WAVE文件长度,不包括Fact Chunk
DWORD dwSize = dwFileLength - 8; //size是整个wav文件大小减去ID和Size所占用的字节数,即FileLen - 8 = Size。
m_wavFile.SeekToBegin();
m_wavFile.Write("RIFF", 4);
m_wavFile.Write(&dwSize, 4);
m_wavFile.Write("WAVE", 4);
m_wavFile.Write("fmt ", 4);//注意这里的空格
int formatSize = sizeof(waveform);
m_wavFile.Write(&formatSize, 4);
m_wavFile.Write(&waveform.wFormatTag, 2);
m_wavFile.Write(&waveform.nChannels, 2);
m_wavFile.Write(&waveform.nSamplesPerSec, 4);
m_wavFile.Write(&waveform.nAvgBytesPerSec, 4);
m_wavFile.Write(&waveform.nBlockAlign, 2);
m_wavFile.Write(&waveform.wBitsPerSample, 2);
m_wavFile.Write(&waveform.cbSize, 2);
m_wavFile.Write("data", 4);
m_wavFile.Write(&m_dwDataLength, 4);
//在文件末尾追加新的音频数据
m_wavFile.SeekToEnd();
m_wavFile.Write(pWaveHdr->lpData, pWaveHdr->dwBytesRecorded);
SetEvent(m_hEvtOnWrite);
waveInAddBuffer (m_hWaveIn, pWaveHdr, sizeof (WAVEHDR)) ;
}