動画をAVIファイルとして保存する
ビデオストリームをAVIファイルとして保存する方法を説明します。
別のフォーマットで動画を保存する方法については、 動画をキャプチャして保存するプログラマーズガイド>動画をAVIファイルとして保存するの例を参照ください。
今回のサンプルプログラムのC#用のソースコードはMy Documents/IC Imaging
Control 3.5内の以下ののディレクトリに格納されています。
samples\C# *\Capturing an AVI File
プロジェクトの新規作成
新しいプロジェクトを作成し、IC imaging Controlをフォームに追加してください。プログラムを実行する前に、 はじめに: Visual Studio .NETプログラマーズガイド>Visual Studioでスタートにあるように映像デバイスの選択、入力方式、ビデオフォーマットを選択してください。もしくはデバイスを選択せずにプログラムを実行してください。その際はIC Imaging Controlによってデバイス選択のダイアログが出現します。選択をせずにダイアログを閉じた場合、プログラムはエラーメッセージを表示し、終了します。
フォームに3つのボタンを追加し、 CaptionプロパティをそれぞれStart Live、Stop Live、Capture AVIとします。 またcmdStartLive、cmdStopLive、cmdCaptureVideoと名前を付けます。
まずはIC Imaging Controlの LiveStartクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStart MethodとLiveStopクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveStop Method メソッドへのコールを追加します。
private void cmdStartLive_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStart();
cmdStartLive.Enabled = false;
cmdStopLive.Enabled = true;
}
private void cmdStopLive_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
}
プログラムを実行してください。これでそれぞれのボタンをクリックすることでライブ画像のスタート、ストップなどの操作ができるようになります。 現時点でAVIファイルの作成はできませんが、ライブビデオストリーム用のプレビューは録画を開始する前に必要です。正しくデバイスが使用できることを確認してください。
AVI 録画ダイアログ
プロジェクトに新たなフォームを追加し、frmWriteAVIと 名前を付けてください。ビデオコーデックの選択用にコンボボックスを、AVIファイルネーム用にテキストボックスを追加します。そしてAVIキャプチャのスタートとストップボタンを作成します。(サンプルプロジェクトがありますので、そちらをロードすることをおすすめします。)
FormLoadイベント時、選択リストにはコンピューターにインストールされているビデオコーデック名が入ります。これらはAVIコンプレッサーとして使用されます。
private void WriteAvi_Load(object sender, EventArgs e)
{
cboVideoCodec.DataSource = TIS.Imaging.AviCompressor.AviCompresors;
// コンボボックス内の 最初のコーデックを表示。
cboVideoCodec.SelectedIndex = 0;
cmdStopCapture.Enabled = true;
cmdStartCapture.Enabled = false;
}
Start CaptureボタンのClickイベントはファイル名とビデオコーデック名をパラメータとして AviStartCaptureクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.AviStartCapture Methodメソッドを呼び出します。またCloseボタンを無効、Start Captureボタンを有効にすることでユーザーがコーデックとファイル名を選択したかどうかをチェックするコードもあり ます。
private void cmdStartCapture_Click(object sender, EventArgs e)
{
if (txtFilename.Text == "")
{
MessageBox.Show("ファイル名を指定してください");
return;
}
_wasRunning = _imagingControl1.LiveVideoRunning;
if( _imagingControl1.LiveVideoRunning )
_imagingControl1.LiveStop();
_savedSink = _imagingControl1.Sink;
_imagingControl1.Sink = new TIS.Imaging.MediaStreamSink( (TIS.Imaging.AviCompressor)cboVideoCodec.SelectedItem, txtFilename.Text );
try
{
_imagingControl1.LiveStart();
cmdStopCapture.Enabled = true;
cmdStartCapture.Enabled = false;
}
catch
{
_imagingControl1.Sink = _savedSink;
if( _wasRunning )
{
_imagingControl.LiveStart();
}
}
}
Pauseボタンはチェックボックスとなっています。 これはLiveCapturePauseクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveCapturePause Property プロパティのセット、リセットに使われます。LiveCapturePauseクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveCapturePause Property プロパティがTrueの場合, AVIキャプチャは一時停止します。これは画像ストリームのシンクパスのみが停止するということです。 ライブ画像は表示されますが、ビデオファイルとして保存はされません。 LiveCapturePauseクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveCapturePause Property プロパティがFalseである場合、 IC Imaging Control は即座にAVIキャプチャを再開します。 前に作成されたAVIファイルが引き続き使用されます。
private void chkPause_CheckedChanged(object sender, EventArgs e)
{
_imagingControl1.Sink.SinkModeRunning = chkPause.Checked;
}
AVI キャプチャはAviStartCaptureクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.AviStartCapture Methodを呼び出すことで開始されます。LiveCapturePauseクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveCapturePause Property プロパティがTrueであったとしても、この場合は画像ストリームは初期化された後に開始され、ライブ 画像が表示されます。シンクパスは停止中のため 画像がAVI ファイルとしては保存されません。LiveCapturePauseクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.LiveCapturePause Property プロパティがFalseに変わればシンクパスが再開し、画像がAVIファイルに書き込まれます。これによって AVI キャプチャをイベントに応じて開始、停止、再開と切り替えができるようになります。
以上でプログラムが実行可能になります。コーデックを選択しAVIファイルを作成します。ビデオストリームの圧縮はCPUに高い負荷をかけることになる為、全てのコーデックで最大の解像度、フレームレートが保証されるというわけではありません。