WEBカメラで録画する方法 (AForge.NET利用)

概要

AForge.NET Frameworkというフリーのライブラリを使用して画像を動画に変換できる。
1本の動画は2GByteまで。
音声無し
AForge.NETライブラリからライブラリを直接ダウンロード。
多くはNuGetでもインストール可能。

静止画を動画に変換

using AForge.Video.VFW;
public partial class MyForm : Form
{
  private void MyForm_Load(object sender, EventArgs e)
  {

    AVIWriter writer = new AVIWriter();
    
    writer.Open(fileName: @"C:\data\test.avi", width: 500, height: 300);
    
    // フレームレート設定
    aviWriter.FrameRate = 30;
    
    // 1フレームをBitMapで定義
    Bitmap img = new Bitmap(500, 300);
    
    //ImageオブジェクトのGraphicsオブジェクトを作成する
    Graphics g = Graphics.FromImage(img);
    
    //全体を黒で塗りつぶす
    g.FillRectangle(Brushes.Black, g.VisibleClipBounds);
    
    for (int i = 0; i < 100; i++)
    {
      //黄色い扇形を描画する
      g.DrawPie(pen:Pens.Yellow,
        x:60 + i,
        y:10, width:80,
        height:80,
        startAngle:30,
        sweepAngle:300);
      
      //録画(1フレームを追加)
      writer.AddFrame(img);
    }
    
    writer.Close();
  }
}

WEBカメラの静止画を動画に変換(方法1)

using AForge.Video.DirectShow;
public partial class MyForm : Form
{
  private void MyForm_Load(object sender, EventArgs e)
  {

    // ビデオキャプチャデバイスを選択するダイアログの生成
    var form = new VideoCaptureDeviceForm();
    // 選択ダイアログを開く
    if (form.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
    
    // 選択されたデバイスをVideoSourcePlayerのソースに設定
    videoSourcePlayer.VideoSource = form.VideoDevice;
    
    // ビデオキャプチャのスタート
    videoSourcePlayer.Start();
    
    
    AVIWriter writer = new AVIWriter();
    writer.Open(fileName: @"C:\data\test.avi", width: 500, height: 300);
    
    Bitmap bmp = videoSourcePlayer.GetCurrentVideoFrame();
    writer.AddFrame(img);
    
    writer.Close();
    
    
    // 閉じるときの処理
    if (videoSourcePlayer.VideoSource != null &&
     videoSourcePlayer.VideoSource.IsRunning)
    {
      videoSourcePlayer.VideoSource.SignalToStop();
      videoSourcePlayer.VideoSource = null;
    }
    
  }
}

WEBカメラの静止画を動画に変換(方法2)

上の方法でカメラから静止画を取得できない場合(カメラの問題?)
//AForge.NETライブラリ
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Video.VFW;
public partial class MyForm : Form
{

  AVIWriter writer = new AVIWriter();
  Bitmap img = new Bitmap(width: 640, height: 480);
  
  private void MyForm_Load(object sender, EventArgs e)
  {
    //カメラの取得
    FilterInfoCollection videoDevices
       = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    

    //カメラが複数台ある場合は配列内の数字を選択できる様にする工夫が必要。
    VideoCaptureDevice videoSource
       = new VideoCaptureDevice(videoDevices[0].MonikerString);
    
    //カメラの画像が更新される度にイベントを発生させる。
    videoSource.NewFrame += new NewFrameEventHandler(this.video_NewFrame);
    
    videoSource.DesiredFrameSize = new Size(width: 640, height: 480);
    videoSource.Start();
    
    writer.Open(fileName: @”C:\test.avi”, width: 640, height: 480);
  }
  
  private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
  {
    //静止画をBitMap形式で取得
    img = eventArgs.Frame;
    writer.AddFrame(frameImage: img);
  }
  
  private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
  {
    writer.Close();
  }
}