Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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# 什么';用于将png文件转换为视频文件的正确帧速率是多少?_C#_Video_Png_Aforge_Avi - Fatal编程技术网

C# 什么';用于将png文件转换为视频文件的正确帧速率是多少?

C# 什么';用于将png文件转换为视频文件的正确帧速率是多少?,c#,video,png,aforge,avi,C#,Video,Png,Aforge,Avi,每1000/60fps毫秒,我拍摄一个窗口的屏幕截图,并将其作为png文件保存到一个目录中,然后使用这些图像创建一个AVI文件。但我不知道我应该如何使用帧速率。我如何定义它?它基于宽度或高度或其他什么?我试图复制的默认帧速率使用的,我发现它是1000。。我尝试了这个速率,但是视频输出速度非常慢。一些文档示例使用25。我真的不知道如何定义它 const int width = 1920; const int height = 1080;

每1000/60fps毫秒,我拍摄一个窗口的屏幕截图,并将其作为png文件保存到一个目录中,然后使用这些图像创建一个AVI文件。但我不知道我应该如何使用帧速率。我如何定义它?它基于
宽度
高度
或其他什么?我试图复制的默认帧速率使用的,我发现它是1000。。我尝试了这个速率,但是视频输出速度非常慢。一些文档示例使用
25
。我真的不知道如何定义它

            const int width = 1920;
            const int height = 1080;
            const int frameRate = 60;

using (var writer = new VideoFileWriter())
            {
                writer.Open("output.avi", width, height, frameRate, VideoCodec.MPEG4);

                foreach (string file in Directory.EnumerateFiles(dest_path, "*.png"))
                {
                    using (var img = (Bitmap)Image.FromFile(file))
                    {
                        writer.WriteVideoFrame(img);
                    }
                }
            }
用于拍摄快照的代码:

int i = 0;
        void doRecord()
        {  
            using (var img = GetScreenshot(handle))
            {
                string filename = Path.Combine(dest_path, string.Format("{0}.png", ++i));
                img.Save(filename, ImageFormat.Png);
            }
        }

        public Bitmap GetScreenshot(IntPtr hwnd)
        {
            RECT rc;

            if (!GetWindowRect(hwnd, out rc))
                throw new Win32Exception(Marshal.GetLastWin32Error());

            Bitmap bmp = new Bitmap(rc.right - rc.left, rc.bottom - rc.top, PixelFormat.Format32bppArgb);
            using (var gfxBmp = Graphics.FromImage(bmp))
            {
                IntPtr hdcBitmap = gfxBmp.GetHdc();
                bool succeeded = PrintWindow(hwnd, hdcBitmap, 0);
                gfxBmp.ReleaseHdc(hdcBitmap);
                if (!succeeded)
                {
                    gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size));
                }
                IntPtr hRgn = CreateRectRgn(0, 0, 0, 0);
                GetWindowRgn(hwnd, hRgn);
                Region region = Region.FromHrgn(hRgn);
                if (!region.IsEmpty(gfxBmp))
                {
                    gfxBmp.ExcludeClip(region);
                    gfxBmp.Clear(Color.Transparent);
                }
                return bmp;
            }
        }
我使用计时器拍摄屏幕截图,设置如下:

const int fps = 60;
timer1.Interval = 1000 / fps;
timer1.Start();


您拍摄的图像的形状和/或大小与帧速率之间绝对没有相关性。

简短回答:

您需要计算每秒截图的数量,并对帧速率进行编号

长答案:

我认为您没有理解帧速率的含义,我将解释: 人眼(和大多数动物一样)有一种称为“”的特性,它基本上允许我们将物体的运动解释为连续的运动图像。这是所有视频都基于的概念

如果你给一个跑步的人拍了一堆照片,然后很快地把它们放在你眼前,你会看到这个人在移动。但这不一定和实际的人花的时间相同。让我们在这里输入一些数字作为上下文

你让你的朋友史蒂夫跑1公里(大约半英里),然后你开始给他拍很多跑步的照片。实际上,你每秒拍60张照片。现在平均每人以10公里/小时的速度跑步,让我们使用这个速度。史蒂夫跑1公里需要1/10小时,因为1小时内有3600秒,这与360秒或6分钟相同。因此,您已经拍摄了(60*360)21600张照片

数据摘要:

  • 长跑:1公里
  • 速度:10公里/小时
  • 时间:360秒
  • 每秒照片数:60
  • 照片总数:21600
现在,如果你想复制这些照片,那么你看照片的时间和史蒂夫跑那段距离的时间是一样的,你必须每秒显示你在那一秒钟拍的60张照片。所以你会每秒显示60张照片。制作视频时,您将这些照片中的每一张都称为“帧”,因此您使用的帧速率为60帧/秒

如果你想播放史蒂夫跑步的慢动作视频,你需要降低fps的数量,降低到30 fps,速度减半。这会让你有一个12分钟长的慢动作视频

请记住,视频的帧速率通常超过24帧,帧速率越低,视频的“滞后”程度就越高


注意:我不建议在屏幕/窗口录制中使用这种方法,因为它会导致计算机资源(CPU、RAM和硬盘)的巨大浪费。您应该查找一些已经为您完成所有录制和修补的库。不幸的是,我没有任何建议。

您拍摄的图像的形状和/或大小与帧速率之间绝对没有相关性。

简短回答:

您需要计算每秒截图的数量,并对帧速率进行编号

长答案:

我认为您没有理解帧速率的含义,我将解释: 人眼(和大多数动物一样)有一种叫做“的属性,它基本上允许我们将物体的运动理解为一个连续的运动图像。这是所有视频都基于的概念

如果你给一个跑步的人拍了一堆照片,然后很快地把它们放在你眼前,你会看到这个人在移动。但这不一定和实际的人花的时间相同。让我们在这里输入一些数字作为上下文

你让你的朋友史蒂夫跑1公里(大约半英里),然后你开始给他拍很多跑步的照片。实际上,你每秒拍60张照片。现在平均每人以10公里/小时的速度跑步,让我们使用这个速度。史蒂夫跑1公里需要1/10小时,因为1小时内有3600秒,这与360秒或6分钟相同。因此,您已经拍摄了(60*360)21600张照片

数据摘要:

  • 长跑:1公里
  • 速度:10公里/小时
  • 时间:360秒
  • 每秒照片数:60
  • 照片总数:21600
现在,如果你想复制这些照片,那么你看照片的时间和史蒂夫跑那段距离的时间是一样的,你必须每秒显示你在那一秒钟拍的60张照片。所以你会每秒显示60张照片。制作视频时,您将这些照片中的每一张都称为“帧”,因此您使用的帧速率为60帧/秒

如果你想播放史蒂夫跑步的慢动作视频,你需要降低fps的数量,降低到30 fps,速度减半。这会让你有一个12分钟长的慢动作视频

请记住,视频的帧速率通常超过24帧,帧速率越低,视频的“滞后”程度就越高


注意:我不建议在屏幕/窗口录制中使用这种方法,因为它会导致计算机资源(CPU、RAM和硬盘)的巨大浪费。您应该查找一些已经为您完成所有录制和修补的库。不幸的是,我没有任何建议。

人眼可以以每秒20帧的帧速率观看。良好的帧速率
private void timer1_Tick(object sender, EventArgs e)
{
   doRecord();
}