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

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

このサンプルは IC Imaging Controlインストールディレクトリの%TOPLEVEL%\samples\VC\MediaStreamSinkSampleにあります。
プログラムを実行するため、ディレクトリ内のソリューションファイルMediaStreamSinkSample.slnを開いてください。

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

デバイスを開く

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

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

コーデックの選択

静的メソッドCodec::getAvailableCodecsクラスライブラリリファレンス>クラス>Codec>Codec::getAvailableCodecs Methodは利用可能なビデオコンプレッサのリストを返します。
そのリストは%TOPLEVEL%\Samples\VC\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録画を開始するため、シンクの停止状態を解除します。