如何以有效的方式从RenderTargetBitmap创建媒体剪辑?

问题描述 投票:8回答:2

我试图使用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[])转换为MediaClips,无需转到磁盘或保存视频的某种方法。

我正在为Hololens开发UWP应用程序。

c# video bitmap uwp hololens
2个回答
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); 
}

请记住捕获设备丢失的异常并创建新设备


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不处于处理请求的状态消失。

© www.soinside.com 2019 - 2024. All rights reserved.