Erstellen des Multiplexer-Objekts

Der ASF-Multiplexer ist ein WMContainer-Ebenenobjekt, das mit dem ASF-Datenobjekt funktioniert und einer Anwendung die Möglichkeit gibt, ASF-Datenpakete für Medienstreams zu generieren.

Das Multiplexer-Objekt macht die IMFASFMultiplexer-Schnittstelle verfügbar. Rufen Sie zum Erstellen des Multiplexers MFCreateASFMultiplexer auf. Diese Funktion gibt einen Zeiger auf ein leeres Objekt zurück. Wenn die Anwendung eine neue ASF-Datei schreibt, muss die Anwendung den Multiplexer mit einem ContentInfo-Objekt initialisieren. Rufen Sie hierzu IMFASFMultiplexer::Initialize auf. Das angegebene ContentInfo-Objekt stellt das ASF-Headerobjekt der neuen Datei dar. Informationen zum Erstellen und Initialisieren des ContentInfo-Objekts für eine neue Datei finden Sie unter Initialisieren des ContentInfo-Objekts einer neuen ASF-Datei.

Die Initialize-Methode analysiert das ContentInfo-Objekt, um Datenstromkonfigurationsinformationen wie die Anzahl von Streams, die Paketgröße und die Vorabroll zu sammeln. Optional kann es auch sein, dass der Multiplexer bucket-Parameter und die Nutzlasterweiterungseinheiten benötigt. Diese Informationen sind erforderlich, um Datenpakete zu generieren, die den im ASF-Headerobjekt definierten Anforderungen entsprechen. Die Initialize-Methode konfiguriert den Multiplexer basierend auf dem Medientyp und den Konfigurationseinstellungen der Streams. Wenn ein Stream beispielsweise für Nutzlasterweiterungen konfiguriert ist (siehe Erstellen und Konfigurieren von ASF Streams), wird der Multiplexer so konfiguriert, dass diese Werte den generierten Datenpaketen hinzugefügt werden.

Die Initialize-Methode ruft auch ein Handle für das anfängliche Datenobjekt ab, das während der Erstellung des ContentInfo-Objekts zum Schreiben erstellt wurde. Während der Generierung von Datenpaketen fügt der Multiplexer dem Datenobjekt Pakete hinzu und aktualisiert es entsprechend. Nachdem der Multiplexer alle Datenpakete generiert hat, aktualisiert er das angegebene ContentInfo-Objekt, sodass bestimmte Werte, z. B. die Anzahl der Datenpakete, aktualisiert werden.

Das folgende Codebeispiel zeigt, wie sie einen Multiplexer erstellen und mit einem ContentInfo-Objekt initialisieren.

//-------------------------------------------------------------------
// 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;
}

Informationen zur Verwendung dieser Funktion in einer vollständigen Anwendung finden Sie unter Tutorial: Kopieren von ASF-Streams auseiner Datei in eine andere .

Multiplexer-Initialisierung und Leaky Bucket-Einstellungen

Mit der IMFASFMultiplexer::Initialize-Methode wird der Multiplexer konfiguriert, um den Datenfluss mit dem Bucket "Leaky" zu bestimmen. Stellen Sie zum Konfigurieren dieser Parameter sicher, dass die folgenden Eigenschaftswerte für das angegebene ContentInfo-Objekt festgelegt sind. Informationen zum Festlegen dieser Eigenschaften finden Sie unter Festlegen von Eigenschaften im ContentInfo-Objekt.

  • MFPKEY _ ASFMEDIASINK _ AUTOADJUST _ BITRATE-Eigenschaft: Gibt an, ob der Multiplexer die Bitrate automatisch anpassen muss, um den Datenfluss im bucket mit Datenverlust zu verwalten. Diese Einstellung kann von der Anwendung durch Aufrufen von IMFASFMultiplexer::SetFlags und Übergeben des MFASF _ MULTIPLEXER _ AUTOADJUST _ BITRATE-Flags geändert werden.

  • MFPKEY _ ASFMEDIASINK _ BASE _ SENDTIME-Eigenschaft: Die Sendezeit gibt an, wann die Nutzlast innerhalb des unvorstellbaren Buckets freigegeben wird. Sendezeiten müssen gleich oder früher als die Präsentationszeit sein, da die Nutzlast Zeit haben muss, um vor der Präsentationszeit zum Ziel zu gelangen.

    Dieser Eigenschaftswert ist die erste Sendezeit. Der Multiplexer verwendet diesen Wert, um die nachfolgenden Sendezeiten zu berechnen, um sicherzustellen, dass die Daten kontinuierlich durch den Bucket fließen. Wenn das MFASF _ MULTIPLEXER _ AUTOADJUST _ BITRATE-Flag für den Multiplexer festgelegt wurde, passt der Multiplexer die Bitrate so an, dass die Nutzlast gesendet wird, wenn das Pufferfenster fast voll ist. Wenn das Flag nicht festgelegt ist, generiert der Multiplexer aufgrund eines Bandbreitenüberlaufs keine Datenpakete.

Der Multiplexer erhält Datenstromkonfigurationsinformationen aus dem ASF-Profil, das dem in der Initialize-Methode angegebenen ContentInfo-Objekt zugeordnet ist. Die Datenstromkonfigurationsinformationen enthalten Bucketparameter mit Datenlecks. Dieser Wert ist für den Multiplexer erforderlich, um Datenpakete zu generieren.

Legen Sie die Werte im MF _ ASFSTREAMCONFIG _ LEAKYBUCKET1-Attribut für das Streamkonfigurationsobjekt fest, das den Stream im Profil darstellt, um die Bucketparameter mit Datenlecks anzugeben. Um den Pufferfensterwert zu verwenden, der vom Encoder verwendet wird, rufen Sie IWMCodecLeakyBucket::GetBufferSizeBits auf. Der tatsächliche Wert des Pufferfensters ist erst bekannt, nachdem der Ausgabemedientyp des Encoders festgelegt wurde. Informationen zum Festlegen des Ausgabemedientyps finden Sie unter Media Type Negotiation on the Encoder.

Hinweis

Die vom Encoder verwendeten Bucketwerte können sich im ContentInfo-Objekt unterscheiden, das vom ASF-Profil bereitgestellt wurde, das zum Erstellen des Multiplexers verwendet wurde.

Die Initialize-Methode aktualisiert das ContentInfo-Objekt, sodass die richtigen Werte im endgültigen ASF-Headerobjekt widergespiegelt werden.

ASF Multiplexer

Generieren neuer ASF-Datenpakete