画像をAVIファイルとして保存する
ここでは一連の画像をAVIファイルとして記録する方法について説明します。
このサンプルは IC Imaging Controlインストールディレクトリの%TOPLEVEL%\samples\VC\MediaStreamSinkSampleにあります。
プログラムを実行するため、ディレクトリ内のソリューションファイルMediaStreamSinkSample.slnを開いてください。
利用可能なビデオコンプレッサの一覧を作成し、ユーザーが使用したいコンプレッサの名前、ファイル名を求めるプログラムです。ユーザーが何かしらのキーを押すとすぐにプログラムがキャプチャを開始します。再度エンターを押すとキャプチャは停止され、その時点までのデータがAVIファイルとして書き込まれます。
デバイスを開く
この例では%TOPLEVEL%\Samples\VC\Common\CmdHelper.hのsetupDeviceFromFileを使用しています。この関数はデバイス選択ダイアログを表示し、その選択をコンフィギュレーションファイルに保存され、再度この関数が呼び出された際に読み込まれます。
Grabber grabber;
if( !setupDeviceFromFile( grabber ) )
{
return -1;
}
コーデックの選択
静的メソッドCodec::getAvailableCodecsクラスライブラリリファレンス>クラス>Codec>Codec::getAvailableCodecs Methodは利用可能なビデオコンプレッサのリストを返します。
そのリストは%TOPLEVEL%\Samples\VC\Common\CmdHelper.h内のpresentUserChoiceとtoStringArrayPtrListPtrによってコンソールに表示され、ユーザーはその中から一つを選択します。
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録画を開始するため、シンクの停止状態を解除します。