我正在尝试使用c#在UWP应用中捕获XAML网格的视频。
我的方法。
1。使用RenderTargetBitmap使用renderTargetBitmap.RenderAsync
2。将数据转换为字节数组。
3。使用字节创建图像文件,然后使用BitmapEncoder
4。使用MediaClip.CreateFromImageFileAsync
5。将剪辑添加到MediaComposition composition.Clips.Add(clip)
6。使用composition.RenderToFileAsync(video);
现在这种方法行之有效。
但是,您可以想像到磁盘上保存图像,然后读取它们以创建剪辑,它的SLOWWWW和帧率很低。
我正在寻找可以避免每个屏幕截图都进入磁盘的内容。
可以将RenderTargetBitmap
(或IBuffer
或byte[]
)转换为MediaClip
s而不需要转至磁盘的某种操作,或采用其他方法来保存视频的方法。
我正在为 Hololens 开发 UWP应用。
答案 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处于无法处理请求的状态。