如何有效地从RenderTargetBitmap创建MediaClip?

时间:2018-06-20 15:01:24

标签: c# video bitmap uwp hololens

我正在尝试使用c#在UWP应用中捕获XAML网格的视频。

我的方法。

1。使用RenderTargetBitmap使用renderTargetBitmap.RenderAsync

截屏

2。将数据转换为字节数组。

3。使用字节创建图像文件,然后使用BitmapEncoder

将其保存在磁盘上

4。使用MediaClip.CreateFromImageFileAsync

从该图像创建MediaClip

5。将剪辑添加到MediaComposition composition.Clips.Add(clip)

6。使用composition.RenderToFileAsync(video);

另存为视频

现在这种方法行之有效。

但是,您可以想像到磁盘上保存图像,然后读取它们以创建剪辑,它的SLOWWWW和帧率很低。

我正在寻找可以避免每个屏幕截图都进入磁盘的内容。 可以将RenderTargetBitmap(或IBufferbyte[])转换为MediaClip s而不需要转至磁盘的某种操作,或采用其他方法来保存视频的方法。

我正在为 Hololens 开发 UWP应用

2 个答案:

答案 0 :(得分:3)

尝试这样的事情:

与您所做的相同。

using (var soft = SoftwareBitmap.CreateCopyFromBuffer(pixels, BitmapPixelFormat.Bgra8, renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight, BitmapAlphaMode.Premultiplied))
{
   CanvasBitmap canvas = CanvasBitmap.CreateFromSoftwareBitmap(CanvasDevice.GetSharedDevice(), soft); 

   MediaClip m = MediaClip.CreateFromSurface(canvas, DateTime.Now - previousFrame); 
   composition.Clips.Add(m); 
}

记住要捕捉设备丢失的异常并创建新设备

答案 1 :(得分:0)

对于尝试从@Mediarea回答时遇到异常的人,请尝试以下操作:

CanvasRenderTarget rendertarget = null;
using (CanvasBitmap canvas = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), pixel_buffer, 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);

如果使用此选项,则错误 Stream处于无法处理请求的状态