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

ビデオストリームを圧縮ビデオファイルとして保存する方法を説明します。 動画をAVIファイルとして保存するプログラマーズガイド>動画をAVIファイルとして保存するの例とは違い、MediaStreamSinkクラスライブラリリファレンス>クラス>MediaStreamSinkを使って様々なビデオフォーマットで録画することができます。

今回のサンプルプログラムのC#用のソースコードはMy Documents/IC Imaging Control 3.5内の以下ののディレクトリに格納されています。

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 メソッドへのコールを追加します。
[C#]
private void btnStartLive_Click( object sender, EventArgs e )
{
     icImagingControl1.LiveStart();
}
[C#]
private void btnStopLive_Click( object sender, EventArgs e )
{
    icImagingControl1.LiveStop();
}

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


ビデオ録画ダイアログ

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


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

[C#]
private void SaveVideoForm_Load( object sender, EventArgs e )
{
    cboMediaStreamContainer.DataSource = _imagingControl.MediaStreamContainers;
    cboVideoCodec.DataSource = _imagingControl.AviCompressors;
    txtFileName.Text = 
                System.IO.Path.ChangeExtension("video.avi", CurrentMediaStreamContainer.PreferredFileExtension);
    btnStopCapture.Enabled = false;
}

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

[C#]
private void btnStartCapture_Click( object sender, EventArgs e )
{
    _sink = new TIS.Imaging.MediaStreamSink( CurrentMediaStreamContainer, CurrentVideoCodec, txtFileName.Text );
    _sink.SinkModeRunning = !chkPause.Checked;
    _oldLiveModeSetting = _imagingControl1.LiveVideoRunning;
    _odlSink = _imagingControl.Sink;
    _imagingControl1.LiveStop();
    _imagingControl1.Sink = _sink;
    _imagingControl1.LiveStart();
    btnStartCapture.Enabled = false;
    btnStopCapture.Enabled = true;
    btnClose.Enabled = false;
}

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

[C#]
private void chkPause_CheckedChanged( object sender, EventArgs e )
{
     if (_sink != null)
     {
         _sink.SinkModeRunning = !chkPause.Checked;
     }
}

ビデオキャプチャはたとえSinkModeRunningクラスライブラリリファレンスクラス>BaseSink>BaseSink.SinkModeRunning プロパティがFalseであっても開始することができます。この場合、画像ストリームは初期化された後に開始され、ライブ画像が表示されます。しかし、SinkModeRunningクラスライブラリリファレンスクラス>BaseSink>BaseSink.SinkModeRunning プロパティがTrueになるまで画像を動画ファイルとして保存しません。これによってイベントに応じてビデオキャプチャの開始、停止、再開を切り替えることができるようになります。

以上でプログラムが実行可能になります。コーデックを選択し動画ファイルを作成します。ビデオストリームの圧縮はCPUに高い負荷をかけることになる為、全てのコーデックが最大の解像度、フレームレートで動くというわけではありません。