在MediaComposition中添加MediaClips会占用过多RAM

时间:2018-10-16 16:23:17

标签: uwp

我试图使用MediaCompositionMediaClips从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 的内存消耗: memory consumtion

我自己对这么大的内存消耗没有任何问题,但是问题是,整个操作系统几乎变得无响应或非常缓慢。在超过1.5-1.6 GB内存后,有时消耗量突然减少到150 MB左右(为什么?),但是操作系统仍然变得更加无响应。我什至不得不重新启动桌面,因为那时我什么也做不了。

最终视频大小仅为21.7 MB。可能是原始的,未压缩的位图数据占用了这么多的内存。但是我的机智说,应该有某种方法,可能是压缩位图数据,或者可能是以某种方式将这些数据卸载到磁盘上?

有什么办法可以减少内存消耗?

0 个答案:

没有答案