如果沒有先解釋我正在嘗試做什麼,我就有點難以解釋,因此我將從此開始。我試圖使用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);
}
會像上述實施工作?如果沒有,那麼還有其他方法可以做到嗎?任何幫助深表感謝。謝謝!
你試過了嗎?什麼不行? – Ralf 2011-04-28 07:59:04