画像を動画ファイルとして保存する
ここでは一連の画像を動画ファイルとして記録する方法について説明します。
このサンプルは IC Imaging Controlインストールディレクトリの %TOPLEVEL%\samples\VCx\CreateVideoFile にあります。たとえばVC++2010 では %TOPLEVEL%\Samples\VC10となり、VC8 では%TOPLEVEL%\Samples\VC8です。プログラムを実行するため、ディレクトリ内のソリューションファイルSinkType.slnを開き メニューからビルド -> ビルド CreateVideoFileと選択します。
そこからデバッグ -> スタートと選択することでプログラムを実行することができます。
このプログラムは利用可能なメディアストリームコンテナの一覧を作成し、ユーザーに対してそこから選択するよう求めるものです。次のステップでユーザーはファイルへの保存方法を下の3つから選択することができます。
- Codec: これを選択した場合、利用可能なビデオコンプレッサの一覧が表示され、そこから一つ選択します。
- Uncompressed: 非圧縮のフォーマットのリストから一つ選択します。
- Unspecified: これを選択した場合、デバイス、デバイスパス上のフレームフィルタとオーバーレイ、シンクパスは非圧縮のフォーマットを指定します。
次のステップではファイル名を入力します。その入力後はプログラムは何かのキーが押されるまで待機状態となります。何かキーを押すとキャプチャが開始され、エンターが押されるまでキャプチャしたデータをビデオファイルに書き込み続けます。
デバイスをオープンにする
ここの例では%TOPLEVEL%\Samples\VC71\Common\CmdHelper.hのsetupDeviceFromFileを使用しています。この関数はデバイス選択ダイアログを表示し、その選択をコンフィギュレーションファイルに保存され、再度この関数が呼び出された際に読み込まれます。
Grabber grabber;
if( !setupDeviceFromFile( grabber ) )
{
return 1;
}
ビデオデータ保存形式を選択する
ユーザーはビデオデータのファイルへの保存形式について、以下の3つから選択することができます。
- Codec: 静的メソッドCodec::getAvailableCodecsクラスライブラリリファレンス>クラス>Codec>Codec::getAvailableCodecs Method が利用可能なビデオコンプレッサの一覧を返します。
そのリストはTOPLEVEL%\Samples\VC71\Common\CmdHelper.h内のpresentUserChoiceとtoStringArrayPtrListPtrによってコンソールに表示されます。 - Uncompressed: %TOPLEVEL%\Samples\VC71\Common\CmdHelper.h内のpresentUserChoiceと toStringArrayPtrListPtrによって非圧縮のフォーマットのリストs_UncompressedFormatListがコンソールに表示されます。
- Unspecified: これを選択した場合、デバイス、デバイスパス上のフレームフィルタとオーバーレイ、シンクパスは非圧縮のフォーマットを指定します。
画像データをビデオファイルへ保存するためにMediaStreamSinkクラスライブラリリファレンス>クラス>MediaStreamSinkが作成、初期化されます。
// コンテナがコーデックをサポートしているかをチェック
if( pCont->isCustomCodecSupported() )
{
static const char* pCodecOrCompressorChoice[] =
{
"Codec",
"Uncompressed Video",
"Unspecified Type (デバイス、フレームフィルタ、あるいはオーバーレイによって指定される形式を使用)"
};
int idx = presentUserChoice( pCodecOrCompressorChoice, pCodecOrCompressorChoice + 3 );
if( idx == -1 )
{
std::cerr << "圧縮、非圧縮どちらも選択されていません。" << std::endl;
return 1;
}
if( idx == 0 )
{
// ビデオコンプレッサ(コーデック)の一覧を取得
tCodecListPtr pCodecList = Codec::getAvailableCodecs();
if( pCodecList == 0 )
{
std::cerr << "コーデックが見つかりません。" << std::endl;
return 1;
}
int Compressor_idx = presentUserChoice( toStringArrayPtrListPtr( pCodecList ) );
if( Compressor_idx == -1 )
{
std::cerr << "コンプレッサが選択されていません。" << std::endl;
return 1;
}
tCodecPtr pCodec = pCodecList->at( Compressor_idx );
// コーデックがダイアログを持っている場合、それを表示
if( pCodec->hasDialog() )
{
std::cout << "コーデックのセットアップ: " << std::endl;
pCodec->callDialog();
}
// 指定されたコーデックでシンクを作成
pSink = MediaStreamSink::create( pCont, pCodec );
}
else if( idx == 1 )
{
// 非圧縮のコーデックを選択させる
int UFL_idx = presentUserChoice
( s_UncompressedFormatList, s_UncompressedFormatList + s_UncompressedFormatListCount );
if( UFL_idx == -1 )
{
std::cerr << "非圧縮フォーマットが未選択です" << std::endl;
return 1;
}
// 指定された非圧縮フォーマットでシンクを作成
GUID fmt_id = s_UncompressedFormatList[UFL_idx].id;
pSink = MediaStreamSink::create( pCont, fmt_id );
}
else
{
// デバイス、フレームフィルタ、あるいはオーバーレイによって指定されたフォーマットでシンクを作成
pSink = MediaStreamSink::create( pCont );
}
}
else
{
// デバイス、フレームフィルタ、あるいはオーバーレイによって指定されたフォーマットでシンクを作成
pSink = MediaStreamSink::create( pCont );
}
/* コーデックとコンテナの組み合わせが作成されなかった場合もあるためチェックする */
if( pSink == 0 )
{
std::cerr << "選択されたシンクは構築できませんでした。" << std::endl;
return -1;
}
Grabber::startLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::startLive Methodによってライブモードが開始されると、プログラムはユーザーの入力待ちの状態となります。AVI録画を開始するため、シンクの停止状態を解除させます。