動画保存(MediaStreamSink)
Capturing a Video File
概要
ライブストリームをAVIファイルとして保存する方法を説明します。 ここではAVIコンプレッサとMediaStreamContainer(ビデオフォーマット)のコレクションへのアクセスから録画するための手順について解説しています。
サンプルプログラム
| 利用した開発環境 | Visual Studio™ 2019 | 
|---|---|
| SDK | IC Imaging Control 3.5(Python, C#, VB.NET) | 
| デバイスドライバ | Cam33U_setup,gigecam_setup,usbcam,AFU420_setup,usb2pro_drv | 
| デバイス | TISカメラ全般(MIPI CSI-2&FPD-Link IIIカメラを除く) | 
| サンプル(C#) | capturing_a_video_file_cs_3.5.zip | 
| サンプル(VB.NET) | capturing_a_video_file_vb.zip | 
| exeファイル アプリケーション  | 
    ー | 
| 別途ファイル | ー | 
| 関連参照URL | ー | 
実行結果

メイン画面

//起動したときに発火するイベント
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.MediaStreamSinkFormをロードした時に各コントローラーを初期化
//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 Control3.5(C#/VB.NET) APIリファレンスマニュアル


