当前位置:   article > 正文

Windows 使用Winmm库捕获麦克风音频数据(源码)_windows c winmm.lib 采集pcm

windows c winmm.lib 采集pcm

这个写法比较简单直接上代码(个人喜欢用: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;
}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/742484
推荐阅读
相关标签
  

闽ICP备14008679号