【c#】画面を録画する方法(改良1)

【c#】画面を録画する方法の記事の内容だと、 動画ファイルの容量が2GBあたりを超えると保存できなくなってしまいますので対策を考えました。

本記事で紹介するコードは、1ファイルの容量が2GB付近になるとファイルを分割します。また、ファイルが多くなりすぎるとごちゃごちゃするのでサブフォルダーを作ってそこに一連の動画ファイルを格納する処理にしました。

イメージ

下記のコードで上記を行います。

string outFile;
long fileNo;
string subFolder;

fileNo = 1;
DateTime nowDateTime = DateTime.Now;

subFolder = Directory.GetCurrentDirectory() + "\\録画_" + nowDateTime.ToString("yyyyMMdd-HHmmss") + "\\";
outFile = subFolder + "録画_" + nowDateTime.ToString("yyyyMMdd-HHmmss") + "_" + fileNo.ToString() + ".avi";

//動画ファイルの保管用のサブフォルダーを作る。
if (!System.IO.Directory.Exists(subFolder)) { System.IO.Directory.CreateDirectory(subFolder); }

Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics g = Graphics.FromImage(bitmap);

AForge.Video.VFW.AVIWriter aviWriter = new AForge.Video.VFW.AVIWriter();
aviWriter.FrameRate = 10;
aviWriter.Open(outFile, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

System.IO.FileInfo file;
for (int i = 0; i < 1000; i++)
{
    g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bitmap.Size);
    aviWriter.AddFrame(bitmap);
    await Task.Delay(100);

    //作成中の動画ファイルの容量を確認し、2GB付近の場合には新しいファイルを作って記録を続ける。
    file = new System.IO.FileInfo(outFile);
    if (file.Length > 2000000000)
    {
        aviWriter.Close();
        fileNo++;
        outFile = subFolder + "録画_" + nowDateTime.ToString("yyyyMMdd-HHmmss") + "_" + fileNo.ToString() + ".avi";
        aviWriter.Open(outFile, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    }
}

aviWriter.Close();

bitmap.Dispose();
g.Dispose();

MessageBox.Show("録画が完了しました。");

参考になれば幸いです。

タイトルとURLをコピーしました