2

我使用 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 控件中......

4

1 回答 1

4

从记忆中做到这一点。

因为听起来你有一个自定义的 DirectShow 图表。我只想对 WPF MediaKit 进行一些处理:

采用 D3DRenderer 基类。这应该使使用 D3DImage 渲染 D3D 内容变得容易。以 VMR9 分配器和 D3D9 互操作的东西为例。

我假设您使用的是 VideoMixingRenderer9...所以在您的代码中创建 VMR9 时,获取 VMR9 接口,该接口允许您设置自定义分配器(示例应该在 baseclass.cs 中的 CreateRenderer 方法中)。实例化您从 MediaKit 提取的自定义分配器并将其传递给接口。该分配器有一个事件,当它获得一个新的 d3d 表面和一个新的帧准备好呈现时触发。确保 D3DRenderer 类获取这些事件(新表面、新框架)。应该是 90% 的复制和粘贴操作 :)

于 2011-10-06T22:56:14.037 回答