2016-05-18 10 views
0

Я пытаюсь привлечь видео, созданные в WinRT IBasicVideoEffect, к Win2d CanvasControl.Как обмениваться ресурсами между UWP MediaElement и 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); 
    } 

Здесь я получаю _mediaElementCanvasRenderTarget, после того, как я рисую его на CanvasControl

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

дает ошибку в связи с различными устройствами. Я также попытался установить одно устройство в UIElements, но это не помогло.

Как справиться с этой ситуацией?

ответ

1

Вы можете использовать CanvasBitmap.CopyPixelsFromBitmap, чтобы скопировать данные изображения из растрового изображения одного CanvasDevice во второй растровый рисунок, используя другое устройство. Это будет работать, но я ожидаю, что копирование между различными устройствами будет довольно дорогостоящим.

Более эффективный подход заключается в изменении дизайна, чтобы вообще не рисовать видео на CanvasControl. Выполняйте всю обработку видео в реализации IBasicVideoEffect, поэтому выходное видео может отображаться непосредственно с помощью собственного видеоэлемента XAML, в то время как CanvasControl накладывает другой контент без видео - каждый может использовать свое собственное устройство без необходимости копирования.

+0

Копирование очень дорого. Я не могу себе этого позволить. –

+0

Причина, по которой я не могу использовать обработку внутри IBasicVideoEffect, заключается в том, что я должен использовать растровое изображение кадра из границ MediaElement. Я также попытался установить устройство MediaElement в CanvasControl как пользовательское устройство, но оказалось, что оно тоже дорого. Я обнаружил, что мои (интегрированные и дискретные) графические процессоры и процессор загружены достаточно. Похоже, что процесс копирования проходит через все их. ПК с одним графическим процессором работают быстрее без перегрузок ЦП. –