使用Composition

时间:2018-10-11 13:35:28

标签: c# .net xaml uwp

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

请在此处观看实际操作:

https://youtu.be/eAOjImJci3M

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

我的目标是制作一个上面覆盖了数据的新视频。如何随着时间的推移捕获UI的元素并从中制作一个MediaClip

谢谢!

1 个答案:

答案 0 :(得分:1)

简短答案:以一定间隔拍摄UI的屏幕截图,然后累积以制作视频:

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

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,而DispatcherTimer是带有mp4扩展名的file

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

如果您想知道为什么我再使用StorageFile,那是因为this问题。

希望有帮助。