首页 > 解决方案 > 使用合成从 UWP 中的 UI 控件创建视频

问题描述

我正在创建一个应用程序,它获取视频并覆盖来自无人机的传感器数据。

请在这里观看它的实际操作:

https://youtu.be/eAOjImJci3M

但这不会编辑视频,它只是在应用程序上。

我的目标是制作一个带有叠加数据的新视频。随着时间的推移,我如何捕捉 UI 的元素并加以利用MediaClip

标签: c#.netxamluwp

解决方案


简答:每隔一定间隔截取UI截图,然后将它们累加生成视频:

长答案:让我们将您要记录的 UI 命名为myGrid,以便在间隔内获取屏幕截图,您可以使用 a DispatcerTimer,并Tick像这样处理事件:

private async void Tm_Tick(object sender, object e)
{
    RenderTargetBitmap rendertargetBitmap = new RenderTargetBitmap();
    await rendertargetBitmap.RenderAsync(myGrid);
    var bfr = await rendertargetBitmap.GetPixelsAsync();

    CanvasRenderTarget rendertarget = null
    using (CanvasBitmap canvas = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), bfr, rendertargetBitmap.PixelWidth, rendertargetBitmap.PixelHeight, Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized))
    {
        rendertarget = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), canvas.SizeInPixels.Width, canvas.SizeInPixels.Height, 96);
        using (CanvasDrawingSession ds = rendertarget.CreateDrawingSession())
        {
            ds.Clear(Colors.Black);
            ds.DrawImage(canvas);
        }
    }
    MediaClip m = MediaClip.CreateFromSurface(rendertarget, TimeSpan.FromMilliseconds(80));
    mc.Clips.Add(m);
}

mcMediaComposition我之前声明的对象。

完成录制后,停止DispatcherTimer并将视频保存在磁盘上,如下所示:

tm.Stop();
await mc.RenderToFileAsync(file, MediaTrimmingPreference.Precise, MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Vga));

tmDispatcherTimer我之前声明的,file是一个StorageFile带有 mp4 的扩展名。

此过程不需要您将每个屏幕截图保存到磁盘。

如果您想知道我为什么使用附加CanvasRenderTarget的 ,那是因为这个问题。

希望有帮助。


推荐阅读