WAVE录音

波形音频的录制与播放相似,同样需要使用回调机制。

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.若录制的音频需要通过网络发送,则一般需要经过音频处理,比如通过压缩算法减少数据量的传输,进行静音检测等。
VB Wave API是Visual Basic语言中用于录制音频的应用程序编程接口(API)。它允许开发者通过编写程序来控制和管理音频设备,实现录制、播放和处理音频的功能。 在VB Wave API中,我们可以使用一系列的函数来进行音频录制。首先,我们需要通过Open函数打开音频设备,指定采样率、声道数、采样位数等参数。然后,可以使用函数如RecordStart、RecordStop来开始和停止录制音频。 以下是一个简单的VB Wave API录音的示例代码: ``` Option Explicit Private Const WAVE_MAPPER As Integer = -1 Private Const MMSYSERR_NOERROR As Integer = 0 Private Declare Function waveInOpen Lib "winmm.dll" (phwi As Integer, ByVal uDeviceID As Integer, lpFormat As Any, ByVal dwCallback As Long, ByVal dwCallbackInstance As Long, ByVal dwFlags As Long) As Integer Private Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hwi As Integer, pwh As Any, ByVal cbwh As Long) As Integer Private Declare Function waveInAddBuffer Lib "winmm.dll" (ByVal hwi As Integer, pwh As Any, ByVal cbwh As Long) As Integer Private Declare Function waveInStart Lib "winmm.dll" (ByVal hwi As Integer) As Integer Private Declare Function waveInStop Lib "winmm.dll" (ByVal hwi As Integer) As Integer Private Declare Function waveInClose Lib "winmm.dll" (ByVal hwi As Integer) As Integer Private Type WAVEFORMATEX wFormatTag As Integer nChannels As Integer nSamplesPerSec As Long nAvgBytesPerSec As Long nBlockAlign As Integer wBitsPerSample As Integer cbSize As Integer End Type Private Type WAVEHDR lpData As Long dwBufferLength As Long dwBytesRecorded As Long dwUser As Long dwFlags As Long dwLoops As Long lpNext As Long Reserved As Long End Type Private hWaveIn As Integer Private waveFmt As WAVEFORMATEX Private waveHdr As WAVEHDR Private Sub Form_Load() ' 打开默认音频设备 waveInOpen hWaveIn, WAVE_MAPPER, waveFmt, 0, 0, 0 ' 配置录音格式 With waveFmt .nChannels = 1 ' 单声道 .nSamplesPerSec = 44100 ' 采样率为44100Hz .wBitsPerSample = 16 ' 采样位数为16位 .nBlockAlign = .nChannels * (.wBitsPerSample \ 8) .nAvgBytesPerSec = .nSamplesPerSec * .nBlockAlign End With End Sub Private Sub cmdRecord_Click() ' 开始录音 waveInOpen hWaveIn, WAVE_MAPPER, waveFmt, 0, 0, 0 waveInPrepareHeader hWaveIn, waveHdr, Len(waveHdr) waveInAddBuffer hWaveIn, waveHdr, Len(waveHdr) waveInStart hWaveIn End Sub Private Sub cmdStop_Click() ' 停止录音 waveInStop hWaveIn waveInClose hWaveIn End Sub ``` 这段代码实现了一个简单的录音功能。点击"cmdRecord"按钮开始录音,点击"cmdStop"按钮停止录音。录制的音频会保存在waveHdr.lpData中,可以通过处理这段数据来实现进一步的音频处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值