Udostępnij przez


Tworzenie obiektu Multiplexer

Multiplekser ASF jest obiektem warstwy WMContainer, który współpracuje z ASF Data Object i daje aplikacji możliwość generowania pakietów danych ASF dla strumieni multimediów.

Obiekt multiplekser uwidacznia interfejs IMFASFMultiplexer. Aby utworzyć multiplekser, wywołaj MFCreateASFMultiplexer. Ta funkcja zwraca wskaźnik do pustego obiektu. Jeśli aplikacja zapisuje nowy plik ASF, aplikacja musi zainicjować multiplekser z obiektem ContentInfo. W tym celu wywołaj metodę IMFASFMultiplexer::Initialize. Określony obiekt ContentInfo reprezentuje obiekt nagłówka ASF nowego pliku. Aby uzyskać informacje na temat tworzenia i inicjowania obiektu ContentInfo dla nowego pliku, zobacz Inicjowanie obiektu ContentInfo nowego pliku ASF.

Metoda Initialize analizuje obiekt ContentInfo w celu zbierania informacji o konfiguracji strumienia, takich jak liczba strumieni, rozmiar pakietu, preroll. Opcjonalnie multiplekser może również potrzebować parametrów wyciekającego zbiornika oraz jednostek rozszerzenia ładunku. Te informacje są wymagane w celu wygenerowania pakietów danych spełniających wymagania zdefiniowane w obiekcie nagłówka ASF. Metoda Initialize konfiguruje multiplekser na podstawie typu nośnika i ustawień konfiguracji strumieni. Jeśli na przykład strumień jest skonfigurowany tak, aby miał rozszerzenia ładunku (zobacz Tworzenie i konfigurowanie strumieni ASF), a następnie multiplekser jest skonfigurowany do dodawania tych wartości do wygenerowanych pakietów danych.

Metoda Initialize pobiera również dojście do początkowego obiektu danych utworzonego podczas tworzenia obiektu ContentInfo do zapisu. Podczas generowania pakietów danych multiplekser dodaje pakiety do obiektu danych i odpowiednio je aktualizuje. Po wygenerowaniu wszystkich pakietów danych przez multiplekser aktualizuje podany obiekt ContentInfo, tak aby niektóre wartości, takie jak liczba pakietów danych, były aktualizowane.

Poniższy przykład kodu pokazuje, jak utworzyć multiplekser i zainicjować go za pomocą obiektu 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;
}

Aby zobaczyć, jak ta funkcja działa w pełnej aplikacji, zapoznaj się z Tutorial: Copying ASF Streams from One File to Another.

Inicjalizacja multipleksera i ustawienia algorytmu Leaky Bucket

Metoda IMFASFMultiplexer::Initialize konfiguruje multiplekser w celu określenia wyciekowego przepływu danych zasobnika. Aby skonfigurować te parametry, upewnij się, że następujące wartości właściwości są ustawione na określonym obiekcie ContentInfo. Aby uzyskać informacje o ustawianiu tych właściwości, zobacz Setting Properties in the ContentInfo Object.

  • MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE właściwość: wskazuje, czy multiplekser musi automatycznie dostosować szybkość bitów, aby zachować przepływ danych w nieszczelnym zasobniku. To ustawienie można zmienić przez aplikację, wywołując IMFASFMultiplexer::SetFlags i przekazując flagę MFASF_MULTIPLEXER_AUTOADJUST_BITRATE.

  • MFPKEY_ASFMEDIASINK_BASE_SENDTIME właściwość: Czas wysyłania wskazuje, kiedy pakiet danych wewnątrz nieszczelnego wiadra zostanie uwolniony. Czasy wysyłania muszą być równe lub wcześniejsze niż czas prezentacji, ponieważ ładunek musi mieć czas, aby przejść do miejsca docelowego przed czasem prezentacji.

    Ta wartość właściwości to czas pierwszego wysłania. Multiplekser używa tej wartości do obliczania kolejnych czasów wysyłania, aby zapewnić stałe przepływ danych przez zasobnik. Jeśli flaga MFASF_MULTIPLEXER_AUTOADJUST_BITRATE została ustawiona na multiplekserze, multiplekser dostosuje przepływność bitową, aby ładunek był przesyłany, gdy okno buforu jest bliskie zapełnienia. Jeśli flaga nie jest ustawiona, multiplekser nie może wygenerować pakietów danych z powodu przekroczenia przepustowości.

Multiplekser uzyskuje informacje o konfiguracji strumienia z profilu ASF skojarzonego z obiektem ContentInfo określonym w metodzie Initialize. Informacje o konfiguracji strumienia zawierają nieszczelne parametry zasobnika. Ta wartość jest wymagana przez multiplekser do generowania pakietów danych.

Aby określić parametry nieszczelnego zasobnika, ustaw wartości w atrybucie MF_ASFSTREAMCONFIG_LEAKYBUCKET1 w obiekcie konfiguracji strumienia, który odpowiada za strumień w profilu. Aby użyć wartości okna buforu, która jest używana przez koder, wywołaj metodę IWMCodecLeakyBucket::GetBufferSizeBits. Rzeczywista wartość okna buforu jest znana tylko po ustawieniu typu nośnika wyjściowego kodera. Aby uzyskać informacje na temat ustawiania typu nośnika wyjściowego, zobacz Negocjowanie typu nośnika wenkoderze.

Notatka

Wartości "leaky bucket" używane przez enkoder mogą się różnić w obiekcie ContentInfo, który został dostarczony przez profil ASF użyty do stworzenia multipleksera.

 

Metoda Initialize aktualizuje obiekt ContentInfo, tak aby prawidłowe wartości zostały odzwierciedlone w ostatnim obiekcie nagłówka ASF.

multiplekser ASF

Generowanie Nowych Pakietów Danych ASF