赞
踩
这个写法比较简单直接上代码(个人喜欢用:Core-audio捕获 Windows C++ 使用Core-audio捕获本地扬声器设备或者麦克风设备(提供源码)-CSDN博客 )
#include <iostream>
#include <Windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
static FILE* pcmFile = NULL;
HWAVEIN hWaveIn;
// 回调函数,用于处理录音数据
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
if (uMsg == WIM_DATA)
{
// 将录音数据写入文件
if (pcmFile)
{
LPWAVEHDR pwh = (LPWAVEHDR)dwParam1;
fwrite(pwh->lpData, 1, pwh->dwBytesRecorded, pcmFile);
waveInAddBuffer(hWaveIn, pwh, sizeof(WAVEHDR));
}
}
}
int main()
{
fopen_s(&pcmFile, "rec.pcm", "wb");
// 打开麦克风设备
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 2;
wfx.nSamplesPerSec = 48000;
wfx.wBitsPerSample = 16;
wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
wfx.cbSize = 0;
waveInOpen(&hWaveIn, WAVE_MAPPER, &wfx, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION);
// 创建并准备录音缓冲区
const int BUFFER_SIZE = 1920;
char buffer[BUFFER_SIZE];
WAVEHDR wh;
wh.lpData = buffer;
wh.dwBufferLength = BUFFER_SIZE;
wh.dwBytesRecorded = 0;
wh.dwUser = 0;
wh.dwFlags = 0;
wh.dwLoops = 0;
waveInPrepareHeader(hWaveIn, &wh, sizeof(WAVEHDR));
// 开始录音
waveInAddBuffer(hWaveIn, &wh, sizeof(WAVEHDR));
waveInStart(hWaveIn);
while (true)
{
Sleep(1000);
}
// 停止录音并清理资源
waveInStop(hWaveIn);
waveInUnprepareHeader(hWaveIn, &wh, sizeof(WAVEHDR));
waveInClose(hWaveIn);
fclose(pcmFile);
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。