使用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);
}