Erstellen des Multiplexer-Objekts
Der ASF-Multiplexer ist ein WMContainer-Layerobjekt, das mit dem ASF-Datenobjekt funktioniert und einer Anwendung die Möglichkeit gibt, ASF-Datenpakete für Mediendatenströme zu generieren.
Das Multiplexerobjekt macht die IMFASFMultiplexer-Schnittstelle verfügbar. Um den Multiplexer zu erstellen, rufen Sie 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 dazu 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 Daten zur Streamkonfiguration zu sammeln, z. B. die Anzahl der Datenströme, die Paketgröße und den Preroll. Optional benötigt der Multiplexer möglicherweise auch undichte Bucketparameter und die Nutzlasterweiterungseinheiten. 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), und dann 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 Datenpaketgenerierung 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 von Datenpaketen, aktualisiert werden.
Das folgende Codebeispiel zeigt, wie Ein Multiplexer erstellt und mit einem ContentInfo-Objekt initialisiert wird.
//-------------------------------------------------------------------
// 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 aus einer Datei in eine andere.
Die IMFASFMultiplexer::Initialize-Methode konfiguriert den Multiplexer, um den datenflusssicheren Bucket zu ermitteln. 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 undichten Bucket aufrechtzuerhalten. Diese Einstellung kann von der Anwendung geändert werden, indem SIE IMFASFMultiplexer::SetFlags aufruft und das MFASF_MULTIPLEXER_AUTOADJUST_BITRATE-Flag übergibt.
MFPKEY_ASFMEDIASINK_BASE_SENDTIME-Eigenschaft : Die Sendezeit gibt an, wann die Nutzlast innerhalb des undichten 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 an das 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 an, sodass die Nutzlast gesendet wird, wenn das Pufferfenster fast voll ist. Wenn das Flag nicht festgelegt ist, kann der Multiplexer aufgrund von Bandbreitenüberschreitungen keine Datenpakete generieren.
Der Multiplexer ruft Datenstromkonfigurationsinformationen aus dem ASF-Profil ab, das dem in der Initialize-Methode angegebenen ContentInfo-Objekt zugeordnet ist. Die Datenstromkonfigurationsinformationen enthalten undichte Bucketparameter. Dieser Wert wird vom Multiplexer zum Generieren von Datenpaketen benötigt.
Legen Sie die Werte im MF_ASFSTREAMCONFIG_LEAKYBUCKET1-Attribut für das Streamkonfigurationsobjekt fest, das den Stream im Profil darstellt, um die Parameter des undichten Buckets anzugeben. Um den Wert des Pufferfensters 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 Medientypverhandlung auf dem Encoder.
Hinweis
Die vom Encoder verwendeten undichten Bucketwerte unterscheiden sich möglicherweise im ContentInfo-Objekt, 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 widerspiegelt werden.