Я пытался сгенерировать видео из скриншотов пользовательского интерфейса, используя MediaComposition
и MediaClips
.В основном я использовал DispatcherTimer
с интервалом, установленным на 50 миллисекунд, и обрабатывал событие 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
должен содержать намного больше данных.В результате потребление оперативной памяти чрезвычайно велико.
Посмотрите на потребление памяти приложением Win2DVideoRenderingTest вверху: ![memory consumtion](https://i.stack.imgur.com/P9vRx.gif)
У меня самого нет никаких проблем с этим огромнымпотребление памяти, но проблема в том, что вся операционная система становится почти не отвечающей или очень медленной.После превышения 1,5-1,6 ГБ памяти иногда потребление внезапно сокращается до 150 МБ или около того (почему?), Но операционная система по-прежнему перестает отвечать на запросы.Мне даже приходится перезагружать свой рабочий стол, потому что я ничего не могу сделать.
Окончательный размер видео составляет всего 21,7 МБ.Может быть, сырые, несжатые растровые данные занимают столько памяти.Но мой сообразительность говорит, что должен быть какой-то способ, может быть сжатие растровых данных, или может быть какая-то разгрузка этих данных на диск?
Есть ли способ уменьшить потребление памяти?