共用方式為


建立 Multiplexer 物件

ASF 多工器是 WMContainer 層物件,可與 ASF 資料物件 搭配運作,並讓應用程式能夠產生媒體資料流程的 ASF 資料封包。

multiplexer 物件會公開 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。 只有在設定編碼器的輸出媒體類型之後,才會知道實際的緩衝區視窗值。 如需設定輸出媒體類型的詳細資訊,請參閱 編碼器上的媒體類型交涉

注意

編碼器所使用的流失值區值在 ContentInfo 物件中可能會不同,該物件是由用來建立多工器的 ASF 設定檔所提供。

 

Initialize方法會更新 ContentInfo 物件,讓正確的值反映在最終的 ASF 標頭物件中。

ASF 多工器

產生新的 ASF 資料封包