Я хочу создать видео из нескольких RenderTargetBitmap
с в UWP.Я делаю это с помощью MediaClips
.Из RenderTargetBitmap
я могу получить IBuffer
или байтовый массив пикселей.Для создания MediaClip
мне нужен либо файл изображения, либо IDirect3DSurface
.Создание изображения просто для создания клипа очень дорого, поэтому я подумал об использовании IDirect3DSurface
.Как я могу это сделать?Я пробовал это:
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(RenderedGrid, 100, 100);
IBuffer pixels = await renderTargetBitmap.GetPixelsAsync();
var values = Enum.GetValues(typeof(DirectXPixelFormat));
CanvasBitmap bitmap=null;
foreach (DirectXPixelFormat format in values)
{
try
{
videoClip = new MediaComposition();
bitmap = CanvasBitmap.CreateFromBytes(myWidget.Device, pixels, renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight, format);
StorageFile video2 = await storageFolder.CreateFileAsync("video2" + ".mp4", CreationCollisionOption.ReplaceExisting);
MediaClip d = MediaClip.CreateFromSurface(bitmap, DateTime.Now - previousFrame+new TimeSpan(100));
videoClip.Clips.Add(d);
await videoClip.RenderToFileAsync(video2);
break;
}
catch(Exception e)
{
}
}
Я пробую все форматы в DirectXPixelFormat
, но ни один не работает.
У меня есть CanvasControl
с именем myWidget
, который пуст.
Я создаю CanvasBitmap
из Ibuffer
(CanvasBitmap
орудия IDirect3DSurface
)
Создайте Mediaclip
из CanvasBitmap
Add it to MediaComposition
.
Затем я пытаюсь выполнить рендеринг в видеофайл. Когда я пытаюсь сохранить файл, он выдает ошибку
System.Runtime.InteropServices.COMException Поток не в состоянии обработать запрос.
РЕДАКТИРОВАТЬ: я выяснил, где проблема, но не почему и не как ее исправить.
await videoClip.SaveAsync(video2);
videoClip= await MediaComposition.LoadAsync(video2);
var x=await videoClip.RenderToFileAsync(video2);
Теперь с помощью этих трех строк я могу сохранить видео,но используя только третью строку, выдает ошибку выше.Я не могу понять это.Почему сохранение и загрузка решают проблему ??