コーデックのプロパティを保存する

コーデックの利用とそのプロパティの保存、ロードについて説明します。
今回のサンプルプログラムのC#用のソースコードはMy Documents/IC Imaging Control 3.5内の以下ののディレクトリに格納されています。

samples\C# *\Saving Codec Properties

概要

コーデックとはビデオストリームを圧縮/解凍するもので、コンプレッサーまたはAVIコンプレッサーと呼ばれることもあります。
いくつかのコーデックのプロパティはIC Imaging Controlで呼び出し、設定することができます。例えばビデオストリームの品質を保存する前に設定することができます。

コーデックプロパティはバイナリデータストリームとして供給されます。アプリケーションがデータをロードする際にはデータストリームの長さに応じて必要となるメモリー領域の大きさが変わるため、それを事前に知っておくことが重要になります。

データストリームがバイナリデータであるので、ファイル保存形式もバイナリデータである必要があります。

コーデックからのバイナリデータストリームを変更しないようにしてください。データがコーデックに対応しなくなり、予期せぬエラーを起こす可能性があります。また、あるコーデックのコーデックプロパティ同士がお互いに対応しない場合もあります。 IC Imaging Control はエラーメッセージを表示することでこれらの問題を引き起こさないようにします。

コーデックはAviCompressorクラスライブラリリファレンス>クラス>AviCompressor オブジェクトが扱う外部DLLファイルであり、AviCompressorクラスライブラリリファレンス>クラス>AviCompressor オブジェクトが無効になると、そのDLLはメモリーから消去されてしまいます。この場合、ほとんどのコーデックは設定されたプロパティを失ってしまいます。したがってこのような問題を避けるために、グローバルオブジェクトAviCompressorクラスライブラリリファレンス>クラス>AviCompressorをフォーム内で宣言することが推奨されます。

PropertyPageAvailableクラスライブラリリファレンス>クラス>AviCompressor>AviCompressor.PropertyPageAvailable PropertyTrueのコーデックでデータの呼び出し、割り当てが行えるため、プログラム実行前にこのプロ パ ティをチェックしておくことが必要です。


プロジェクトの新規作成

新しいプロジェクトを作成し、IC imaging Controlをフォームに追加してください。 フォームに3つのボタンを追加し、 CaptionプロパティをそれぞれSave DataLoad DataShow Property Pageとします。またcmdSaveDatacmdLoadDatacmdShowPropertyPageと名前を付けます。 最低一つコンボボックスをフォームに追加してcboVideoCodecと名前を付けます。 ここにコーデック名が入ります。



コーデックを設定する

まずはじめに、アプリケーションはコーデックデータを含むグローバルオブジェクト AviCompressorクラスライブラリリファレンス>クラス>AviCompressor が必要です。 AviCompressorクラスライブラリリファレンス>クラス>AviCompressor のプロパティはメモリーより消去された場合に全て消えてしまうため、グローバルオブジェジェクトである必要があります。よって次の一行を フォームの初めの部分に記述してください。

[C#]
private TIS.Imaging.AviCompressor _selectedCodec;

フォームに Form_Loadイベントプロシージャを追加して、コンボボックスにコーデック名が入るよう次のコードを入力します。

[C#]
private void Form1_Load(object sender, EventArgs e)
{
    // cboVideoCodec  コンボボックスにインストール済みのコーデックを挿入する。
    foreach(TIS.Imaging.AviCompressor codec in TIS.imaging.AviCompressor.AviCompressors)
    {
         cboVideoCodec.Items.Add(codec);
     }
     // コンボボックス 内の 最初のコーデックを表示する
    cboVideoCodec.SelectedIndex = 0;
    _selectedCodec = (TIS.Imaging.AviCompressor)cboVideoCodec.SelectedItem;
    // ボタンを有効化、または無効 化す る。
    cmdShowPropertyPage.Enabled = _selectedCodec.PropertyPageAvailable;
    cmdLoadData.Enabled = _selectedCodec.PropertyPageAvailable;
    cmdSaveData.Enabled = _selectedCodec.PropertyPageAvailable;
}

このコードはAviCompressor.AviCompressorsクラスライブラリリファレンス>クラス>AviCompressor>ICImagingControl.AviCompressors Propertyプロパティを使って利用可能なコーデックのリストを作成します。グローバル変数 Codec がForeach .. In ..ステートメントでアイテムとして使われています。 最初の利用可能コーデックはグローバルオブジェクトAviCompressorクラスライブラリリファレンス>クラス>AviCompressor Codecに割り当てられます。3つのボタンはAviCompressorクラスライブラリリファレンス>クラス>AviCompressorオブジェクト内でプロパティPropertyPageAvailableクラスライブラリリファレンス>クラス>AviCompressor>AviCompressor.PropertyPageAvailable Propertyに従って有効化、無効化されます。これによってコーデックが支援していない動作を回避することができます。
コンボボックスcboVideoCodecをフォームに追加し、SelectedValueChangedイベントプロシージャをこのコンボボックスに割り当てます。

[C#]
private void cboVideoCodec_SelectedIndexChanged(object sender, EventArgs e)
{
   _selectedCodec = (TIS.Imaging.AviCompressor)cboVideoCodec.SelectedItem;
    // ボタンの有効化もしくは無効化
   cmdShowPropertyPage.Enabled = _selectedCodec.PropertyPageAvailable;
   cmdLoadData.Enabled = _selectedCodec.PropertyPageAvailable;
   cmdSaveData.Enabled = _selectedCodec.PropertyPageAvailable;
}

コンボボックスで選択されたアイテムは AviCompressorクラスライブラリリファレンス>クラス>AviCompressorオブジェクトを参照します。このアイテムはグローバルオブジェクトAviCompressorクラスライブラリリファレンス>クラス>AviCompressorCodecに割り当てられます。
AviCompressorクラスライブラリリファレンス>クラス>AviCompressor のプロパティ PropertyPageAvailableクラスライブラリリファレンス>クラス>AviCompressor>AviCompressor.PropertyPageAvailable Property はボタンの有効化、無効化に使われます。これによってユーザーがコーデックのプロパティダイアログがないにも関わらずcmdShowPropertyPageボタンを押すというようなことを防ぎます。
では次にcmdShowPropertyPageボタンのクリックイベントプロシージャを フォームに追加してください。

[C#]
private void cmdShowPropertyPage_Click(object sender, EventArgs e)
{
     _selectedCodec.ShowPropertyPage();
}

これにより、codecのプロパティダイアログが表示されます。cmdShowPropertyPageボタンがForm_LoadとSelectedValueChangedイベントプロシージャで有効、または無効とされているので、PropertyPageAvailableをここでチェックする必要はありません。

コーデックプロパティを保存する

前述のように、コーデックプロパティはバイナリデータストリームとして供給されます。バイナリデータストリームとは単にバイトが並んでいるものです。ファイルの初期要素としてデータストリームのバイトカウントを保存することが強く推奨されます。データがファイルにロードされる際にこの初期要素を使うことで動的配列はバイトカウントに応じてサイズを変更し、データを格納できるようにします。
cmdSaveDataのクリックイベントプロシージャをフォームに追加します。

[C#]
private void cmdSaveData_Click(object sender, EventArgs e)
{
     try
     {
        System.IO.FileStream filestream = new System.IO.FileStream
                        ("test.bin", System.IO.FileMode.Create, System.IO.FileAccess.Write);
        System.IO.BinaryWriter binWriter = new System.IO.BinaryWriter(filestream);
        binWriter.Write(_selectedCodec.Name);
        binWriter.Write(_selectedCodec.CompressorDataSize);
        binWriter.Write(_selectedCodec.CompressorData);
        binWriter.Close();
        filestream.Close();
    }
    catch (Exception Ex)
    {
        MessageBox.Show(Ex.Message);
    }
}

コーデックプロパティがtest.binに保存されます。 AviCompressor.PropertyPageAvailableクラスライブラリリファレンス>クラス>AviCompressor>AviCompressor.PropertyPageAvailable PropertyTrueで ある場合のみcmdSaveDataボタンが有効です。また、次のコードで置き換えることも可能です。

[C#]
if ( Codec.PropertyPageAvailable )
{
    //  何か実行する(保存など)
}
else
{
    MessageBox.Show( "This codec does not support properties!");
}

コーデックプロパティをロードする

cmdLoadDataのクリックイベントプロシージャをフォームに追加します。

[C#]
private void cmdLoadData_Click(object sender, EventArgs e)
{
    try
    {
        System.IO.FileStream filestream =
      new System.IO.FileStream("test.bin", System.IO.FileMode.Open, System.IO.FileAccess.Read);         System.IO.BinaryReader binReader = new System.IO.BinaryReader(filestream);

          //  コーデックコンフィギュレーションファイルよりコーデック名を呼び出し
       String codecName = binReader.ReadString();

          // 現在のコーデック名とファイルの中のコーデック名を比較
        if (_selectedCodec.Name == codecName)
        {
            //  バイナリデータの長さを読み取る
            int codecDataLen = binReader.ReadInt32();
            //  コーデックにコンフィギュレーションデータを割り当てる
            _selectedCodec.CompressorData = binReader.ReadBytes(codecDataLen);
        }
        else
        {
            MessageBox.Show("The saved data does not match to the used codec.\n" +
                    "saved: " + codecName + "\n" +
                    "used: " + _selectedCodec.Name);
        }
        binReader.Close();
        filestream.Close();
    }
    catch (Exception Ex)
    {
        MessageBox.Show(Ex.Message);
    }
}

cmdSaveDataボタンの部分で述べたように、
cmdLoadDataボタンはAviCompressor.PropertyPageAvailableクラスライブラリリファレンス>クラス>AviCompressor>AviCompressor.PropertyPageAvailable PropertyTrueである場合のみ有効です。コーデックにデータを割り当てる前に、プロパティを支援しているかどうかをチェックしてください。

[C#]
if ( Codec.PropertyPageAvailable )
{
    //  何か実行する (ロードなど)
}
else
{
     MessageBox.Show( "This codec does not support properties!");
}

キャプチャにコーデックを使用する

Capturing an AVI Fileの項に、Codecを使用し動画を保存する方法について示しています。