用于将 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。
每 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。