マルチプレクサー オブジェクトの作成
ASF マルチプレクサは、 ASF データ オブジェクトで動作し、アプリケーションにメディア ストリーム用の ASF データ パケットを生成する機能を提供する WMContainer レイヤー オブジェクトです。
マルチプレクサー オブジェクトは、 IMFASFMultiplexer インターフェイスを 公開します。 マルチプレクサーを作成するには、 MFCreateASFMultiplexer を呼び出します。 この関数は、空のオブジェクトへのポインターを返します。 アプリケーションが新しい ASF ファイルを書き込む場合、アプリケーションは ContentInfo オブジェクトを使用してマルチプレクサーを初期化する必要があります。 これを行うには、 IMFASFMultiplexer::Initialize を呼び出します。 指定した ContentInfo オブジェクトは、新しいファイルの ASF ヘッダー オブジェクトを表します。 新しいファイルの ContentInfo オブジェクトの作成と初期化の詳細については、「 新しい ASF ファイルの ContentInfo オブジェクトの初期化」を参照してください。
Initialize メソッドは ContentInfo オブジェクトを解析して、ストリームの数、パケット サイズ、プリロールなどのストリーム構成情報を収集します。 必要に応じて、マルチプレクサーには漏れバケット パラメーターとペイロード拡張ユニットも必要になる場合があります。 ASF ヘッダー オブジェクトで定義されている要件に一致するデータ パケットを生成するには、この情報が必要です。 Initialize メソッドは、ストリームのメディアの種類と構成設定に基づいてマルチプレクサーを構成します。 たとえば、ストリームがペイロード拡張機能を持つよう構成されている場合 ( 「ASF ストリームの作成と構成」を参照)、生成されたデータ パケットにこれらの値を追加するようにマルチプレクサーが構成されます。
Initialize メソッドは、書き込み用の ContentInfo オブジェクトの作成時に作成された初期データ オブジェクトへのハンドルも取得します。 データ パケットの生成中に、マルチプレクサーはデータ オブジェクトにパケットを追加し、適切に更新します。 マルチプレクサは、すべてのデータ パケットを生成した後、指定された ContentInfo オブジェクトを更新して、データ パケットの数などの特定の値が更新されるようにします。
次のコード例は、マルチプレクサーを作成し、ContentInfo オブジェクトで初期化する方法を示しています。
//-------------------------------------------------------------------
// CreateOutputGenerators
//
// Creates the ASF mux and the ASF Content Info object for the
// output file.
//-------------------------------------------------------------------
HRESULT CreateOutputGenerators(
IMFASFProfile *pProfile,
IMFASFContentInfo **ppContentInfo,
IMFASFMultiplexer **ppMux
)
{
IMFASFContentInfo *pContentInfo = NULL;
IMFASFMultiplexer *pMux = NULL;
// Use the ASF profile to create the ContentInfo object.
HRESULT hr = MFCreateASFContentInfo(&pContentInfo);
if (SUCCEEDED(hr))
{
hr = pContentInfo->SetProfile(pProfile);
}
// Create the ASF Multiplexer object.
if (SUCCEEDED(hr))
{
hr = MFCreateASFMultiplexer(&pMux);
}
// Initialize it using the new ContentInfo object.
if (SUCCEEDED(hr))
{
hr = pMux->Initialize(pContentInfo);
}
// Return the pointers to the caller.
if (SUCCEEDED(hr))
{
*ppContentInfo = pContentInfo;
(*ppContentInfo)->AddRef();
*ppMux = pMux;
(*ppMux)->AddRef();
}
SafeRelease(&pContentInfo);
SafeRelease(&pMux);
return hr;
}
完全なアプリケーションで使用されるこの関数を確認するには、「 チュートリアル: ASF ストリームを 1 つのファイルから別のファイルにコピーする」を参照してください。
マルチプレクサーの初期化と漏れバケット設定
IMFASFMultiplexer::Initialize メソッドは、漏れバケット データ フローを決定するようにマルチプレクサーを構成します。 これらのパラメーターを構成するには、指定した ContentInfo オブジェクトに次のプロパティ値が設定されていることを確認します。 これらのプロパティの設定の詳細については、「 ContentInfo オブジェクトのプロパティの設定」を参照してください。
MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE プロパティ: これは、マルチプレクサーが漏れバケット内のデータ フローを維持するために、ビット レートを自動的に調整する必要があるかどうかを示します。 この設定は、 アプリケーションで IMFASFMultiplexer::SetFlags を呼び出し、 MFASF_MULTIPLEXER_AUTOADJUST_BITRATE フラグを渡すことによって変更できます。
MFPKEY_ASFMEDIASINK_BASE_SENDTIME プロパティ: 送信時間は、漏れバケット内のペイロードがいつ解放されることを示します。 ペイロードにはプレゼンテーション時間の前に宛先に到達する時間が必要であるため、送信時間はプレゼンテーション時間以上である必要があります。
このプロパティ値は、最初の送信時刻です。 マルチプレクサは、この値を使用して後続の送信時間を計算し、データがバケット内を確実に流れるようにします。 マルチプレクサーで MFASF_MULTIPLEXER_AUTOADJUST_BITRATE フラグが設定されている場合、マルチプレクサーはビット レートを調整して、バッファー ウィンドウがいっぱいに近づくとペイロードが送信されるようにします。 フラグが設定されていない場合、マルチプレクサーは帯域幅オーバーランのためにデータ パケットの生成に失敗します。
マルチプレクサーは、 Initialize メソッドで指定された ContentInfo オブジェクトに関連付けられた ASF プロファイルからストリーム構成情報を取得します。 ストリーム構成情報には、漏れバケット パラメーターが含まれます。 この値は、データ パケットを生成するためにマルチプレクサーによって必要です。
漏れバケット パラメーターを指定するには、プロファイル内のストリームを表すストリーム構成オブジェクトの MF_ASFSTREAMCONFIG_LEAKYBUCKET1 属性の値を設定します。 エンコーダーによって使用されるバッファー ウィンドウ値を使用するには、 IWMCodecLeakyBucket::GetBufferSizeBits を呼び出します。 実際のバッファー ウィンドウの値は、エンコーダーの出力メディアの種類を設定した後でのみ認識されます。 出力メディアの種類の設定の詳細については、 エンコーダーのメディアの種類のネゴシエーションに関するページを参照してください。
注意
エンコーダーによって使用されるリークバケット値は、マルチプレクサーの作成に使用された ASF プロファイルによって提供された ContentInfo オブジェクトで異なる場合があります。
Initialize メソッドは ContentInfo オブジェクトを更新して、正しい値が最終的な ASF ヘッダー オブジェクトに反映されるようにします。
関連トピック