如何使用WPF MediaKit或类似的程序,将使用DES创建的DirectShow过滤器图形渲染到WPF控件
本文关键字:WPF 创建 DES DirectShow 过滤器 控件 图形渲染 MediaKit 何使用 程序 | 更新日期: 2023-09-27 18:10:27
我用c#和DirectShow.net开发了一个简单的视频编辑器。到目前为止,我有一个使用DirectShow编辑服务构建的DirectShow过滤器图。我的应用程序控制图形,运行,暂停和停止播放在预览窗口中需要。在编辑会话中,图形将根据用户添加、删除或修改媒体的请求进行更改。
目前我使用一个包装到WindowsFormsHost的PictureBox来预览编辑的视频。但我真的想尝试使用Jeremiah Morril的WPF MediaKit代替。(http://wpfmediakit.codeplex.com)
最初的思路(我的蛮力方法)是将IGraphBuilder和IPin从我的图形传递到WPF MediaKit中的MediaUriPlayer.cs中的OpenSource()函数,以便添加VMR9渲染器并连接到我现有的图形,而不是像在原始的OpenSource()中那样创建一个新图形。这并没有很好地工作,我在尝试了各种组合后放弃了,大多数时候得到"COM对象与其底层RCW分离"的错误。
在最初的失败之后,我搜索并在http://videorendererelement.codeplex.com上找到了Morrill类似的VideoRendererElement。它似乎不会太难添加一个样本抓取器到我的DirectShow图形,并使用它来发送样本到VideoRendererElement。这就像VideoRendererElement中包含的网络摄像头的例子一样。
最后,我想知道是否可以以同样的方式使用WPF MediaKit中的任何较新的控件,即通过从我的图中的样本采集器传递样本到MediaUriElement, DvdPlayerElement或来自WPF MediaKit集合的另一个控件。本质上我的问题是:谁能推荐使用WPF MediaKit或VideoRenderingElement来实现这个示例抓取场景?或者也许有人可以建议一个更好的方法,让我的DES制作的过滤器图形渲染成WPF控件…
从内存中执行
因为它听起来像你有一个自定义的DirectShow图形。我只会在WPF MediaKit上做一些事情:
取D3DRenderer基类。这将使使用D3DImage渲染D3D内容变得容易。以VMR9分配器和D3D9互操作为例。
我假设你正在使用VideoMixingRenderer9…因此,当您在代码中创建VMR9时,获取允许您设置自定义分配器的VMR9接口(一个示例应该是在基类.cs中的CreateRenderer方法中)。实例化从MediaKit提取的自定义分配器,并将其传递给接口。该分配器有一个事件,当它获得一个新的d3d表面和一个新的帧准备呈现时触发。确保D3DRenderer类获得这些事件(新表面,新框架)。应该是90%的复制粘贴操作:)