私のWinForms.NET4 C#アプリケーションは、ユーザーがデスクトップを操作している間、デスクトップを記録します。
システムの速度に応じて、AForgeFFMPEGまたはVFWラッパーを使用します。もちろん、キャプチャはバックグラウンドスレッドで行われます。
いずれの場合も、ラッパーはフレームレートを事前に指定する必要があります。キャプチャ頻度は不確定であり、ターゲットマシンのビジー状態の影響を受けやすいため、これは問題があります。優れたシステムでは、最大10FPSを取得します。
したがって、ここで2つの問題があります。
- 実際のキャプチャフレームレートに基づいてフレームを整列させる方法は?
- おそらくAForge以外のソリューションを使用して、フレームレートを上げる方法は?
わかりやすくするために、使用するコードを以下に示します。
private void ThreadWork ()
{
int count = 0;
string filename = "";
RECT rect = new RECT();
System.Drawing.Bitmap bitmap = null;
System.Drawing.Graphics graphics = null;
System.DateTime dateTime = System.DateTime.Now;
System.IntPtr hWndForeground = System.IntPtr.Zero;
AForge.Video.FFMPEG.VideoFileWriter writer = null;
filename = @"c:\Users\Raheel Khan\Desktop\Temp\Capture.avi";
if (System.IO.File.Exists(filename))
System.IO.File.Delete(filename);
writer = new AForge.Video.FFMPEG.VideoFileWriter();
writer.Open
(
filename,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height,
10, // FPS
AForge.Video.FFMPEG.VideoCodec.MPEG4
);
bitmap = new Bitmap
(
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width,
System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height,
System.Drawing.Imaging.PixelFormat.Format24bppRgb
);
graphics = System.Drawing.Graphics.FromImage(bitmap);
dateTime = System.DateTime.Now;
while (System.DateTime.Now.Subtract(dateTime).TotalSeconds < 10) // 10 seconds.
{
graphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size);
rect = new RECT();
hWndForeground = GetForegroundWindow();
GetWindowRect(hWndForeground, ref rect);
graphics.DrawRectangle(Pens.Red, rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top);
graphics.DrawString(count++.ToString(), this.Font, Brushes.Red, 10, 10);
writer.WriteVideoFrame(bitmap);
System.Threading.Thread.Sleep(10);
}
writer.Close();
writer.Dispose();
System.Diagnostics.Process.Start(System.IO.Path.GetDirectoryName(filename));
}