コーデックのプロパティを保存する
概要
コーデックの利用とそのプロパティの保存、ロードについて説明します。
コーデックとはビデオストリームを圧縮/解凍するもので、コンプレッサーまたはAVIコンプレッサーと呼ばれることもあります。
いくつかのコーデックのプロパティはIC Imaging Controlで呼び出し、設定することができます。例えばビデオストリームの品質を保存する前に設定することができます。
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | saving_codec_properties_cs_3.5.zip |
実行結果
Visual Studioのプログラム上ではすでにボタンの設置や関数は定義済ですので、IC Imaging Contorl3.5をインストールされていれば、実行ボタンだけですぐにデバッグで動作確認することができます。 画面にあるそれぞれのボタンなどのコントローラの機能は下記の通りです。
[コーデック]リストボックス | 使用できるコーデック一覧を表示します。 |
---|---|
[Load Data]ボタン | ファイル「test.bin」を読み込み、コーデックリストボックスで選択したコーデックと一致しているのか確認します。 |
[Save Data]ボタン | コーデックからバイナリデータを取得し、バイナリで開いたファイル「test.bin」に保存します。 |
[Show Property]ボタン | AviCompressorのプロパティページを表示します。 |
初期設定
private TIS.Imaging.AviCompressor _selectedCodec;
グローバルオブジェクトとしてAviCompressorが必要となりますので下記のように宣言します。
AviCompressorのプロパティはprivate変数として定義した場合消えてしまうため、グローバルオブジェジェクトである必要があります。
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プロパティを使って利用可能なコーデックのリストを作成します。グローバル変数CodecがForeach .. In ..ステートメントでアイテムとして使われています。 最初の利用可能コーデックはグローバルオブジェクトAviCompressor Codecに割り当てられます。3つのボタンはAviCompressorオブジェクト内でプロパティPropertyPageAvailableに従って有効化、無効化されます。これによってコーデックがサポートしていない動作を回避することができます。コンボボックスcboVideoCodecをフォームに追加し、SelectedValueChangedイベントプロシージャをこのコンボボックスに割り当てます。PropertyPageAvailableがTrueのコーデックでデータの呼び出し、割り当てが行えるため、プログラム実行前にこのプロパティをチェックしておく必要があります。
[Save Data]ボタンクリック時の処理
private void cmdSaveData_Click(object sender, EventArgs e)
{
try
{
//コーデックプロパティがtest.binに保存されます
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」に保存します。 保存されたファイルが使用されているコーデックと 一致することを確認するために、コーデックの名前がファイル「test.bin」に保存されます。
AviCompressor.PropertyPageAvailableがTrueである場合のみcmdSaveDataボタンが有効です。また、次のコードで置き換えることも可能です。
[Load Data]ボタンクリック時の処理
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);
}
}
ファイル「test.bin」からバイナリデータをロードし、コーデックとして割り当てます。
ファイルが使用されているコーデックと一致するかどうかを確認するために、コーデックの名前がファイルに保存されました。
これで、最初にファイルからロードされ、Codec.Nameと比較チェックし一致した場合、バイナリデータをコーデックに割り当てることができます。
[Load Data]ボタンクリック時の処理
private void cmdShowPropertyPage_Click(object sender, EventArgs e)
{
_selectedCodec.ShowPropertyPage();
}
AviCompressorのプロパティページを表示します。プロパティページが利用可能でない場合はエラーを返します。
下記のAPIリファレンスマニュアルにもその他関数などの説明があります。
プログラマーズガイド:コーデックのプロパティを保存する
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル