5

私の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));
}
4

1 に答える 1

3

フレームをjpegとして一時フォルダまたはmjpegファイルにキャプチャし、ユーザーが希望するときにaviビデオファイルに再処理することができます。これにより、「オンザフライ」で実行する必要のある処理量が削減され、リソースが解放され、システムがより高く、より規則的なフレームレートに到達できるようになります。

于 2012-04-27T16:25:20.830 に答える