Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在UWP C中不使用MediaComposition从SoftwareBitmap或Direct3DSurface创建视频文件#_C#_Uwp_Video Capture_Mediacapture - Fatal编程技术网

C# 在UWP C中不使用MediaComposition从SoftwareBitmap或Direct3DSurface创建视频文件#

C# 在UWP C中不使用MediaComposition从SoftwareBitmap或Direct3DSurface创建视频文件#,c#,uwp,video-capture,mediacapture,C#,Uwp,Video Capture,Mediacapture,我试图在使用MediaFrameReader时录制相机的视频。对于我的应用程序,我需要MediaFrameReader实例单独处理每个帧。我尝试另外应用LowLagMediaRecording来简单地将camerastream保存到一个文件中,但似乎不能同时使用这两种方法。这意味着我只能使用MediaFrameReader来访问frame方法中的每一帧 我尝试了几种方法,并找到了两种使用MediaComposition类创建MediaClip对象的有效解决方案。您可以将每个帧保存为JPEG文件,

我试图在使用MediaFrameReader时录制相机的视频。对于我的应用程序,我需要MediaFrameReader实例单独处理每个帧。我尝试另外应用LowLagMediaRecording来简单地将camerastream保存到一个文件中,但似乎不能同时使用这两种方法。这意味着我只能使用MediaFrameReader来访问frame方法中的每一帧

我尝试了几种方法,并找到了两种使用MediaComposition类创建MediaClip对象的有效解决方案。您可以将每个帧保存为JPEG文件,并最终将所有图像渲染为视频文件。这一过程非常缓慢,因为您经常需要访问硬盘驱动器。也可以从帧的Direct3DSurface创建MediaStreamSample对象。通过这种方式,您可以将数据保存在RAM中(首先在GPU RAM中,如果已满,则保存在RAM中),而不是硬盘驱动器中,理论上要快得多。问题在于,调用MediaComposition类的RenderToFileAsync方法需要将所有MediaClips都添加到内部列表中。这会导致在已经很短的记录时间后超过RAM。在收集了大约5分钟的数据后,windows已经创建了一个70GB的交换文件,这与当初选择此路径的原因无关

我还尝试使用第三方库OpenCvSharp将处理后的帧保存为视频。我以前在python中做过,没有任何问题。但在UWP中,如果没有StorageFile对象,我无法与文件系统交互。因此,当我试图将渲染的视频保存到文件系统时,我从OpenCvSharp获得的只是一个未经授权的访问异常

因此,总结一下:我需要的是一种方法,在数据仍在输入时将相机帧的数据渲染到视频中,这样我就可以在处理完每一帧后对其进行处理,就像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实例分别处理每个帧。

请创建自定义视频效果并将其添加到MediaCapture对象以实现您的要求。使用自定义视频效果将允许我们在不使用MediaFrameReader的情况下在MediaCapture对象的上下文中处理帧,这样就消除了您提到的MediaFrameReader的所有限制

此外,它还具有许多内置效果,允许我们分析相机帧,有关更多信息,请查看以下文章:

#MediaCapture.AddVideoEffectAsync

#自定义视频效果

#用于分析相机帧的效果


谢谢。

这似乎是在uwp平台中将软件位图转换为视频文件的唯一方法。但是
MediaComposition
通常用于剪辑视频,它无法处理实时帧。我不明白你为什么只需要使用MediaFrameReader来捕获视频。嗨,谢谢你的回复。我需要打电话给
MediaFrameReader
来完成一些任务,比如获取每个帧的时间戳。谢谢您的回复。我尝试了你的方法,但遇到了两个问题:1。使用AddVideoEffectAsync函数大大降低了应用程序的速度。2.我无法使用MediaFrameReader提取帧的时间戳。最后,我使用MediaFrameReader找到了一个解决方案。我会在有时间的时候更新我的帖子。不过,谢谢你的建议,