動画をキャプチャして保存する

ビデオストリームを圧縮ビデオファイルとして保存する方法を説明します。 動画をAVIファイルとして保存するプログラマーズガイド>動画をAVIファイルとして保存するの例とは違い、MediaStreamSinkクラスライブラリリファレンス>クラス>MediaStreamSink を使って様々なビデオフォーマットで録画することができます。
今回のサンプルプログラムのVB.NET 、C#用のソースコードはMy Documents/IC Imaging Control 3.4

内の以下ののディレクトリに格納されています。

samples\VB *\Capturing a Video File
samples\C# *\Capturing a Video File

プロジェクトの新規作成

新しいプロジェクトを作成し、IC imaging Controlをフォームに追加してください。プログラムを実行する前に、 はじめに: Visual Studio .NETプログラマーズガイド>Visual Studioでスタート にあるように映像デバイスの選択、入力方式、ビデオフォーマットを選択してください。もしくはデバイスを選択せずにプログラムを実行してください。その際はIC Imaging Controlによってデバイス選択のダイアログが出現します。選択をせずにダイアログを閉じた場合、プログラムはエラーメッセージを表示し、終了します。
フォームに3つのボタンを追加し、 CaptionプロパティをそれぞれStart LiveStop LiveCapture AVIとします。 またcmdStartLivecmdStopLivecmdCaptureVideoと名前を付けます。
IC Imaging Controlの LiveStartクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStart MethodLiveStopクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStop Method メソッドへのコールを追加します。

[VB.NET]
Private Sub btnStartLive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  Handles btnStartLive.Click
     IcImagingControl1.LiveStart()
End Sub
[C#]
private void btnStartLive_Click(object sender, EventArgs e)
{
     icImagingControl1.LiveStart();
}
[VB.NET]
Private Sub btnStopLive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  Handles btnStopLive.Click
     IcImagingControl1.LiveStop()
End Sub
[C#]
private void btnStopLive_Click(object sender, EventArgs e)
{
    icImagingControl1.LiveStop();
}

プログラムを実行してください。これでそれぞれのボタンをクリックすることでライブ画像のスタート、ストップなどの操作ができるようになります。しかしこれだけではビデオファイルの作成はできませんので、ライブビデオストリーム用のプレビューを作る必要があります。 これには通常録画の前にカメラをセットアップしなければいけません。

ビデオ録画ダイアログ

プロジェクトに新たなフォームを追加し、frmSaveVideoと名前を付けてください。コンテナフォーマット(動画ファイル形式)の選択用にコンボボックスを追加し、さらにビデオコーデックの選択用にもコンボボックスを作成します。そしてビデオファイル名の入力用にテキストボックスを、ビデオキャプチャをスタート、ストップさせる為のボタンも挿入します。(サンプルプロジェクトがありますので、そちらをロードすることをおすすめします。)

FormLoadイベント時、 コンボボックス内にはコンピューターにインストールされているコンテナフォーマットやビデオコーデックが入ります。

[VB.NET]
Private Sub SaveVideoForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
  Handles MyBase.Load
     cboMediaStreamContainer.DataSource = m_ImagingControl.MediaStreamContainers
     cboVideoCodec.DataSource = m_ImagingControl.AviCompressors

     txtFileName.Text =
           System.IO.Path.ChangeExtension("video.avi", CurrentMediaStreamContainer.PreferredFileExtension)

     btnStopCapture.Enabled = False
End Sub
[C#]
private void SaveVideoForm_Load(object sender, EventArgs e)
{
     cboMediaStreamContainer.DataSource = m_ImagingControl.MediaStreamContainers;

     cboVideoCodec.DataSource = m_ImagingControl.AviCompressors;

     txtFileName.Text =
              System.IO.Path.ChangeExtension("video.avi", CurrentMediaStreamContainer.PreferredFileExtension);

     btnStopCapture.Enabled = false;
}

"Start Capture" ボタンのClickイベントが現在選択中のコンテナフォーマット、コーデック、ファイル名と共にダイアログのm_Sink変数を初期化します。録画は LiveStartクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStart Method の呼び出しによって開始されます。

[VB.NET]
Private Sub btnStartCapture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  Handles btnStartCapture.Click
     m_Sink = New TIS.Imaging.MediaStreamSink
     m_Sink.StreamContainer = CurrentMediaStreamContainer
     m_Sink.Codec = CurrentVideoCodec
     m_Sink.Filename = txtFileName.Text
     m_Sink.SinkModeRunning = Not chkPause.Checked

     m_OldLiveMode = m_ImagingControl.LiveVideoRunning
     m_OldSink = m_ImagingControl.Sink

     m_ImagingControl.LiveStop()

     m_ImagingControl.Sink = m_Sink

     m_ImagingControl.LiveStart()

     btnStartCapture.Enabled = False
     btnStopCapture.Enabled = True
     btnClose.Enabled = False
End Sub
[C#]
private void btnStartCapture_Click(object sender, EventArgs e)
{
     m_Sink = new TIS.Imaging.MediaStreamSink();
     m_Sink.StreamContainer = CurrentMediaStreamContainer;
     m_Sink.Codec = CurrentVideoCodec;
     m_Sink.Filename = txtFileName.Text;
     m_Sink.SinkModeRunning = !chkPause.Checked;

     m_OldLiveMode = m_ImagingControl.LiveVideoRunning;
     m_OldSink = m_ImagingControl.Sink;

     m_ImagingControl.LiveStop();

     m_ImagingControl.Sink = m_Sink;

     m_ImagingControl.LiveStart();

     btnStartCapture.Enabled = false;
     btnStopCapture.Enabled = true;
     btnClose.Enabled = false;
}

Pauseボタンはチェックボックスとなっております。これはMediaStreamSink.SinkModeRunningクラスライブラリリファレンス>クラス>BaseSink>BaseSink.SinkModeRunning Propertyプロパティのセット、リセットに使われます。SinkModeRunningクラスライブラリリファレンス>クラス>BaseSink>BaseSink.SinkModeRunning Property プロパティがFalseである場合、ビデオキャプチャは停止します。これは画像ストリームのシンクパスのみが停止するということです。ライブ 画像は表示されますが、動画ファイルとして保存はされません。SinkModeRunningクラスライブラリリファレンス>クラス>BaseSink>BaseSink.SinkModeRunning Property プロパティがTrueであった場合、 は即座にビデオキャプチャを再開します。 前に開始された動画ファイルが続行されます。

[VB.NET]
Private Sub chkPause_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
  Handles chkPause.CheckedChanged
     If Not m_Sink Is Nothing Then
         m_Sink.SinkModeRunning = Not chkPause.Checked
     End If
End Sub
[C#]
private void chkPause_CheckedChanged(object sender, EventArgs e)
{
     if (m_Sink != null)
     {
         m_Sink.SinkModeRunning = !chkPause.Checked;
     }
}

ビデオキャプチャはたとえSinkModeRunningクラスライブラリリファレンス>クラス>BaseSink>BaseSink.SinkModeRunning Property プロパティがFalseであっても開始することができます。この場合、画像ストリームは初期化された後に開始され、ライブ画像が表示されます。しかし、 SinkModeRunningクラスライブラリリファレンス>クラス>BaseSink>BaseSink.SinkModeRunning Property プロパティがTrueになるまで画像を動画ファイルとして保存 することはできません。 これによってイベントに応じてビデオキャプチャの開始、停止、再開を切り替えることができるようになります。
以上でプログラムが実行可能になります。コーデックを選択し動画ファイルを作成します。ビデオストリームの圧縮はCPUに高い負荷をかけることになる為、全てのコーデックが最大の解像度、フレームレートで動くというわけではありません。