2011-04-27 76 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

相关问题