c# - 使用合成从 UWP 中的 UI 控件创建视频
问题描述
我正在创建一个应用程序,它获取视频并覆盖来自无人机的传感器数据。
请在这里观看它的实际操作:
但这不会编辑视频,它只是在应用程序上。
我的目标是制作一个带有叠加数据的新视频。随着时间的推移,我如何捕捉 UI 的元素并加以利用MediaClip
?
解决方案
简答:每隔一定间隔截取UI截图,然后将它们累加生成视频:
长答案:让我们将您要记录的 UI 命名为myGrid
,以便在间隔内获取屏幕截图,您可以使用 a DispatcerTimer
,并Tick
像这样处理事件:
private async void Tm_Tick(object sender, object e)
{
RenderTargetBitmap rendertargetBitmap = new RenderTargetBitmap();
await rendertargetBitmap.RenderAsync(myGrid);
var bfr = await rendertargetBitmap.GetPixelsAsync();
CanvasRenderTarget rendertarget = null
using (CanvasBitmap canvas = CanvasBitmap.CreateFromBytes(CanvasDevice.GetSharedDevice(), bfr, 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);
}
mc
是MediaComposition
我之前声明的对象。
完成录制后,停止DispatcherTimer
并将视频保存在磁盘上,如下所示:
tm.Stop();
await mc.RenderToFileAsync(file, MediaTrimmingPreference.Precise, MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Vga));
tm
是DispatcherTimer
我之前声明的,file
是一个StorageFile
带有 mp4 的扩展名。
此过程不需要您将每个屏幕截图保存到磁盘。
如果您想知道我为什么使用附加CanvasRenderTarget
的 ,那是因为这个问题。
希望有帮助。
推荐阅读
- c++ - 将任意数据传递给不接受“void* userarg”的 C++ 回调
- mapbox-gl-js - mapbox 创建、加载和编辑mbtiles的属性
- android - 如何将base64字符串发布到服务器?
- javascript - 样式未在组件中更新 - React
- php - CodeIgniter - 配置文件编辑后
- unix - 如何查找托管我的主目录和托管我的主目录的存储系统技术
- django - django inspectdb,检查期间如何写入多个表名
- mysql - 在 MySQL JOIN 中使用 ON 或 USING 或 WHERE 性能更高吗?
- python - Coremltools 转换 CNN + LSTM 问题
- ios - 当 isSecureTextEntry 属性设置为 true 时,UITextField 内容宽度错误