使用 DirectShow 进行音频捕获 - 第 3 部分






4.60/5 (7投票s)
一个控制台程序,用于捕获音频并进行同步预览后保存。
引言
本教程是关于使用 DirectShow 捕获音频的三部分教程的最终部分。本部分使用无限引脚 Tee 滤波器来提供预览(预听)功能,同时保存文件。
背景
由于我已经编写了另外两个教程,它们是本教程的基础,因此应该彻底阅读它们。以下是另外两个教程:
使用代码
与教程的第二部分相比,唯一的额外代码是无限引脚 Tee 滤波器。该滤波器与音频输入连接,Tee 滤波器的输出与两个滤波器连接,即 AudioRecorder WAV Dest 滤波器和扬声器,以及在我的情况下,耳机。
以下是滤波器读取、添加到图形并建立连接的代码:
//Infinite Pin Tee filter
// the DirectShow filters category
DEVICE_CLSID = CLSID_LegacyAmFilterCategory;
// device name as seen in Graphedit.exe,
// using SysAllicString(..) to properly allocate string
bstrDeviceName = SysAllocString(L"Infinite Pin Tee Filter");
//read the required device
pDeviceMonik = Device_Read(pDeviceEnum,pDeviceMonik,
DEVICE_CLSID,bstrDeviceName);
//Return the device after initializing it
pPinTeeFilter = Device_Init(pDeviceMonik,pPinTeeFilter);
//add device to graph
Device_Addition(pGraph,pPinTeeFilter,bstrDeviceName);
//Connect input to output, Mic to Infinite Pin Tee filter
//Input pin name, as seen in GraphEdit
bstrInPinName = SysAllocString(L"Capture");
//Output pin name, this one will be input for Infinite Pin Tee Filter
bstrOutPinName = SysAllocString(L"Input");
//connect
Device_Connect(pInputDevice,pPinTeeFilter,bstrInPinName,bstrOutPinName);
//Connect input to output, Infinite Pin Tee filter
//to AudioRecorder WAV Dest filter
//As seen in GraphEdit
bstrInPinName = SysAllocString(L"Output1");
//Output pin name
bstrOutPinName = SysAllocString(L"In");
//connect
Device_Connect(pPinTeeFilter,pWAVRecorder,bstrInPinName,bstrOutPinName);
///Connect input to output, Infinite Pin Tee filter to Default
//sound output i.e. headphones or speakers etc.
//As seen in GraphEdit
bstrInPinName = SysAllocString(L"Output2");
//Output pin name
bstrOutPinName = SysAllocString(L"Audio Input pin (rendered)");
//connect
Device_Connect(pPinTeeFilter,pOutputDevice,bstrInPinName,bstrOutPinName);
连接建立后,我们就可以开始了。run()
方法启动图形。
结语
我希望这系列关于了解 DirectShow 滤波器使用的教程对初学者有所帮助。我故意将整个过程分解为三个步骤,以便新手可以更好地了解在每个步骤中,事物是如何围绕滤波器构建的。如何读取、实例化、连接滤波器,并最终使用它们为我们做一些有用的事情。说实话,当我开始 DirectShow 编程时,很难找到一个起点。MSDN 提供了很多关于滤波器的信息,但我个人觉得 MSDN 很难理解,因为你需要回顾过去才能理解正在解释的内容。
我享受了这段旅程,希望你也是。感谢你的所有时间!
该代码使用以下内容构建:
- Windows Server 2008
- Microsoft Visual Studio 2008
- DirectX 10.1
- Microsoft Windows SDK 6.1
参考文献
历史
- 2008/02/08:文章更新。
修复了 Bstr_Compare(...)
,该函数可以正确比较两个 BSTR
类型的字符串。