马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//*******存储声音文件**********
CFile m_file;
CFileException fileException;
CString m_csFileName = _T("D:\\audio.wav");
m_file.Open(m_csFileName, CFile::modeCreate | CFile::modeReadWrite, &fileException);
DWORD m_WaveHeaderSize = 38;
DWORD m_WaveFormatSize = 18;//WAVEFORMATEX结构大小
//WAVEFORMATEX结构看:https://www.cnblogs.com/liming19680104/p/17538589.html
m_file.SeekToBegin();
m_file.Write("RIFF", 4);//写入标识符RIFF
unsigned int Sec = (sizeof(pSaveBuffer) + m_WaveHeaderSize);
//Sec=42
m_file.Write(&Sec, sizeof(Sec));
m_file.Write("WAVE", 4); //写入格式辨别吗
//***********fmt子块****************
m_file.Write("fmt ", 4); //写入fmt
m_file.Write(&m_WaveFormatSize, sizeof(m_WaveFormatSize));//写入WAVEFORMATEX结构大小
//写入WAVEFORMATEX结构的6个或7个成员值
m_file.Write(&waveform.wFormatTag, sizeof(waveform.wFormatTag));
m_file.Write(&waveform.nChannels, sizeof(waveform.nChannels));
m_file.Write(&waveform.nSamplesPerSec, sizeof(waveform.nSamplesPerSec));
m_file.Write(&waveform.nAvgBytesPerSec, sizeof(waveform.nAvgBytesPerSec));
m_file.Write(&waveform.nBlockAlign, sizeof(waveform.nBlockAlign));
m_file.Write(&waveform.wBitsPerSample, sizeof(waveform.wBitsPerSample));
m_file.Write(&waveform.cbSize, sizeof(waveform.cbSize));
m_file.Write("data", 4);
m_file.Write(&dwDataLength, sizeof(dwDataLength));
//dwDataLength=缓冲区大小
m_file.Write(pSaveBuffer, dwDataLength);//写入音频数据
m_file.Seek(dwDataLength, CFile::begin);
m_file.Close();
我的问题:这是一段通过麦克风录音代码,DWORD m_WaveHeaderSize = 38 这个38是怎么算出来的 ??
m_file.Write(&Sec, sizeof(Sec)) 这个sec是什么数据 ??
DWORD m_WaveHeaderSize = 38 这个值是根据WAV文件格式中的头部信息计算得出的。WAV文件格式的头部包含了多个字段,用于描述音频数据的属性和格式。在你的代码中,这个头部信息被写入到文件中以确保正确的文件格式。具体来说,这个38是以下部分的总和:
1. "RIFF" 标识符占用4字节。
2. 用于存储文件大小信息的 4 字节整数( unsigned int Sec )。
3. "WAVE" 标识符占用4字节。
4. "fmt " 标识符占用4字节。
5. 用于存储 WAVEFORMATEX 结构大小的 4 字节整数。
6. WAVEFORMATEX 结构中的成员,如 waveform.wFormatTag 、 waveform.nChannels 、 waveform.nSamplesPerSec 等,各占用 2 或 4 字节。
将这些值加起来,你得到了38,这是整个头部信息的总字节数。
关于 m_file.Write(&Sec, sizeof(Sec)) , Sec 是用于存储整个文件大小的变量,它包括音频数据大小和头部信息的大小。在这段代码中, Sec 的值被写入到文件中,以便在文件的头部信息中记录整个文件的大小,以便后续读取时可以正确解析音频数据。
总之,这段代码的目的是按照WAV文件格式的规范创建一个包含音频数据的WAV文件。
|