Verwenden des gegenseitigen Ausschlusses für ASF-Streams

ASF-Inhalte können mehrere Streams enthalten, die sich gegenseitig ausschließen. Diese Datenströme können nicht gleichzeitig gelesen werden, sondern nur einer von ihnen wird gleichzeitig gelesen. Beispielsweise kann die Datei einen Satz von Streams enthalten, der denselben Inhalt enthält, der mit einer anderen Bitrate codiert ist. Der verwendete Stream wird durch die Bandbreite bestimmt, die der Anwendung zur Verfügung steht, die den Inhalt streamt. Das ASF-Objekt für gegenseitigen Ausschluss, das Teil des Headerobjekts ist, speichert Informationen über die Gruppe der sich gegenseitig ausschließenden Streams.

In Media Foundation ist das Objekt des gegenseitigen Ausschlusses , das die IMFASFMutualExclusion-Schnittstelle verfügbar macht, für jedes ASF-Objekt des gegenseitigen Ausschlusses vorhanden. Das Profilobjekt enthält Einen Verweis auf alle Objekte des gegenseitigen Ausschlusses.

Das Objekt für gegenseitigen Ausschluss speichert Informationen über die Gruppe der sich gegenseitig ausschließenden Datenströme als Datensätze. Ein Objekt für gegenseitigen Ausschluss kann mehrere Datensätze enthalten, die zum Erstellen komplexer Szenarien verwendet werden können. Jeder Datensatz enthält einen oder mehrere Datenströme, die nicht gleichzeitig mit Datenströmen in einem anderen Datensatz vorhanden sein können, der vom Gegenseitigkeitsausschlussobjekt verwaltet wird, je nach Art des gegenseitigen Ausschlusses, z. B. bitrate.

Ein häufiges Beispiel für einen komplexen gegenseitigen Ausschluss ist eine Datei, die drei Audiostreams desselben Inhalts mit unterschiedlichen Bitraten in jeder von drei Sprachen enthält. Nur einer der neun Streams sollte gleichzeitig wiedergegeben werden, aber es gibt zwei Typen, durch die sie sich gegenseitig ausschließen: Sprache und Bitrate.

In diesem Beispiel werden den neun Streams die folgenden Datenstromnummern zugewiesen:

1 - Sprache 1, Bitrate 1 2 - Sprache 1, Bitrate 2 3 - Sprache 1, Bitrate 3 4 - Sprache 2, Bitrate 1 5 - Sprache 2, Bitrate 2 6 - Sprache 2, Bitrate 3 7 - Sprache 3, Bitrate 1 8 - Sprache 3, Bitrate 2 9 - Sprache 3, Bitrate 3

Dieses Szenario kann mithilfe der folgenden vier Gegenseitigkeitsausschlussobjekte implementiert werden:

  • Das erste gegenseitige Ausschlussobjekt umfasst die Datenströme 1, 2 und 3, die sich gegenseitig nach Bitrate ausschließen. Jeder Stream verfügt über einen eigenen Datensatz.
  • Das zweite Gegenseitige Ausschlussobjekt umfasst die Streams 4, 5 und 6, die sich gegenseitig nach Bitrate ausschließen. Jeder Stream verfügt über einen eigenen Datensatz.
  • Das dritte Objekt des gegenseitigen Ausschlusses umfasst 7, 8 und 9, die sich gegenseitig nach Bitrate ausschließen. Jeder Stream verfügt über einen eigenen Datensatz.
  • Das vierte Objekt des gegenseitigen Ausschlusses enthält drei Datensätze, den ersten einschließlich der Datenströme 1, 2 und 3. die zweite, einschließlich der Streams 4, 5 und 6; und die dritte, einschließlich der Streams 7, 8 und 9. Diese Datensätze schließen sich gegenseitig nach Sprache aus.

Bei der Wiedergabe einer auf diese Weise erstellten Datei wählt die Streaminganwendung zuerst die Sprache aus, da sie sich in der Mitte der Präsentation weniger wahrscheinlich ändert, und wählt dann eine Bitrate aus.

Erstellung und Konfiguration von Objekten mit gegenseitigem Ausschluss

In der folgenden Liste wird der Prozess zum Konfigurieren eines Gegenseitigkeitsausschlussobjekts zusammengefasst:

  1. Erstellen Sie ein Objekt für gegenseitigen Ausschluss.
  2. Legen Sie den Typ des gegenseitigen Ausschlusses fest.
  3. Konfigurieren Sie das Objekt für gegenseitigen Ausschluss, indem Sie Datensätze und die zugeordneten Streams hinzufügen.
  4. Fügen Sie dem Profil das Objekt für gegenseitigen Ausschluss hinzu.

So erstellen und konfigurieren Sie ein Objekt für gegenseitigen Ausschluss

  1. Rufen Sie IMFASFProfile::CreateMutualExclusion auf, um ein leeres Objekt für gegenseitigen Ausschluss zu erstellen.

  2. Rufen Sie IMFASFMutualExclusion::SetType auf, um das Kriterium des sich gegenseitig ausschließenden Streams festzulegen.

    Die Streams können sich nach Sprache, Bitrate, Präsentation und benutzerdefinierten Kriterien gegenseitig ausschließen. Der Typ wird als GUID dargestellt. Eine Liste dieser Konstanten finden Sie unter GUIDs des Typs für den gegenseitigen Ausschluss von ASF.

  3. Rufen Sie IMFASFMutualExclusion::AddRecord auf, um dem Objekt des gegenseitigen Ausschlusses einen Datensatz hinzuzufügen.

    Diese Methode fügt einen leeren Datensatz hinzu und weist ihm ab 0 (null) einen Datensatzindex zu.

  4. Rufen Sie IMFASFMutualExclusion::AddStreamForRecord auf, um die Streamnummer dem durch den Datensatzindex angegebenen Datensatz hinzuzufügen.

    Jeder Datensatz enthält einen oder mehrere Streams. Jeder Stream in einem Datensatz schließt sich gegenseitig von allen Datenströmen in jedem anderen Datensatz aus. Um die Anzahl der Streams in einem Datensatz abzurufen, rufen Sie IMFASFMutualExclusion::GetStreamsForRecord auf, indem Sie den Datensatzindex angeben.

    Um einen Datenstrom aus dem Datensatz zu entfernen, rufen Sie IMFASFMutualExclusion::RemoveStreamFromRecord auf, und geben Sie den Datensatzindex und die Streamnummer an.

  5. Rufen Sie IMFASFProfile::AddMutualExclusion auf, um dem Profil das konfigurierte Objekt für gegenseitigen Ausschluss hinzuzufügen.

Auflisten von Objekten des gegenseitigen Ausschlusses in einem Profil

Wenn IMFASFProfile::AddMutualExclusion erfolgreich ist, wird dem angegebenen Objekt ab 0 (null) ein Index zugewiesen.

Um die einem Profil zugeordneten Objekte für den gegenseitigen Ausschluss aufzulisten, rufen Sie IMFASFProfile::GetMutualExclusionCount auf, und durchlaufen Sie die Liste, indem Sie IMFASFProfile::GetMutualExclusion aufrufen. Gegenseitige Ausschlussindizes sind sequenziell und liegen zwischen 0 und 1 kleiner als die Anzahl der Streams, die von GetMutualExclusionCount abgerufen werden.

Ein Gegenseitiges Ausschlussobjekt wird aus dem Profil entfernt, indem IMFASFProfile::RemoveMutualExclusion aufgerufen wird. Das Profil zuweisen die gegenseitigen Ausschlussindizes neu, sodass sie sequenziell ab 0 (null) sind. Dadurch werden zuvor gespeicherte Indizes überschrieben, die nach dem Aufruf dieser Methode nicht mehr gültig sind. Dadurch werden die zugeordneten Datenstromdatensätze für gegenseitigen Ausschluss freigegeben.

Entfernen von Datensätzen in einem Gegenseitigkeitsausschlussobjekt

Um einen Datensatz aus einem Gegenseitigkeitsausschlussobjekt zu entfernen, rufen Sie IMFASFMutualExclusion::RemoveRecord auf. Wenn diese Methode erfolgreich ist, indiziert das Objekt für gegenseitigen Ausschluss die verbleibenden Datensätze, sodass sie sequenziell ab 0 (null) sind. Die Anwendung sollte die Datensätze aufzählen, um den richtigen Index für jeden Datensatz sicherzustellen. Rufen Sie dazu IMFASFMutualExclusion::GetRecordCount auf, und durchlaufen Sie die Datensätze, indem Sie IMFASFMutualExclusion::GetStreamsForRecord aufrufen.

Das Entfernen des Datensatzes mit dem höchsten Index hat keine Auswirkungen auf die anderen Indizes.

Ändern eines gegenseitigen Ausschlussobjekts

Um die Konfiguration des Objekts für gegenseitigen Ausschluss im Profil zu ändern, muss die Anwendung das vorhandene Objekt für gegenseitigen Ausschluss durch ein anderes Objekt ersetzen, das die neuen Einstellungen enthält.

So ändern Sie die Konfiguration des Objekts für gegenseitigen Ausschluss im Profil

  1. Auflisten der gegenseitigen Ausschlussobjekte im Profil, um das Objekt abzurufen, das geändert werden muss.

  2. Rufen Sie IMFASFMutualExclusion::Clone auf, um das Objekt für gegenseitigen Ausschluss zu klonen.

  3. Konfigurieren Sie das geklonte Objekt nach Bedarf.

  4. Rufen Sie IMFASFProfile::RemoveMutualExclusion auf, um das alte Objekt des gegenseitigen Ausschlusses aus dem Profil zu entfernen.

  5. Rufen Sie IMFASFProfile::AddMutualExclusion auf, um dem Profil das aktualisierte Objekt für gegenseitigen Ausschluss hinzuzufügen.

ASF-Profil