返回

在 Windows 系统中进行无损音频采集:深入探讨 WASAPI

见解分享

引言

在 Windows 系统中采集高品质音频对于音频工程师、音乐制作人乃至普通用户来说都是至关重要的。本文将深入探讨 Windows 音频会话 API (WASAPI),这是一个强大的低级 API,可让您以最小的延迟和失真捕捉无损音频。

WASAPI:Windows 音频采集的利器

WASAPI 是微软开发的音频采集和播放 API,它绕过了 Windows 的混音器架构,提供了对底层音频设备的直接访问。这种直接访问带来了以下好处:

  • 无延迟音频采集: WASAPI 消除了混音器带来的延迟,允许以极低的延迟进行音频录制。
  • 无失真音频: 通过绕过混音器,WASAPI 消除了因混音过程而引起的任何音频失真或降级。
  • 支持高采样率和位深度: WASAPI 支持高达 32 位浮点数和 384 kHz 的采样率,确保以尽可能高的保真度进行音频捕获。

使用 WASAPI 进行音频采集

要使用 WASAPI 进行音频采集,您需要:

  • 初始化 WASAPI 设备:使用 IMMDeviceEnumerator 接口枚举可用音频设备并选择要使用的设备。
  • 创建音频捕获客户端:使用 IAudioClient 接口创建音频捕获客户端,用于管理音频流。
  • 设置音频格式:使用 IAudioClient 接口指定所需的音频格式,包括采样率、位深度和声道数。
  • 捕获音频:使用 IAudioClient 接口的 Start() 方法开始捕获音频数据。
  • 处理音频数据:捕获的音频数据可以通过 IAudioClient 接口的 GetBuffer() 方法获取,您可以对其进行处理、存储或进一步处理。

实例代码

以下示例代码演示了如何使用 WASAPI 捕获音频:

// 初始化 WASAPI 设备
IMMDeviceEnumerator* deviceEnumerator = nullptr;
IMMDevice* audioDevice = nullptr;

CoInitialize(nullptr);
HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&deviceEnumerator));
if (hr != S_OK) {
    // 错误处理
}

hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &audioDevice);
if (hr != S_OK) {
    // 错误处理
}

// 创建音频捕获客户端
IAudioClient* audioClient = nullptr;
hr = audioDevice->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, nullptr, (void**)&audioClient);
if (hr != S_OK) {
    // 错误处理
}

// 设置音频格式
WAVEFORMATEX waveFormat;
waveFormat.wFormatTag = WAVE_FORMAT_PCM;
waveFormat.nChannels = 2;
waveFormat.nSamplesPerSec = 44100;
waveFormat.wBitsPerSample = 16;
waveFormat.nBlockAlign = waveFormat.wBitsPerSample / 8 * waveFormat.nChannels;
waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;

hr = audioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK, 10000000, 0, &waveFormat, nullptr);
if (hr != S_OK) {
    // 错误处理
}

// 开始捕获音频
hr = audioClient->Start();
if (hr != S_OK) {
    // 错误处理
}

// 处理音频数据
BYTE* audioBuffer = nullptr;
DWORD bufferSize = 0;

while (true) {
    hr = audioClient->GetBuffer(&audioBuffer, &bufferSize);
    if (hr != S_OK) {
        // 错误处理
    }

    // 处理音频缓冲区

    hr = audioClient->ReleaseBuffer(bufferSize);
    if (hr != S_OK) {
        // 错误处理
    }
}

结论

WASAPI 是在 Windows 系统中进行高品质音频采集的强大工具。通过绕过混音器架构,WASAPI 提供了无延迟、无失真的音频捕获,支持高采样率和位深度。通过使用 WASAPI,音频工程师、音乐制作人和其他用户可以轻松捕获具有卓越保真度的音频。