音频采集 via Waveform API
Waveform API 采集音频
Waveform API 从 Windows 3.0 时代就登上历史舞台了,至今依然可以运行在最新的 OS 上,不得不佩服 Windows 的兼容性。不过新的 waveform API 是基于 Core Audio 架构之上的,其实就是一个 wrapper。
Waveform API 的优势就是非常简单,兼容性好,不依赖于任何框架,虽然通常我们都使用它录制成 Wav 格式的文件(缺点是非常占用空间),但实际上也可以和其他框架(如 FFmpeg,DShow,MF 等)配合使用编码成压缩的音频格式(如 mp3,aac 等)。
采集流程

采集代码
以下是整个 Waveform API 采集过程的概要代码,略去各个函数的具体实现和错误处理:
m_wavInHelper.enumDevices(this, _fillDevices);
m_wavInHelper.selectDevice(nSel);
hr = m_wavInHelper.getSupportedFormats(supportedFormats);
if (SUCCEEDED(hr)) {
// add supported formats to a combobox
if (WAVE_FORMAT_1M08 == (supportedFormats & WAVE_FORMAT_1M08))
pFormats->SetItemData(pFormats->AddString(_T("11.025 kHz, mono, 8-bit")), WAVE_FORMAT_1M08);
… …
}
m_wavInHelper.selectDevice(nSel);
m_wavInHelper.openDevice(samplesPerSec, channels, bitsPerSample);
m_wavInHelper.startRecording(szRecFile);
… … // capturing
m_wavInHelper.stopRecording();
m_wavInHelper.closeDevice();
CWaveInHelper::enumDevices 函数
枚举到的每一个设备经由回调函数返回设备名称,然后填充到界面上的列表控件中(下图中的 Input ComboBox),每个设备支持的格式也可以通过 API waveInGetDevCaps 枚举出来。

HRESULT CWaveInHelper::enumDevices(void* pContext, PFENUM_DEV_CALLBACK pCallback)
{
RETURN_IF_NULL(pCallback);
UINT nDevices =

最低0.47元/天 解锁文章
1445





