我尝试了几种方法,并通过创建MediaClip对象的MediaComposition类找到了两个可行的解决方案。您可以将每个帧另存为JPEG文件,然后将所有图像最终渲染为视频文件。由于您经常需要访问硬盘驱动器,因此此过程非常缓慢。或者,您可以从框架的Direct3DSurface创建MediaStreamSample对象。这样,您可以将数据保存在RAM中(首先保存在GPU RAM中,如果已满则保存在RAM中),而不是理论上要快得多的硬盘驱动器。问题是调用MediaComposition类的RenderToFileAsync方法需要将所有MediaClips添加到内部列表中。在已经很短的记录时间之后,这导致超出RAM。在收集了大约5分钟的数据后,Windows已经创建了一个70GB的交换文件,该文件可以解决最初选择此路径的原因。
我还尝试了第三方库OpenCvSharp将已处理的帧另存为视频。我之前已经在python中完成了该任务,没有任何问题。但是在UWP中,如果没有StorageFile对象,我将无法与文件系统进行交互。因此,当我尝试将渲染的视频保存到文件系统时,我从OpenCvSharp获得的只是一个UnauthorizedAccessException。
所以,总结一下:我需要的是一种在数据仍然输入的同时将摄像机帧的数据呈现为视频的方法,因此我可以在处理完每个帧后对其进行处理,就像python OpenCV实现那样。做吧。我非常感谢每一个提示。这是我的代码的一部分,可以更好地理解上下文:
private void ColorFrameArrived(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
{
MediaFrameReference colorFrame = sender.TryAcquireLatestFrame();
if (colorFrame != null)
{
if (currentMode == StreamingMode)
{
colorRenderer.Draw(colorFrame, true);
}
if (currentMode == RecordingMode)
{
MediaStreamSample sample = MediaStreamSample.CreateFromDirect3D11Surface(colorFrame.VideoMediaFrame.Direct3DSurface, new TimeSpan(0, 0, 0, 0, 33));
ColorComposition.Clips.Add(MediaClip.CreateFromSurface(sample.Direct3D11Surface, new TimeSpan(0, 0, 0, 0, 33)));
}
}
}
private async Task CreateVideo(MediaComposition composition, string outputFileName)
{
try
{
await mediaFrameReaderColor.StopAsync();
mediaFrameReaderColor.FrameArrived -= ColorFrameArrived;
mediaFrameReaderColor.Dispose();
StorageFolder folder = await documentsFolder.GetFolderAsync(directory);
StorageFile vid = await folder.CreateFileAsync(outputFileName + ".mp4", CreationCollisionOption.GenerateUniqueName);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
await composition.RenderToFileAsync(vid, MediaTrimmingPreference.Precise);
stopwatch.Stop();
Debug.WriteLine("Video rendered: " + stopwatch.ElapsedMilliseconds);
composition.Clips.Clear();
composition = null;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
我正在尝试使用MediaFrameReader录制摄像机的视频。对于我的应用程序,我需要MediaFrameReader实例单独处理每个帧。我试图申请...
[我正在尝试使用MediaFrameReader录制摄像机的视频。对于我的应用程序,我需要MediaFrameReader实例分别处理每个帧。