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 );
パラメータ 説明
pCont MediaStreamContainerクラスライブラリリファレンス>クラス>MediaStreamContainerへ のポインタです。利用可能なCodecクラスライブラリリファレンス>クラス>Codecのリストの取得にはMediaStreamContainer::getAvailableMediaStreamContainersクラスライブラリリファレンス>クラス>MediaStreamContainer>MediaStreamContainer::getAvailableMediaStreamContainers Methodをコールするか、MediaStreamContainer::createクラスライブラリリファレンス>クラス>MediaStreamContainer>MediaStreamContainer::create MethodにGUIDを指定しMediaStreamContainerオブジェクトを直接作成することで可能になります。
containerID MediaStreamContainerクラスライブラリリファレンス>クラス>MediaStreamContainerの GUIDもしくはStandard MediaStreamContainer GUIDsクラスライブラリリファレンス>定数>Standard MediaStreamContainer GUIDs (標準メディアストリームコンテナGUID)のひとつです。
pFilter ファイルへの書き込み前に画像データの分析・変換に使用されるフレームフィルタです。
lst フレームフィルタのtFrameFilterListクラスライブラリリファレンス>型定義>tFrameFilterListです。このリスト内のフィルタは画像データを変換するフィルタチェーン内で連携しています。
pCodec MediaStreamContainerクラスライブラリリファレンス>クラス>MediaStreamContainerへ のポインタです。利用可能なCodecクラスライブラリリファレンス>クラス>Codecの一覧はCodec::getAvailableCodecsクラスライブラリリファレンス>クラス>Codec>Codec::getAvailableCodecs Methodをコールすることで取得できます。
subtype 非圧縮ビデオのイメージフォーマットを指定します。
create_data MediaStreamSinkを複製するためにはMediaStreamSink::getCreateDataクラスライブラリリファレンス>クラス>MediaStreamSink>MediaStreamSink::getCreateData Methodをコールして作成時のパラメータにアクセスします。もう1つのMediaStreamSinkの初期化にはtCreateDataクラスライブラリリファレンス>クラス>FrameHandlerSink::>FrameHandlerSink::tCreateData Structurev構造体を使用します。

戻り値

新しく作成した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 );