【问题标题】:Create video from UI controls in UWP using Composition使用合成从 UWP 中的 UI 控件创建视频
【发布时间】:2018-10-11 13:35:27
【问题描述】:

我正在创建一个应用程序,它可以拍摄视频并覆盖无人机的传感器数据。

请在此处观看实际操作:

https://youtu.be/eAOjImJci3M

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

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

【问题讨论】:

  • 这与您所描述的内容大致相同。捕获应用程序并将其保存为视频。在您的情况下,您需要视频和叠加层。 stackoverflow.com/questions/51027900/…
  • 感谢您的参考,但这个问题仍然无法接受,因为它需要为每一帧生成一个文件(在磁盘上)。
  • 对不起,我的意思是答案,而不是问题:)

标签: c# .net xaml uwp


【解决方案1】:

简答:按一定的时间间隔截取UI截图,然后累积生成视频:

长答案:让我们将您要录制的 UI 命名为 myGrid,要在间隔内获取屏幕截图,您可以使用 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);
}

mc 是我之前声明的MediaComposition 对象。

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

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

tm 是我之前声明的 DispatcherTimerfile 是带有 mp4 扩展名的 StorageFile

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

如果你想知道我为什么使用额外的CanvasRenderTarget,那是因为this 的问题。

希望对您有所帮助。

【讨论】:

  • 我会尽快尝试的!谢谢你。顺便问一下,你能看看这个关于覆盖的其他问题吗? stackoverflow.com/questions/52815829/… 再次感谢,提前:)
  • 前面的例子有问题。现在试试这个。
  • 我已经在使用你的代码了,它可以工作了!但是我对它消耗的内存有一个大问题:我正在从超过 5000 个静止图像中生成一个视频,它总是让我的电脑内存不足。只有 300 张图像,它需要 6 GB 的 RAM。
  • 嗯,我认为这很正常。内存和速度之间的权衡。您可以将每个位图保存在本地驱动器上,这样就不会占用那么多 RAM。但那时它会很慢。一件事是,我一直看到视频渲染让电脑变慢。
  • 另外,渲染完成后,清空clip列表:mc.Clips.Clear()
猜你喜欢
  • 2017-02-14
  • 2019-10-08
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多