動画保存(MediaStreamSink)
概要
ライブストリームをAVIファイルとして保存する方法を説明します。 ここではAVIコンプレッサとMediaStreamContainer(ビデオフォーマット)のコレクションへのアクセスから録画するための手順について解説しています。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | capturing_a_video_file_cs_3.5.zip |
サンプル(VB.NET) | capturing_a_video_file_vb.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;
}
//ライブストリーム開始
icImagingControl1.LiveStart();
}
//”Start Live”ボタンをクリック時に発火するイベント
private void btnStartLive_Click(object sender, EventArgs e)
{
//ライブストリーム開始
icImagingControl1.LiveStart();
}
//”Start Stop”ボタンをクリック時に発火するイベント
private void btnStopLive_Click(object sender, EventArgs e)
{
//ライブストリーム停止
icImagingControl1.LiveStop();
}
//”Capture Video”ボタンをクリック時に発火するイベント
private void btnCaptureVideo_Click(object sender, EventArgs e)
{
//下記のAVI録画ダイアログをダイアログとしてオープンする
SaveVideoForm frm = new SaveVideoForm(icImagingControl1);
frm.ShowDialog();
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IcImagingControl1.DeviceValid Then
IcImagingControl1.ShowDeviceSettingsDialog()
If Not IcImagingControl1.DeviceValid Then
Close()
Exit Sub
End If
End If
IcImagingControl1.LiveStart()
End Sub
Private Sub btnStartLive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartLive.Click
IcImagingControl1.LiveStart()
End Sub
Private Sub btnStopLive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStopLive.Click
IcImagingControl1.LiveStop()
End Sub
Private Sub btnCaptureVideo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCaptureVideo.Click
Dim frm As New SaveVideoForm(IcImagingControl1)
frm.ShowDialog()
End Sub
メイン画面は非常にシンプルな作りでライブストリームの開始、停止、AVI録画ダイアログの表示を操作するためのボタンを設置しているのみです。
AVI録画ダイアログ
グローバル変数を宣言
private TIS.Imaging.ICImagingControl _imagingControl;
private TIS.Imaging.BaseSink _oldSink;
private bool _oldLiveModeSetting;
private TIS.Imaging.MediaStreamSink _sink;
Private m_ImagingControl As TIS.Imaging.ICImagingControl
Private m_OldSink As TIS.Imaging.BaseSink
Private m_OldLiveMode As Boolean
Private m_Sink As TIS.Imaging.MediaStreamSink
Formをロードした時に各コントローラーを初期化
//Formをロードした時に発火するイベント
private void SaveVideoForm_Load(object sender, EventArgs e)
{
//File AVIのコンボボックスに利用可能な全MediaStreamContainer(ビデオフォーマット)を含むリストを追加
cboMediaStreamContainer.DataSource = TIS.Imaging.MediaStreamContainer.MediaStreamContainers;
//テクストボックス内にファイル名を記載
txtFileName.Text = System.IO.Path.ChangeExtension("video.avi", CurrentMediaStreamContainer.PreferredFileExtension);
//フォームロード時は録画はストップした状態なので、"Stop Capture"ボタンを無効化
btnStopCapture.Enabled = false;
//AVIコンプレッサ(ビデオコーデック)のコレクションを追加する(下記参照)
fillCodecListItems();
}
//Video CodecのコンボボックスにAVIコンプレッサ(ビデオコーデック)のコレクションを追加する関数
private void fillCodecListItems()
{
var cont = CurrentMediaStreamContainer;
if (cont != null){
cboVideoCodec.DataSource = TIS.Imaging.AviCompressor.AviCompressors.Where(p => cont.IsCodecSupported(p)).ToList();
}else{
cboVideoCodec.DataSource = TIS.Imaging.AviCompressor.AviCompressors;
}
}
Private Sub SaveVideoForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
cboMediaStreamContainer.DataSource = TIS.Imaging.MediaStreamContainer.MediaStreamContainers
cboVideoCodec.DataSource = TIS.Imaging.AviCompressor.AviCompressors
txtFileName.Text = System.IO.Path.ChangeExtension("video.avi", CurrentMediaStreamContainer.PreferredFileExtension)
btnStopCapture.Enabled = False
End Sub
Formをロードした時に発火するときに、設置してあるコンボボックスやボタンなどのコントローラーを初期化しています。
File AVIのコンボボックスには利用可能な全MediaStreamContainerを、Video CodecのコンボボックスにAVIコンプレッサ(ビデオコーデック)のコレクションを追加し、コンボボックスから選択できるようにしています。
[Start Capture]ボタンをクリック(録画開始)
//"Start Capture"ボタンをクリックした時に発火するイベント
private void btnStartCapture_Click(object sender, EventArgs e)
{
//AVI録画を行うに際してコーデックを選択し、MediaStreamSinkを作成
_sink = new TIS.Imaging.MediaStreamSink( CurrentMediaStreamContainer, CurrentVideoCodec, txtFileName.Text );
//シンクの"running"状態の設定
_sink.SinkModeRunning = !chkPause.Checked;
//LiveStartメソッドが開始されたかどうかを取得
_oldLiveModeSetting = _imagingControl.LiveVideoRunning;
//使用しているsinkの状態を保存
_oldSink = _imagingControl.Sink;
//ライブストリームを停止
_imagingControl.LiveStop();
//MediaStreamSinkを割り当て
_imagingControl.Sink = _sink;
//ライブストリームを開始(録画を開始)
_imagingControl.LiveStart();
btnStartCapture.Enabled = false;
btnStopCapture.Enabled = true;
btnClose.Enabled = false;
}
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
AVI録画を行うコーデックをためにMediaStreamSinkを作成します。その後、シンクの"running"状態の設定します。
Trueにすることで、動画保存やフレーム画像の取得を遅延なく開始することができます。
作成したMediaStreamSinkシンクを設定し、ライブストリームを開始することで録画をすることができます。
[Pause]チェックボックスを変更
private void chkPause_CheckedChanged(object sender, EventArgs e){
if (_sink != null){
_sink.SinkModeRunning = !chkPause.Checked;
}
}
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
[Pause]ボタンはチェックボックスをクリックした時には、SinkModeRunningをFalseにすることで画像ストリームのシンクパスのみが停止され、録画を一時停止することができます。 ライブ画像は表示されますが、ビデオファイルとして保存はされません。 SinkModeRunningをTrueにすることで、前に作成されたAVIファイルが引き続き使用されます。
ライブストリームを圧縮して保存する処理はCPUに高い負荷をかけることになる為、全てのコーデックで最大の解像度、フレームレートが保証されるというわけではありません。
IC Imaging Control3.5からWMVおよびMP4MediaStreamContainerインスタンスを追加されています。 これにVideo Codecも「MediaFoundation h.264」「MediaFoundation h.265/HEVC」にも対応しており、 「Use Hardware Acceleration」にチェックを入れることによって特定のCPU集約型処理をGPUにオフロードすることで、ビデオのデコードをハードウェアアクセラレーションを利用して実行できるようになります。
下記のAPIリファレンスマニュアルにもその他関数などの説明があります。
プログラマーズガイド:動画をAVIファイルとして保存する
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル