利用waveIn完成简单录音(录成wav)

本文介绍了如何使用Windows API中的waveIn函数族来创建一个简单的录音程序,将音频录制到WAV文件。首先设置WAVEFORMATEX结构体以定义录音参数,如采样率、声道数等。接着打开录音设备,分配缓冲区并准备录音。通过数据接收回调函数WaveInProc,处理录音数据并将其写入WAV文件。最后,停止录音,关闭设备并释放资源。
摘要由CSDN通过智能技术生成
  1. 设置采集音频格式
    WAVEFORMATEX waveform; //采集音频的格式,结构体
    waveform.wFormatTag = WAVE_FORMAT_PCM;//声音格式为PCM
    waveform.nSamplesPerSec = 8000;//采样率,16000次/秒
    waveform.wBitsPerSample = 16;//采样比特,16bits/次
    waveform.nChannels = 1;//采样声道数,2声道
    waveform.nAvgBytesPerSec = 16000;//每秒的数据率,就是每秒能采集多少字节的数据
    waveform.nBlockAlign = 2;//一个块的大小,采样bit的字节数乘以声道数
    waveform.cbSize = 0;//一般为0

  2. 提前准备好的录音数据缓存
    m_pRecoderBuf = new unsigned char[20 * 1024];
    m_recoderNum = 20;
    m_recoderBufLen = 20 * 1024;
    m_pWaveHdr	= new WAVEHDR[20];
    memset(m_pRecoderBuf, 0, 20 * 1024);
    memset(m_pWaveHdr, 0, sizeof(WAVEHDR) * 20);

  3. 打开录音设备
    MMRESULT mmres = waveInOpen(&m_hWaveIn, WAVE_MAPPER, &waveform, (DWORD_PTR)WaveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION );
    	
    if(mmres != MMSYSERR_NOERROR)
    {
    	/
使用C语言调用wavein录制音频的源码如下: #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <mmsystem.h> #define NUM_BUFFERS 3 #define BUFFER_SIZE 4096 // 定义全局变量 HWAVEIN hWaveIn; WAVEHDR WaveInHdr[NUM_BUFFERS]; char WaveInBuffer[NUM_BUFFERS][BUFFER_SIZE]; // 回调函数处理录音数据 void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) { if(uMsg == WIM_DATA) { PWAVEHDR pWaveHdr = (PWAVEHDR)dwParam1; if(!(pWaveHdr->dwFlags & WHDR_DONE)) // 如果当前缓冲区未录满 return; // 处理录音数据,例如保存到文件中 FILE* fp = fopen("recorded.wav", "ab"); fwrite(pWaveHdr->lpData, pWaveHdr->dwBytesRecorded, 1, fp); fclose(fp); waveInAddBuffer(hWaveIn, pWaveHdr, sizeof(WAVEHDR)); // 重新添加缓冲区 } } int main() { // 打开音频输入设备 MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &WaveFmt, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION); if(result != MMSYSERR_NOERROR) { printf("Failed to open audio device.\n"); return -1; } // 初始化录音缓冲区结构 for(int i = 0; i < NUM_BUFFERS; i++) { WaveInHdr[i].lpData = (LPSTR)WaveInBuffer[i]; WaveInHdr[i].dwBufferLength = BUFFER_SIZE; WaveInHdr[i].dwBytesRecorded = 0; WaveInHdr[i].dwUser = 0; WaveInHdr[i].dwFlags = 0; WaveInHdr[i].dwLoops = 0; result = waveInPrepareHeader(hWaveIn, &WaveInHdr[i], sizeof(WAVEHDR)); if(result != MMSYSERR_NOERROR) { printf("Failed to prepare buffer.\n"); waveInClose(hWaveIn); return -1; } result = waveInAddBuffer(hWaveIn, &WaveInHdr[i], sizeof(WAVEHDR)); if(result != MMSYSERR_NOERROR) { printf("Failed to add buffer.\n"); waveInClose(hWaveIn); return -1; } } // 开始录音 result = waveInStart(hWaveIn); if(result != MMSYSERR_NOERROR) { printf("Failed to start recording.\n"); waveInClose(hWaveIn); return -1; } // 停止录音 getchar(); result = waveInStop(hWaveIn); if(result != MMSYSERR_NOERROR) { printf("Failed to stop recording.\n"); waveInClose(hWaveIn); return -1; } // 释放资源 for(int i = 0; i < NUM_BUFFERS; i++) { result = waveInUnprepareHeader(hWaveIn, &WaveInHdr[i], sizeof(WAVEHDR)); if(result != MMSYSERR_NOERROR) { printf("Failed to unprepare buffer.\n"); waveInClose(hWaveIn); return -1; } } waveInClose(hWaveIn); return 0; } 上述代码中,我们使用waveInOpen函数打开音频输入设备,然后初始化录音缓冲区,设置回调函数来处理录音数据。经过一系列的配置之后,可以调用waveInStart开始录音,通过按下回车键来停止录音,最后通过waveInStop函数停止录音并释放资源。 注意,以上代码只是一个简单录音示例,你可以根据自己的需求对其进行扩展和修改。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值