コーデックのプロパティ

コーデックのプロパティを取得・設定する方法について説明します。

このサンプルは IC Imaging Controlインストールディレクトリの%TOPLEVEL%\Samples\VCx\CodecProperty内にあります。
たとえばVC++2010では%TOPLEVEL%\Samples\VC10となり、VC8では%TOPLEVEL%\Samples\VC8です。プログラムを実行するため、ディレクトリ内のソリューションファイルSinkType.slnを開き、メニューからビルド -> ビルド CodecPropertyと選択します。
そこからデバッグ -> スタートと選択することでプログラムを実行することができます

このプログラムは利用可能なビデオコンプレッサの一覧を作成し、ユーザーに使用するコーデック名とファイル名を求めるものです。 選択したコーデックがプロパティダイアログを持っている場合、それが表示されます。ダイアログが閉じられると、プログラムはそこで設定されたプロパティの値を取得して"codec.xml"というファイルに保存します。前に保存したプロパティはファイルから読み取られコーデックに入力されます。 そしてイメージストリームのキャプチャを開始するためのキー入力を待つ状態になります。AVIファイルへの書き込みがいったん開始されると、再度エンターキーを押すまで続行します。
全てのコーデックがパラメータを外部から設定できるプロパティダイアログを持っていいるわけではありません。以下がプロパティダイアログを持つコーデックとなっています。

  • Cinepak2
  • MJPEG
  • DV Video Encoder
  • Indeo video 5.10 compression filter
  • Lead MCMP/MJPEG Codec (VfW)
  • DivX412
  • DivX500

コーデック設定の保存

コーデックのデータを保存するにはCodec::getSettingsクラスライブラリリファレンス>クラス>Codec>Codec::getSettings Methodを使用します。このメソッドはコーデックデータを含むML フォーマットの文字列を返します。この文字列をファイルもしくはレジストリに書き込むことでプログラムのコーデック設定を保存することが可能です。

std::string codec_settings = codec.getSettings();
if( !codec_settings.empty() )
{     
  std::ofstream file( filename.c_str() );     
  if( file.good() )     
  {     
    file << codec_settings;     
    bSucceded = true;     
  }     
  else     
  {     
    std::cerr << "Error : Could not open file " << filename << std::endl;     
  }
}
else
{     
  std::cerr << "Error : No data available from the codec" << std::endl;
}

コーデック設定の読み込み

コーデック設定を読み込むには、Codec::setSettingsクラスライブラリリファレンス>クラス>Codec>Codec::getSettings Methodを使用します。

std::ifstream file( filename.c_str() );
if( file.good() )
{
  std::string codec_settings;
  while( file.good() ) // ファイルをcharごとに読みとり
  {
    codec_settings += (char) file.get();
  }
  if( !codec_settings.empty() ) // ファイルにデータがないかをチェック
  {
    if( codec.setSettings( codec_settings ) ) // データの設定
    {
      bSucceded = true;
    }
    else
    {
      std::cerr << "Error : データがコーデックに対応していません。" << std::endl;
    }
  }
  else
  {
    std::cerr << "Error : ファイルにデータが存在しません" << std::endl;
  }
}
else
{
     std::cerr << "Error : ファイルが開けません" << filename << std::endl;
}