用于将 png 文件转换为视频文件的正确帧速率是多少?

What's the proper frame rate used to convert png files to a video file?

每 1000 / 60fps 毫秒我截取 window 的屏幕截图并将其作为 png 文件保存到目录然后我使用 VideoFileWriter to create a AVI file from those images. But I don't how frame rate should I use. How do I define it? it's based on width or height or what else? I tried copy the default frame rate used by virtualdub,我发现它是 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();

private void timer1_Tick(object sender, EventArgs e)
{
   doRecord();
}

你拍的照片的形状and/or大小和帧率绝对没有关系

简答:

您需要计算每秒截屏的次数,并计算帧速率。

长答案:

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

如果你拍了一堆 运行ning 人的照片,然后在你眼前快速通过,你会看到这个人在移动。但这不一定与真人所花的时间相同。让我们在这里输入一些数字作为上下文。

你让你的朋友史蒂夫 运行 1 公里(大约半英里)然后你开始给他 运行 拍很多照片。实际上,您每秒拍摄 60 张照片。现在普通人 运行s 在 10 km/h 所以让我们使用那个 运行ning 速度。 运行 1 公里需要史蒂夫 1/10 小时,因为 1 小时有 3600 秒,与 360 秒 或 6 分钟相同。所以你一共拍了 (60*360) 21600 张照片.

数据回顾:

  • 长度运行:1公里
  • 速度:10km/h
  • 时间:360 秒
  • 每秒照片数:60
  • 照片总数:21600

现在,如果您想重现这些照片,那么您看到它们所花费的时间与史蒂夫到达 运行 那个距离所花费的时间相同,您必须每秒显示您拍摄的 60 张照片 那个秒。所以你最终会每秒显示 60 张照片。当您制作视频时,您将这些照片中的每一张都称为“”,因此您使用的是 60 frames/second 帧速率 (或每秒帧数)。

如果您想显示 Steve 运行ning 的慢动作视频,您需要降低 fps 的数量,将速度降至 30 fps 以获得一半的速度。那会让你有一个 12 分钟长的慢动作视频。

请记住,视频通常超过 24 fps,fps 越低,视频 "lagged" 看起来会更好

注意:我严重不建议使用该方法进行screen/window录制,因为它会导致计算机资源(CPU、RAM 和硬盘)的巨大浪费磁盘)。您应该查找一些已经为您进行所有录制和修补的库。不幸的是,我没有什么可以推荐的。

人眼可以以 20 fps 的帧速率观看。一个好的帧速率可能比这大一个。但这取决于您制作视频的目的。如果视频只是为了娱乐,我推荐 30fps。