用 C# 录制全高清 60 FPS 视频

问题描述

我的应用程序使用高速相机。我正在尝试使用 C# 录制视频文件

任务非常“简单”:从相机录制视频。我们需要录制中等(更高更好)质量的视频以保存尽可能多的细节。

  • 分辨率: 1920 x 1080(全高清)
  • 每秒帧数 (FPS): 60
  • 比特率:我从 10000*1000 开始(但现在我不知道)
  • Mediacontainer:MP4、AVI(无所谓,我们只需要 解决我们的任务)
  • 编解码器:也无所谓,我们只需要速度和质量。
  • 视频文件的最大大小:10 GB/小时

在录制过程中,相机本身(而不是用户)可以更改相机的帧率,因此有必要为每一帧或其他任何东西设置时间戳。

问题录制速度不够快。 示例:使用 AForge 库,生成图片(“白”噪声),测试视频时长为 20 秒。

使用不同编解码器(由 AForge 提供)创建视频的持续时间:

  • 编解码器:MPEG4,时间:33,703
  • 编解码器:WMV1,时间:45,338
  • 编解码器:WMV2,时间:45,530
  • 编解码器:MSMPEG4v2,时间:43,775
  • 编解码器:MSMPEG4v3,时间:44,390
  • 编解码器:H263P,时间:38,894
  • 编解码器:FLV1,时间:39,151
  • 编解码器:MPEG2,时间:35,561
  • 编解码器:原始,时间:61,456

我们尝试过的另一个库对我们不满意。 由于奇怪的内部异常,Accord.FFMPEG 很慢。 EmguCV.FFMPEG 没有时间戳,因此它会创建损坏的视频。

将视频录制到 SSD 驱动器并没有给我们任何明显的加速。

Google 搜索没有提供明确的示例或现代解决方案来解决此任务。这是写在这里的主要原因。

有我们测试的代码示例:

private static void AForge_test()
    {
        Console.WriteLine("AForge test started...");
        unsafe
        {
            Stopwatch watch = new Stopwatch();

            Console.WriteLine("FPS: {0},W:{1},H:{2},T:{3}",fps,w,h,time);

            AForge.Video.FFMPEG.VideoCodec[] codecs = (AForge.Video.FFMPEG.VideoCodec[]) Enum.GetValues(typeof(AForge.Video.FFMPEG.VideoCodec));

            for(int k = 0; k < codecs.Length; k++)
            {
              /*  if (codecs[k] != VideoCodec.MPEG4)
                    continue;*/
                try
                {
                    watch.Restart();

                    Random r2 = new Random(200);
                    AForge.Video.FFMPEG.VideoFileWriter vw = new AForge.Video.FFMPEG.VideoFileWriter();
                    string name = String.Format("E:\\VideosHDD\\AForge_test_{0}_mid.avi",Enum.GetName(typeof(AForge.Video.FFMPEG.VideoCodec),codecs[k]));
                    vw.Open(name,codecs[k],10000 * 1000);

                    for (int i = 0; i < frames; i++)
                    {
                        vw.WriteVideoFrame(bmps[i%N]);
                    }

                    vw.Close();
                    vw.dispose();

                    watch.Stop();

                    Console.WriteLine("Codec: {0},Time: {1:F3}",codecs[k]),watch.ElapsedMilliseconds / 1000d);
                }
                catch(Exception ex)
                {
                    Console.WriteLine("Error " + codecs[k].ToString());
                }

            }
            
        }

        Console.ReadKey();
    }

附加:

  1. 我们已经准备好使用非免费的解决方案,但最好是免费的。
  2. 记录速度低的推测原因之一:(x86) 应用程序构建。我非常努力地寻找 x64 Aforge 建筑,但失败了。我们真的不知道应用架构对录制速度有什么影响。

我确定我不知道视频录制的所有背景和另一个“小”东西,所以我很乐意提供清晰解释的解决方案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)