0
Basiclly我只想捕獲音頻並將其保存到磁盤上的文件。我認爲使用AVI格式會是最好的,也是最不令人討厭的。在涉足DirectShow API之後,這就是我想出的。現在如何使用DirectShow正確捕獲音頻
//I find the mic in previous code
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
//Initialize the Capture Graph Builder
hr = pBuild->SetFiltergraph(pGraph);
IBaseFilter *pMux;
//IFileSinkFilter *pSink;
hr = pBuild->SetOutputFileName(
&MEDIASUBTYPE_Avi, // Specifies AVI for the target file.
L"C:\\Example.avi", // File name.
&pMux, // Receives a pointer to the mux.
NULL); // (Optional) Receives a pointer to the file sink.
hr = pBuild->RenderStream(
&PIN_CATEGORY_CAPTURE, // Pin category.
&MEDIATYPE_Audio, // Media type.
pSrc, // Capture filter.
NULL, // Intermediate filter (optional).
pMux); // Mux or file sink filter.
,我想這將足以做我想要的東西,但在磁盤上創建任何文件和RenderStream給我E_INVALDARGS。如果我將函數調用更改爲:
hr = pBuild->RenderStream(
NULL, // Pin category.
NULL, // Media type.
pSrc, // Capture filter.
NULL, // Intermediate filter (optional).
pMux); // Mux or file sink filter.
我得到VFW_E_NOT_IN_GRAPH錯誤代替。
我在這裏做錯了什麼?我非常感謝任何幫助,提前致謝!
謝謝,你是對的。這消除了錯誤。通過添加hr = pGraph-> AddFilter(pSrc,L「AudioCap」);雖然,有一件事我不明白,我該如何開始捕捉文件並保存它?我看不到任何文件正在製作。我應該添加控件嗎?噢,我選擇AVI的原因是我不想構建過濾器並註冊它們,就像使用WavDest一樣。我正在計劃稍後進行壓縮。 –
一旦你建立了你的管道,你可以從過濾器圖形中查詢IMediaControl接口,並調用'IMediaControl :: Run()'來開始工作。然後,'IMediaControl :: Stop()'將完成記錄並關閉文件。 –
是的,我剛解決它。 DirectShow對音頻/視頻捕獲來說非常棒。我開始測試waveInOpen和那些舊的API,但DirectShow並不複雜。非常感謝你的幫助 :) –