2012-06-21 43 views
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錯誤代替。

我在這裏做錯了什麼?我非常感謝任何幫助,提前致謝!

回答

1

VFW_E_NOT_IN_GRAPH意味着您需要使用IGraphBuilder::AddFilter調用將您創建的pSrc過濾器添加到過濾器圖形。

要保存音頻只進流成文件,你可能希望傾向於.WAV格式相反,Windows SDK自帶WavDest項目/樣品,可以接受來自音頻濾波器和輸出與File Writer Filter兼容的.wav文件流音頻保存進入文件。

+0

謝謝,你是對的。這消除了錯誤。通過添加hr = pGraph-> AddFilter(pSrc,L「AudioCap」);雖然,有一件事我不明白,我該如何開始捕捉文件並保存它?我看不到任何文件正在製作。我應該添加控件嗎?噢,我選擇AVI的原因是我不想構建過濾器並註冊它們,就像使用WavDest一樣。我正在計劃稍後進行壓縮。 –

+0

一旦你建立了你的管道,你可以從過濾器圖形中查詢IMediaControl接口,並調用'IMediaControl :: Run()'來開始工作。然後,'IMediaControl :: Stop()'將完成記錄並關閉文件。 –

+0

是的,我剛解決它。 DirectShow對音頻/視頻捕獲來說非常棒。我開始測試waveInOpen和那些舊的API,但DirectShow並不複雜。非常感謝你的幫助 :) –