画像をAVIファイルとして保存する

ここでは一連の画像をAVIファイルとして記録する方法について説明します。

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

利用可能なビデオコンプレッサの一覧を作成し、ユーザーが使用したいコンプレッサの名前、ファイル名を求めるプログラムです。ユーザーが何かしらのキーを押すとすぐにプログラムがキャプチャを開始します。 再度エンターを押すとキャプチャは停止され、その時点までのデータがAVIファイルとして書き込まれます。

デバイスをオープンにする

ここの例では%TOPLEVEL%\Samples\VC71\Common\CmdHelper.hsetupDeviceFromFileを使用しています。 この関数はデバイス選択ダイアログを表示し、その選択をコンフィギュレーションファイルに保存され、再度この関数が呼び出された際に読み込まれます。

Grabber grabber;
if( !setupDeviceFromFile( grabber ) )
{
  return -1;
}

コーデックの選択

静的メソッドCodec::getAvailableCodecsクラスライブラリリファレンス>クラス>Codec>Codec::getAvailableCodecs Methodは利用可能なビデオコンプレッサのリストを返します。
そのリストは%TOPLEVEL%\Samples\VC71\Common\CmdHelper.h内のpresentUserChoicetoStringArrayPtrListPtr によってコンソールに表示され、ユーザーはその中から一つを選択します。

tCodecListPtr pCodecs = Codec::getAvailableCodecs();

// コーデック名をすべて表示する
int choice = presentUserChoice( toStringArrayPtrListPtr( pCodecs ) );
if( choice == 1 )
{
  return -1;
}

ビデオ録画の制御

データをビデオファイルに保存する際、 MediaStreamSinkクラスライブラリリファレンス>クラス>MediaStreamSinkが作成、初期化されAVIファイルとして記録されます。選択されるコーデックとファイル名が設定されます。
シンクは最初、ePAUSEをパラメータとして持つGrabberSinkType::setSinkModeクラスライブラリリファレンス>クラス>GrabberSinkType>GrabberSinkType::setSinkMode Methodの呼び出しによって停止させられます。

// MediaStreamSinkを作成し、選択したコーデックでAVIファイルとして記録
tMediaStreamSinkPtr pSink = MediaStreamSink::create(      MediaStreamContainer::create( MSC_AviContainer ), pCodecs->at( choice ) );

// ファイル名の設定
pSink->setFilename( filename );

// 最初シンクは停止しているため、ファイルにビデオデータは書き込まれることはありません。
pSink->setSinkMode( GrabberSinkType::ePAUSE );

// pSinkをシンクとして指定
grabber.setSinkType( pSink );

// ライブモードを開始する。ライブ画像は表示されますが、pSink は停止しているため
// AVIファイルには画像データが書き込まれることはありません。
if( !grabber.startLive( true ) )
{
  std::cerr << grabber.getLastError().toString() << std::endl;
  return -1;
}

std::cout << "[enter]を押すとキャプチャを開始します。";
std::cin.get();

// シンクをスタートさせます。イメージストリームがAVIファイルに保存されます。
pSink->setSinkMode(GrabberSinkType::eRUN );

std::cout << "ビデオ録画が開始されました。" << std::endl;
std::cout << "[enter]を押すとキャプチャを停止します。!";
std::cin.get();

// シンクを停止させます。これによってイメージストリームのAVIファイルへの書き込みが停止します。
// 後からGrabberSinkType::eRUNをパラメータに持つsetSinkModeをコールすることで
// AVI録画を再開することができます。
pSink->setSinkMode(GrabberSinkType::ePAUSE );

std::cout << "Video recording stopped." << std::endl;

// ライブモードを停止させます。GrabberSinkType::ePAUSEモードでない場合、
// これによってAVIファイルが閉じられ書き込みが停止します。
grabber.stopLive();

Grabber::startLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::startLive Methodによってライブモードが開始されると、プログラムはユーザーの入力待ちの状態となります。AVI録画を開始するため、シンクの停止状態を解除させます。