0

我正在尝试将在 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);
    }

由于不同的设备而给出错误。我还尝试将一个设备设置为两个 UIElement,但没有帮助。

如何处理这种情况?

4

1 回答 1

1

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

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

于 2016-05-23T17:36:08.260 回答