2011-04-27 77 views
1

如果沒有先解釋我正在嘗試做什麼,我就有點難以解釋,因此我將從此開始。我試圖使用Directshow中的Sample Grabber + Null Renderer濾鏡組合來抓取多個視頻流中的樣本。輸入源可以是從網絡攝像頭到視頻文件到網址的任何內容。我知道如何爲一個單一的輸入源做到這一點,得到了輸入源的IBaseFilter,然後使用的CoCreateInstance()來獲取IBaseFilter指針的樣本採集和空渲染器:多次將相同的過濾器添加到DirectShow圖形中

HRESULT hr = CoCreateInstance(CLSID_SampleGrabber, 
    NULL, 
    CLSCTX_INPROC, 
    IID_IBaseFilter, 
    (void **)&sample_grabber_filter); 

if(FAILED(hr)) { 
    printf("(Fatal) Error setting up Sample Grabber.\n"); 
    return hr; 
} 

hr = CoCreateInstance(CLSID_NullRenderer, 
    NULL, 
    CLSCTX_INPROC, 
    IID_IBaseFilter, 
    (void **)&null_renderer); 

if(FAILED(hr)) { 
    printf("(Fatal) Error seeting up Null Renderer.\n"); 
    return hr; 
} 

我可以再使用FilterGraph :: AddFilter()函數添加所有3個過濾器,並使用另一個接口(如CaptureGraphBuilder2)來呈現流。但是當我想同時渲染多個源時會發生什麼?我可以將所有源過濾器添加到圖形中,但Sample Grabber和Null Renderer過濾器如何爲每個視頻流完成圖形?我可以做些什麼:

IGraphBuilder *graph_builder; 
ICaptureGraphBuilder2 *cap_graph; 
IMediaControl *media_control; 
// ... set up graph_builder and cap_graph and media_control 
cap_graph->AddFilterGraph(graph_builder); 

IBaseFilter *new_source; 
wchar_t *source_name; // Allocate some memory 

while(ScanForSource(&new_source, &source_name)) {  
    graph_builder->AddFilter(new_source, source_name); 
    graph_builder->AddFilter(sample_grabber_filter, new_sg_name); 
    graph_builder->AddFilter(null_renderer, new_nr_name); 
    cap_graph->RenderStream(&PIN_CATEGORY_PREVIEW, 
    &MEDIATYPE_Video, new_source, sample_grabber_filter, null_renderer); 
} 

會像上述實施工作?如果沒有,那麼還有其他方法可以做到嗎?任何幫助深表感謝。謝謝!

+0

你試過了嗎?什麼不行? – Ralf 2011-04-28 07:59:04

回答

1

是的,您可以創建樣品採集卡和渲染器,並將其插入到您的圖形中。不要忘記單獨創建它們(爲每一個調用CoCreateInstance),不要嘗試多次插入相同的實例。

+0

謝謝!您的解決方案奏效我之前將相同的實例添加到圖中,直到我試圖釋放採樣器或null渲染器時,它似乎都能正常工作。這將導致所有的流停止。我以爲IGraphBulder :: AddFilter()每次創建一個過濾器的新實例,你出於某種原因添加它......現在我知道情況並非如此。 – Anshul 2011-05-03 20:35:36

相關問題