MediaStreamSink::create Method
新しいMediaStreamSinkを作成します。
構文
static tMediaStreamSinkPtr create( const tMediaStreamContainerPtr& pCont, IFrameFilter* pFilter = 0 );
static tMediaStreamSinkPtr create( const tMediaStreamContainerPtr& pCont, const tFrameFilterList& lst );
static tMediaStreamSinkPtr create( const tMediaStreamContainerPtr& pCont,
const smart_ptr & pCodec, IFrameFilter* pFilter = 0 );
static tMediaStreamSinkPtr create( const tMediaStreamContainerPtr& pCont,
const smart_ptr & pCodec, const tFrameFilterList& lst );
static tMediaStreamSinkPtr create( const tMediaStreamContainerPtr& pCont,
const GUID& subtype, IFrameFilter* pFilter = 0 );
static tMediaStreamSinkPtr create( const tMediaStreamContainerPtr& pCont,
const GUID& subtype, const tFrameFilterList& lst );
static tMediaStreamSinkPtr create( const GUID& containerID, IFrameFilter* pFilter = 0 );
static tMediaStreamSinkPtr create( const GUID& containerID, const tFrameFilterList& lst );
static tMediaStreamSinkPtr create( const GUID& containerID, const smart_ptr & pCodec,
IFrameFilter* pFilter = 0 );
static tMediaStreamSinkPtr create( const GUID& containerID,
const smart_ptr & pCodec, const tFrameFilterList& lst );
static tMediaStreamSinkPtr create( const GUID& containerID, const GUID& subtype, IFrameFilter* pFilter = 0 );
static tMediaStreamSinkPtr create( const GUID& containerID, const GUID& subtype, const tFrameFilterList& lst );
static tMediaStreamSinkPtr create( const tCreateData& create_data );
戻り値
新しく作成したMediaStreamSinkへのポインタ。エラーが発生した場合には0を返します。
備考
コンテナの中にはあるコーデックに対応していないものや非圧縮のフォーマットに対応していないものがあります。この場合Grabber::startLiveクラスライブラリリファレンス>クラス>Grabber>Grabber::startLive Methodはエラーとなるため別のコンテナ/コーデックの組み合わせを試すことが必要になります。
サンプル
AVI ファイルに記録するにはMSC_AviContainerで識別されるAVIメディアストリームコンテナを作成する必要があります。Codec::getAvailableCodecsクラスライブラリリファレンス>クラス>Codec>Codec::getAvailableCodecs Methodが返すリストよりコーデックを選択し、MediaStreamSinkを作成します。シンクの作成後はMediaStreamSink::setFilenameクラスライブラリリファレンス>クラス>MediaStreamSink>MediaStreamSink::setFilename Methodをコールしてファイル名を付けます。
// AVIメディアストリームコンテナの作成
tMediaStreamContainerPtr pAVIContainer = MediaStreamContainer::create( MSC_AviContainer );
// 利用可能なコーデック一覧を取得
tCodecListPtr pAvailableCodecList = Codec::getAvailableCodecs();
// 最初のコーデックを選択。通常はユーザーに選択してもらうようにするか
// コーデック名の検索をハードコーディングします。
tCodecPtr pCodec = pAvailableCodecList->at( 0 );
// これらのパラメータよりMediaStreamSinkを作成
tMediaStreamSinkPtr pSink = MediaStreamSink::create( pAVIContainer, pCodec );
// ファイルに名前を付ける
pSink->setFilename( "test.avi" );
// シンクを設定
m_Grabber.setSinkType( pSink );
利用可能なMediaStreamContainerの一覧を取得するにはMediaStreamContainer::getAvailableMediaStreamContainersクラスライブラリリファレンス>クラス>MediaStreamContainer>MediaStreamContainer::getAvailableMediaStreamContainers Methodを使用します。MediaStreamContainerがコーデック、非圧縮フォーマットどちらをサポートするかはMediaStreamContainer::isCustomCodecSupportedクラスライブラリリファレンス>クラス>MediaStreamContainer>MediaStreamContainer::isCustomCodecSupported Methodをコールすることで判別できます。この場合、上記のようにしてシンクを作成することができます。いずれのカスタムコーデックもサポートしない場合、MediaStreamSink::createクラスライブラリリファレンス>クラス>MediaStreamSink>MediaStreamSink::create Method内でコーデックを指定することはできません。適合するファイル名を設定するにはMediaStreamContainer::getPreferredFileExtensionクラスライブラリリファレンス>クラス>MediaStreamContainer>MediaStreamContainer::getPreferredFileExtension Methodをコールしそのビデオフォーマットのデフォルトの拡張子を取得します。
// 利用可能なコーデック一覧を取得
tMediaStreamContainerListPtr pAvailableContainers = MediaStreamContainer::getAvailableMediaStreamContainers();
// 最初のコンテナを選択。通常はユーザーに選択してもらうようにするか
// コンテナ名の検索をハードコーディングします。
tMediaStreamContainerPtr pContainer = pAvailableContainers->at( 0 );
// 作成するシンクオブジェクト
tMediaStreamSinkPtr pSink;
// コンテナがコーデックをサポートしている場合、1つを選択
if( pContainer->isCustomCodecSupported() )
{
// 利用可能なコーデック一覧を取得
tCodecListPtr pAvailableCodecList = Codec::getAvailableCodecs();
// 最初のコーデックを選択。通常はユーザーに選択してもらうようにするか
// コーデック名の検索をハードコーディングします。
tCodecPtr pCodec = pAvailableCodecList->at( 0 );
// これらのパラメータよりMediaStreamSinkを作成
pSink = MediaStreamSink::create( pContainer, pCodec );
}
else
{
// いずれのコーデックもサポートしていません。シンクの作成だけを行います。
pSink = MediaStreamSink::create( pContainer );
}
// コンテナの拡張子と名前を設定します。
std::string filename = "test.";
filename += pContainer->getPreferredFileExtension();
pSink->setFilename( filename );
// シンクを設定
m_Grabber.setSinkType( pSink );
非圧縮のAVIファイルを保存するにはMediaStreamSink::createの2つ目のパラメータとして非圧縮のフォーマットのサブタイプを使用します。
// AVIメディアストリームコンテナの作成
tMediaStreamContainerPtr pAVIContainer = MediaStreamContainer::create( MSC_AviContainer );
// これらのパラメータよりMediaStreamSinkを作成
tMediaStreamSinkPtr pSink = MediaStreamSink::create( pAVIContainer, MEDIASUBTYPE_RGB24 );
// ファイルに名前を付ける
pSink->setFilename( "test.avi" );
// シンクを設定
m_Grabber.setSinkType( pSink );