读写WAVE文件

leixue1997 2010-12-04 11:56:21
如何用C++写一个写WAVE文件的程序??求各位高手指点一下,,有源代码就更好了,,,希望是简单易懂的那种哈
...全文
61 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhigang34 2010-12-05
  • 打赏
  • 举报
回复
你先要了解WAVE文件格式是什么样的,下面这个函数是在WIM_DATA时响应。


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)) ;


}

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧