65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (7投票s)

2009年1月10日

CPOL

2分钟阅读

viewsIcon

70583

downloadIcon

2743

一个控制台程序,用于捕获音频并进行同步预览后保存。

引言

本教程是关于使用 DirectShow 捕获音频的三部分教程的最终部分。本部分使用无限引脚 Tee 滤波器来提供预览(预听)功能,同时保存文件。

背景

由于我已经编写了另外两个教程,它们是本教程的基础,因此应该彻底阅读它们。以下是另外两个教程:

使用代码

与教程的第二部分相比,唯一的额外代码是无限引脚 Tee 滤波器。该滤波器与音频输入连接,Tee 滤波器的输出与两个滤波器连接,即 AudioRecorder WAV Dest 滤波器和扬声器,以及在我的情况下,耳机。

cacsp.jpg

以下是滤波器读取、添加到图形并建立连接的代码:

//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 类型的字符串。

© . All rights reserved.