使用waveInOpen录音并保存到文件
时间: 2024-04-08 20:29:06 浏览: 17
要使用waveInOpen函数录音并保存到文件,您需要按照以下步骤进行操作:
1. 首先,包含必要的头文件和库文件:
```c++
#include <Windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
```
2. 定义一些全局变量和缓冲区用于录音:
```c++
#define NUM_BUFFERS 3
#define BUFFER_SIZE 4096
HWAVEIN hWaveIn;
WAVEHDR waveHeaders[NUM_BUFFERS];
char buffers[NUM_BUFFERS][BUFFER_SIZE];
```
3. 实现回调函数以处理录音数据:
```c++
void CALLBACK WaveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
if (uMsg == WIM_DATA)
{
// 将录音数据写入文件
LPWAVEHDR pHdr = (LPWAVEHDR)dwParam1;
fwrite(pHdr->lpData, 1, pHdr->dwBytesRecorded, (FILE*)dwInstance);
// 释放已经处理完的缓冲区
waveInUnprepareHeader(hwi, pHdr, sizeof(WAVEHDR));
waveInPrepareHeader(hwi, pHdr, sizeof(WAVEHDR));
waveInAddBuffer(hwi, pHdr, sizeof(WAVEHDR));
}
}
```
4. 初始化录音设备并开始录音:
```c++
void StartRecording(const char* filename)
{
// 打开文件准备写入录音数据
FILE* file = fopen(filename, "wb");
if (!file)
{
printf("无法打开文件进行写入录音数据!\n");
return;
}
// 设定录音参数
WAVEFORMATEX format;
format.wFormatTag = WAVE_FORMAT_PCM;
format.nChannels = 1;
format.nSamplesPerSec = 44100;
format.wBitsPerSample = 16;
format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8;
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0;
// 打开音频输入设备
if (waveInOpen(&hWaveIn, WAVE_MAPPER, &format, (DWORD_PTR)WaveInProc, (DWORD_PTR)file, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
{
printf("无法打开音频输入设备!\n");
fclose(file);
return;
}
// 初始化并添加缓冲区
for (int i = 0; i < NUM_BUFFERS; i++)
{
waveHeaders[i].lpData = buffers[i];
waveHeaders[i].dwBufferLength = BUFFER_SIZE;
waveHeaders[i].dwBytesRecorded = 0;
waveHeaders[i].dwUser = 0;
waveHeaders[i].dwFlags = 0;
waveHeaders[i].dwLoops = 0;
waveInPrepareHeader(hWaveIn, &waveHeaders[i], sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn, &waveHeaders[i], sizeof(WAVEHDR));
}
// 开始录音
if (waveInStart(hWaveIn) != MMSYSERR_NOERROR)
{
printf("无法开始录音!\n");
waveInClose(hWaveIn);
fclose(file);
return;
}
printf("开始录音,请按任意键停止录音...\n");
getchar();
// 停止录音
waveInStop(hWaveIn);
waveInReset(hWaveIn);
waveInClose(hWaveIn);
fclose(file);
printf("录音已停止,并将数据保存到文件:%s\n", filename);
}
```
5. 在主函数中调用StartRecording函数开始录音:
```c++
int main()
{
const char* filename = "recording.wav";
StartRecording(filename);
return 0;
}
```
请确保在编译时链接到winmm.lib库文件。这样,当您运行程序时,它将开始录制音频并将其保存到指定的文件中。按下任意键停止录音。
请注意,这只是一个简单的示例,仅用于演示基本的录音和文件保存功能。在实际应用中,您可能需要添加错误处理、录音时长控制、录音设备选择等功能。
希望这可以帮助您实现通过waveInOpen录音并保存到文件的功能!如果您有任何疑问,请随时提问。