您的位置:首页 > 编程语言 > C语言/C++

WAVE录音

2017-01-02 15:00 190 查看
波形音频的录制与播放相似,同样需要使用回调机制。

WAVE录音的基本流程

1.查询系统使用具备录制波形音频的输入设备,调用waveInGetNumDevs函数来获取设备数目;

2.检查波形音频输出设备性能以确定设备是否支持所需录制的波形音频格式,调用waveInGetDevCaps函数;

3.打开波形音频输入设备,调用waveInOpen函数;

4.构造WAVE音频信息头结构WAVEHDR,调用waveInPrepareHeader函数;

5.通过WAVEHDR的lpData参数向波形音频设备发送一个缓冲区,调用waveInAddBuffer函数;

6.调用waveInStart函数开始录音;

7.将音频信息头结构中的lpData指向的所接收到的WAVE数据写入WAV文件;

8.清除准备好的音频信息头结构WAVEHDR并释放系统资源,调用waveInUnprepareHeader函数;

9.关闭波形音频输入设备,调用waveInClose函数。

注意

1.若关闭波形音频输入设备时,waveInAddBuffer送出的缓冲区未返回,则调用该函数会失败,这时可以调用waveInReset函数放弃所有未用完的缓冲区,重置输入设备。waveInReset函数会终止输入,并放弃未处理的缓冲区返回给应用程序,此时WAVEHDR结构中的dwBytesRecorded参数包含的是实际数据的长度。通过调用waveInStop函数可以停止录音,若需要继续录音,可使用waveInStart函数重新开始录制。

2.如同WAVE播放,WAVE的录制同样需要使用双缓冲区机制,否则录制的文件听起来会有停顿现象。

3.MSDN中已注明在回调函数中严格限制系统调用,故不能随意设计方案,比如直接将音频数据写入文件是不妥当的。通常做法是,设计一个数据块链表结构进行缓冲,这多半涉及多线程编程。

4.系统是在另一个线程(并非你自己创建的线程)中调用回调函数的,这会给使用TLS机制的程序带来影响。如果使用的是MFC,AfxGetApp之类的函数返回值将不正确。

5.若录制的音频需要通过网络发送,则一般需要经过音频处理,比如通过压缩算法减少数据量的传输,进行静音检测等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ WAVE