動画保存 (AviStartCapture)
録画時間を指定したAVIファイル保存
ライブストリームをAVIファイルとして保存する方法を説明します。 ここではAVIコンプレッサとMediaStreamSinkを使って録画する方法となります。
コンテナを使ってH.264のコーデックにて動画保存する方法についてはこちらの動画保存のサンプルをご確認ください。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | capturing_an_avi_file.zip |
実行結果
メイン画面
//起動したときに発火するイベント
private void Form1_Load(object sender, EventArgs e)
{
//デバイスの読み込み
if( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
{
MessageBox.Show("No device was selected.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
return;
}
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
}
//”Start Live”ボタンをクリック時に発火するイベント
private void cmdStartLive_Click(object sender, EventArgs e)
{
icImagingControl1.LiveDisplay = true;
icImagingControl1.LiveStart();
cmdStartLive.Enabled = false;
cmdStopLive.Enabled = true;
}
//”Stop Live”ボタンをクリック時に発火するイベント
private void cmdStopLive_Click(object sender, EventArgs e)
{
icImagingControl1.LiveStop();
cmdStartLive.Enabled = true;
cmdStopLive.Enabled = false;
}
//”Capture AVI”ボタンをクリック時に発火するイベント
private void cmdCaptureAVI_Click(object sender, EventArgs e)
{
//WriteAviDlgのフォームを呼び出し
WriteAvi WriteAviDlg = new WriteAvi(icImagingControl1);
WriteAviDlg.ShowDialog();
WriteAviDlg.Dispose();
}
メイン画面は非常にシンプルな作りでライブストリームの開始、停止、AVI録画ダイアログの表示を操作するためのボタンを設置しているのみです。
AVI書き込みダイアログ
private TIS.Imaging.ICImagingControl _imagingControl;
private TIS.Imaging.BaseSink _savedSink;
private bool _wasRunning = false;
//ダイアログが立ち上がったときに発火するイベント
private void WriteAvi_Load(object sender, EventArgs e)
{
cboVideoCodec.DataSource = TIS.Imaging.AviCompressor.AviCompressors;
// コンボボックスの中にAviCompressorsの中にある先頭のコーデックを入れる
cboVideoCodec.SelectedIndex = 0;
cmdStartCapture.Enabled = true;
cmdStopCapture.Enabled = false;
}
Formをロードした時に発火するときに、設置してあるコンボボックスやボタンなどのコントローラーを初期化しています。 Video CodecのコンボボックスにAviCompressor(ビデオコーデック)のコレクションを追加し、コンボボックスから選択できるようにしています。
private void cmdStartCapture_Click(object sender, EventArgs e)
{
if (txtFilename.Text == "")
{
MessageBox.Show("Please select an AVI filename first.");
return;
}
_wasRunning = _imagingControl.LiveVideoRunning;
if( _imagingControl.LiveVideoRunning )
_imagingControl.LiveStop();
//シンクの状態を保存
_savedSink = _imagingControl.Sink;
//AVI録画を行うに際してコーデックを選択し、MediaStreamSinkを作成
_imagingControl.Sink = new TIS.Imaging.MediaStreamSink( (TIS.Imaging.AviCompressor)cboVideoCodec.SelectedItem, txtFilename.Text );
try
{
_imagingControl.LiveDisplay = false;
//ライブストリームを開始(録画を開始)
_imagingControl.LiveStart();
cmdStopCapture.Enabled = true;
cmdStartCapture.Enabled = false;
}
catch
{
//前のシンクにつなぎ直す
_imagingControl.Sink = _savedSink;
if( _wasRunning )
{
_imagingControl.LiveDisplay = false;
_imagingControl.LiveStart();
}
}
}
AVI録画を行うコーデックをためにMediaStreamSinkを作成します。その後、シンクの"running"状態の設定します。
Trueにすることで、動画保存やフレーム画像の取得を遅延なく開始することができます。MediaStreamSinkシンクを設定し、ライブストリームを開始するだけで録画をすることができます。
private void cmdStopCapture_Click(object sender, EventArgs e)
{
_imagingControl.LiveStop();
_imagingControl.Sink = _savedSink;
cmdStopCapture.Enabled = false;
cmdStartCapture.Enabled = true;
if( _wasRunning )
_imagingControl.LiveStart();
}
ライブストリームを停止することで録画停止することができます。
シンクをMediaStreamSinkから元のシンク(FrameHandlerSink)に戻すことで録画せずにストリーミング再生することが可能です。