我试图使用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
(或IBuffer
或byte[]
)转换为MediaClip
s,无需转到磁盘或保存视频的某种方法。
我正在为Hololens开发UWP应用程序。
尝试这样的事情:
和你一样。
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);
}
请记住捕获设备丢失的异常并创建新设备
对于那些在尝试@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不处于处理请求的状态消失。