2016-05-18 17 views
0

WinRT IBasicVideoEffectで作成したビデオをWin2d CanvasControlに描画しようとしています。UWP MediaElementとWin2d CanvasControlの間でリソースを共有するには?

Win2dビデオエフェクトの例は、WinRTコンポーネントとしてIBasicVideoEffectインターフェイスを実装したものです。 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

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

上に描画した後、ここで私は、_mediaElementCanvasRenderTargetを取得していますが、異なるデバイスに起因するエラーを与えます。私は両方のUIElementsに1つのデバイスを設定しようとしましたが、それは助けにはなりませんでした。

このような状況をどのように処理しますか?

答えて

1

CanvasBitmap.CopyPixelsFromBitmapを使用すると、CanvasDeviceのビットマップから他のデバイスを使用して2番目のビットマップに画像データをコピーできます。それはうまくいくだろうが、私はさまざまなデバイス間のコピーがかなり高価になると思う。

もっと効率的なアプローチは、ビデオをCanvasControlに描画しないようにデザインを変更することです。すべてのビデオ処理をIBasicVideoEffect実装内で行います。そのため、出力ビデオは独自のXAMLビデオ要素を使用して直接表示でき、CanvasControlは他の非ビデオコンテンツをオーバーレイします。

+0

コピーは非常に高価です。私はそのような余裕がない。 –

+0

IBasicVideoEffectの内部で処理を使用できないのは、MediaElement境界からフレームビットマップを使用する必要があるためです。 私はまた、カスタムデバイスとしてCanvasControlにMediaElementデバイスを設定しようとしましたが、それも高価に見えました。私は、私の両方の(統合されたディスクリートな)GPUとCPUが十分に読み込まれていることを知りました。それらをすべてコピーするプロセスのように見えます。 1つのGPUを搭載したPCは、CPUの過負荷がなくても高速に動作します。 –

関連する問題