C# 什么';用于将png文件转换为视频文件的正确帧速率是多少?
每1000/60fps毫秒,我拍摄一个窗口的屏幕截图,并将其作为png文件保存到一个目录中,然后使用这些图像创建一个AVI文件。但我不知道我应该如何使用帧速率。我如何定义它?它基于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。。我尝试了这个速率,但是视频输出速度非常慢。一些文档示例使用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
注意:我不建议在屏幕/窗口录制中使用这种方法,因为它会导致计算机资源(CPU、RAM和硬盘)的巨大浪费。您应该查找一些已经为您完成所有录制和修补的库。不幸的是,我没有任何建议。您拍摄的图像的形状和/或大小与帧速率之间绝对没有相关性。 简短回答: 您需要计算每秒截图的数量,并对帧速率进行编号 长答案: 我认为您没有理解帧速率的含义,我将解释: 人眼(和大多数动物一样)有一种叫做“的属性,它基本上允许我们将物体的运动理解为一个连续的运动图像。这是所有视频都基于的概念 如果你给一个跑步的人拍了一堆照片,然后很快地把它们放在你眼前,你会看到这个人在移动。但这不一定和实际的人花的时间相同。让我们在这里输入一些数字作为上下文 你让你的朋友史蒂夫跑1公里(大约半英里),然后你开始给他拍很多跑步的照片。实际上,你每秒拍60张照片。现在平均每人以10公里/小时的速度跑步,让我们使用这个速度。史蒂夫跑1公里需要1/10小时,因为1小时内有3600秒,这与360秒或6分钟相同。因此,您已经拍摄了(60*360)21600张照片 数据摘要:
- 长跑:1公里
- 速度:10公里/小时
- 时间:360秒
- 每秒照片数:60
- 照片总数:21600
注意:我不建议在屏幕/窗口录制中使用这种方法,因为它会导致计算机资源(CPU、RAM和硬盘)的巨大浪费。您应该查找一些已经为您完成所有录制和修补的库。不幸的是,我没有任何建议。人眼可以以每秒20帧的帧速率观看。良好的帧速率
private void timer1_Tick(object sender, EventArgs e)
{
doRecord();
}