如何在UWP MediaElement和Win2d CanvasControl之间共享资源?

时间:2016-05-18 14:32:00

标签: c# windows-runtime directx uwp win2d

我试图将在WinRT IBasicVideoEffect中创建的视频绘制到Win2d CanvasControl。

Win2d视频效果示例建立在将IBasicVideoEffect接口实现为WinRT组件的基础上。从方法SetEncodingProperties(IBasicVideoEffect)和CanvasControl()创建的位图具有不同的设备,我无法相互绘制。

public void ProcessFrame(ProcessVideoFrameContext context)
    {
        _mediaElementCanvasRenderTarget = CanvasRenderTarget.CreateFromDirect3D11Surface(canvasDevice, context.OutputFrame.Direct3DSurface);
    }

public void SetEncodingProperties(VideoEncodingProperties encodingProperties, IDirect3DDevice device)
    {
        canvasDevice = CanvasDevice.CreateFromDirect3D11Device(device);
    }

我在CanvasControl上绘制后获得_mediaElementCanvasRenderTarget

private void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
    {
        args.DrawingSession.DrawImage(_mediaElementCanvasRenderTarget);
    }

由于设备不同而产生错误。我也尝试将一个设备设置为两个UIElements,但它没有帮助。

如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

您可以使用CanvasBitmap.CopyPixelsFromBitmap将图像数据从一个CanvasDevice的位图复制到使用其他设备的第二个位图。这将起作用,但我希望在不同设备之间进行复制会相当昂贵。

更有效的方法是更改​​您的设计,以避免将视频绘制到CanvasControl。在IBasicVideoEffect实现中进行所有视频处理,因此可以使用自己的XAML视频元素直接显示输出视频,而CanvasControl覆盖其他非视频内容 - 然后每个都可以使用自己独立的设备而无需复制。