建立 Multiplexer 物件
ASF 復用器是 WMContainer 層物件,可搭配 ASF 資料物件,並讓應用程式能夠產生媒體串流的 ASF 資料包。
多工器物件公開 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 資料流從一個檔案複製到另一個。
多工器初始化和漏桶設定
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 標頭物件中。
相關主題