我试图使用MediaComposition
和MediaClips
从UI的屏幕截图生成视频。基本上,我使用间隔设置为50毫秒的DispatcherTimer
并像这样处理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(1000/60));
MediaCompositions[MediaCompositionNumber].Clips.Add(m);
}
并停止录制,我使用了如下的“按钮”点击事件:
private async void Button_Click(object sender, RoutedEventArgs e)
{
tm.Stop();
StorageFile file = await folder.CreateFileAsync("Video" + identifier + ".mp4", CreationCollisionOption.ReplaceExisting);
if (file is null)
return;
await mediaComposition.RenderToFileAsync(file, MediaTrimmingPreference.Precise, MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD1080p));
mediaComposition.Clips.Clear();
}
在大多数情况下,此代码可以正常工作。但是,当用户界面很大时,就像占据整个屏幕一样,CanvasRenderTarget rendertarget
必须容纳更多数据。结果是,RAM消耗非常高。
在顶部查看应用程序 Win2DVideoRenderingTest 的内存消耗:
我自己对这么大的内存消耗没有任何问题,但是问题是,整个操作系统几乎变得无响应或非常缓慢。在超过1.5-1.6 GB内存后,有时消耗量突然减少到150 MB左右(为什么?),但是操作系统仍然变得更加无响应。我什至不得不重新启动桌面,因为那时我什么也做不了。
最终视频大小仅为21.7 MB。可能是原始的,未压缩的位图数据占用了这么多的内存。但是我的机智说,应该有某种方法,可能是压缩位图数据,或者可能是以某种方式将这些数据卸载到磁盘上?
有什么办法可以减少内存消耗?