2011-05-04 74 views
2

我使用相同数量的VMR9实例呈现Windows窗体中的多个视频流。我正在使用DirectShowLib-2005在C#中执行此操作。一个视频混合渲染器9(VMR9)可以渲染更多视频流吗?

如果需要显示100个视频,我将创建100个FilterGraphs(IFilterGraph2),每个FilterGraphs将持有一个VMR9实例(VideoMixingRenderer9),每个实例将呈现1个视频流。

它使用了快速的内存...

我能提一个VMR9过滤器的渲染速度比一个视频流比较多,所以我有少VMR9情况下,多数量的视频流的呈现?

任何帮助将不胜感激。

回答

3

嗯......我想通了...如果有人有一个更好的例子,请在这里发布,我会将其标记为已接受的答案。

图表: The graph I want to render with one VMR9 renderer

如果您呈现这GrapgEdit(或别的东西),它显示的第一个(INPUT 0)流和它下面的第二个(输入1),但我希望他们能同时可见!

为此,VMR9必须配置成这样(错误处理和一些VMR9配置中省略)

//Setting VMR9 to run in WINDOWLESS MODE 
filterConfig = (IVMRFilterConfig9)vmr; 
filterConfig.SetRenderingMode(VMR9Mode.Windowless); 

//Number of streams that I want to render together (mix) 
filterConfig.SetNumberOfStreams(2); 

//Get the MIXER CONTROL that will be used to configure video rendering surfaces 
mixerCtrl = (IVMRMixerControl9)vmr; 

//*** RENDER THE PINS SO THE GRAPH CONNECTS CORRECTLY (omitted) *** 

//Define areas of the clipping window that will be covered by each video stream 
NormalizedRect r1 = new NormalizedRect(0,0,0.5f, 0.5f); 
NormalizedRect r2 = new NormalizedRect(0.5f, 0.5f, 1f, 1f); 

//For each stream (0 and 1) set the output rect 
mixerCtrl.SetOutputRect(0, ref r1); 
mixerCtrl.SetOutputRect(1, ref r2); 

在此之后,流被渲染在削波的左上角和右下角的部分窗口,并且它们都被正确显示和渲染! Shows the resulting clipping window containing 2 video streams rendered with one VMR9

如果要显示更多视频流,则只需SetNumberOfStreams即可,并为每个视频流配置NormalizedRect。通过这种方式,我可以使用一个VMR9实例渲染更多流,而且我不需要担心RAM耗尽。

现在VMR9的真实凉意显示出来...:d的xD

PS 它看起来像16流是极限...