我一直在使用 WPFMediaKit 来呈现 DirectShow 图。这是我的设置。
我在MediaPlayerBase
多次使用多个 D3DRender 实例时遇到问题。我有一个返回用于预览IVideoEngine
的单个图形(通过)。MediaPlayerBase
内部IVideoEngine
管理用于切换相机输入/等的 DirectShow 图形。这个想法是,这个单一的图(通过)可以通过基类MediaPlayerBase
多次、同时或(更有可能)在不同的时间使用。D3DRenderer
我创建了一个新的RenderElementControl
,它只是将 a 渲染MediaPlayerBase
到表面上。它适用于用于特定实例的第一个实例MediaPlayerBase
,但是当RenderElementControl
再次使用时,不会渲染任何视频。
这是我专门渲染的源代码MediaPlayerBase
。
public class RenderElementControl : D3DRenderer
{
private readonly MediaPlayerBase _mediaPlayerBase;
public RenderElementControl(MediaPlayerBase mediaPlayerBase)
{
_mediaPlayerBase = mediaPlayerBase;
Loaded += OnLoaded;
Unloaded += OnUnloaded;
}
private void OnUnloaded(object sender, RoutedEventArgs routedEventArgs)
{
_mediaPlayerBase.NewAllocatorFrame -= OnMediaPlayerNewAllocatorFramePrivate;
_mediaPlayerBase.NewAllocatorSurface -= OnMediaPlayerNewAllocatorSurfacePrivate;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
_mediaPlayerBase.NewAllocatorFrame += OnMediaPlayerNewAllocatorFramePrivate;
_mediaPlayerBase.NewAllocatorSurface += OnMediaPlayerNewAllocatorSurfacePrivate;
_mediaPlayerBase.Dispatcher.DoEvents();
}
private void OnMediaPlayerNewAllocatorSurfacePrivate(object sender, IntPtr pSurface)
{
SetBackBuffer(pSurface);
}
private void OnMediaPlayerNewAllocatorFramePrivate()
{
InvalidateVideoImage();
}
}
问题
为什么此控件不适用于 single 的第二个实例MediaPlayerBase
?我如何做到这一点,以便我可以使用多个RenderElementControl
,可能同时使用相同的MediaPlayerBase
?
注意:对于那些不熟悉 WPFMediaKit 的人,这里是处理 DirectShow 渲染(VMR 或 EMR)的D3DRenderer和MediaPlayerBase的源代码。