如果没有先解释我正在尝试做什么,我就有点难以解释,因此我将从此开始。我试图使用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