使用Windows API实现本地音频采集

Posted wdpforinter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Windows API实现本地音频采集相关的知识,希望对你有一定的参考价值。

Windows API提供了Winmm(Windows多媒体)库,其中包括了音频设备相关的函数,可以用来实现音频设备的枚举和测试。

下面是一个简单的示例代码,演示了如何使用Winmm库中的waveInGetNumDevs()函数来枚举计算机上的音频输入设备数量,并使用waveInOpen()函数打开其中一个设备并进行测试录音。

#include <iostream>
#include <Windows.h>
#include <mmsystem.h>

#pragma comment(lib, "winmm.lib")

void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)

    // 实现录音回调函数


int main() 
    UINT numDevs = waveInGetNumDevs();
    std::cout << "Number of audio input devices: " << numDevs << std::endl;

    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;

    HWAVEIN hWaveIn;
    MMRESULT result = waveInOpen(&hWaveIn, WAVE_MAPPER, &format, (DWORD_PTR)waveInProc, NULL, CALLBACK_FUNCTION);
    if (result == MMSYSERR_NOERROR) 
        std::cout << "Audio input device opened successfully" << std::endl;

        // 开始录音
        result = waveInStart(hWaveIn);
        if (result == MMSYSERR_NOERROR) 
            std::cout << "Recording started" << std::endl;
        
        else 
            std::cerr << "Failed to start recording" << std::endl;
            waveInClose(hWaveIn);
            return 1;
        

        // 停止录音
        system("pause");
        waveInStop(hWaveIn);
        waveInReset(hWaveIn);
        waveInClose(hWaveIn);
        std::cout << "Recording stopped" << std::endl;
    
    else 
        std::cerr << "Failed to open audio input device" << std::endl;
        return 1;
    

    return 0;

在这个例子中,waveInGetNumDevs()函数返回了计算机上可用的音频输入设备数量。waveInOpen()函数用于打开音频设备,其中参数WAVE_MAPPER表示使用默认设备,&format指向一个WAVEFORMATEX结构体,描述了所需的音频格式,waveInProc是一个回调函数,用于处理录音数据。然后,waveInStart()函数开始录音,system("pause")函数用于暂停程序,以等待用户手动停止录音。最后,waveInStop()函数停止录音,waveInReset()函数清除录音缓冲区,waveInClose()函数关闭音频设备。

waveInProc是一个回调函数,用于处理录音数据,这个回调函数有五个参数,它们的含义如下:

  • HWAVEIN hwi:表示音频设备的句柄,即与音频设备建立的连接。
  • UINT uMsg:表示回调函数的消息类型,可以是以下值之一:
    • WIM_OPEN:当音频设备已经打开并准备好录音时,发送此消息。
    • WIM_DATA:当音频设备已经采集到音频数据时,发送此消息。
    • WIM_CLOSE:当音频设备已经关闭时,发送此消息。
  • DWORD_PTR dwInstance:一个应用程序定义的32位数值,它在打开音频设备时指定,用于传递应用程序特定的信息。
  • DWORD_PTR dwParam1:当uMsgWIM_OPENWIM_CLOSE时,此参数为0。当uMsgWIM_DATA时,此参数是一个指向WAVEHDR结构体的指针,表示音频数据的头信息。
  • DWORD_PTR dwParam2:当uMsgWIM_OPENWIM_CLOSE时,此参数为0。当uMsgWIM_DATA时,此参数为一个DWORD值,表示已经采集到的音频数据的字节数。

需要注意的是,waveInProc函数是在一个独立的线程中执行的,因此要注意线程安全。

JavaCV音视频开发宝典:使用JavaCV采集windows系统声音并录制成mp3音频文件(FFmpeg采集windows系统声音)

《JavaCV音视频开发宝典》专栏目录导航
《JavaCV音视频开发宝典》专栏介绍和目录

前言

之前已经写过很多采集windows、macos和linux本机麦克风声音的文章,但是没讲过采集系统声音的。
很多小伙伴们弄推流器的时候跟博主反馈说不知道怎么采集系统的声音,本章咱们就单独讲讲windows平台下如何使用ffmpeg和JavaCV采集系统声音。

采集系统声音原理

首先要知道的是,原则上来说是没办法获取系统声音的,需要通过创建虚拟设备,将系统声音模拟成虚拟声卡设备,这样就可以通过ffmpeg和JavaCV去查找到和采集这个虚拟声卡设备的声音,从而达到采集系统声音的方法。

安装虚拟声卡设备

项目维护地址:https://github.com/rdp/screen-capture-recorder-to-video-windows-free
下载地址:https://download.csdn.net/download/eguid_1/72086203

下载插件后

以上是关于使用Windows API实现本地音频采集的主要内容,如果未能解决你的问题,请参考以下文章

第六章 音视频的采集与编码

ffmpeg音频采集

PortAudio —— 跨平台音频采集API

C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能

基于kaldi的iOS实时语音识别(本地)+03+音频采集传输

WebRTC手记之本地音频采集