使用DirectShow写一个音频捕捉例子
DirectShow对硬件的支持是通过特定的包装Filter来实现的。
声卡使用的是Audio Capture Filter,Filter内部使用以waveIn开头
的一套API实现(如waveInOpen等)。
运行GraphEdit,插入Filter时,在“Audio Capture Sources”目录下,
就能看到所有代表本地机器上的声卡的各个Filter(装了几张声卡,就会有几个Filter)
DirectShow加入一个硬件Filter,是靠“枚举”;声卡Filter也不例外。
代表声卡的Filter都注册在CLSID_AudioInputDeviceCategory目录下,
使用系统设备枚举器枚举这个目录,就能发现要创建的声卡对象。
(如何枚举这里就不再赘述了。)
当成功加入声卡Filter后,接下去的问题就是要将这个Filter与其他Filter相连。
想捕捉生成一个Wave文件,采用过滤器的勾连如下
声卡filter--->Wave Dest Filter ---->File Writer Filter
Wave Dest Filter是微软DirectX SDK自带的过滤器
其功能是,当结束捕捉时,往Wave文件中写入一个文件头信息。
Filte Write Filter 是微软系统过滤器。
用graphedit可以勾连后测试下。
//采用程序来连接过滤器的大致方法:
//没有处理错误
void BuildAudioCaptureGraph(void)
{
IBaseFilter *pSrc = NULL, //捕捉音频设备
*pWaveDest = NULL, //处理音频过滤器
*pWriter = NULL; //产生文件过滤器
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;
// Create the Filter Graph Manager.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
// Add the audio capture filter.
//这里省略了枚举设备处理
FindAudioCapture(&pSrc);
// audio capture devices and picks one.
pGraph->AddFilter(pSrc, L"Capture");
// Add the WavDest and the File Writer.
AddFilterByClsid(pGraph, L"WavDest", CLSID_WavDest, &pWavDest);
AddFilterByClsid(pGraph, L"File Writer", CLSID_FileWriter, &pWriter);
//是writer接口中属性
pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
pSink->SetFileName(L"C:\test.wav", NULL);
//连接filter
ConnectTwoFilters(pGraph, pSrc, pWavDest);
ConnectTwoFilters(pGraph, pWavDest, pWriter);
}