Partager via


Utilisation de l’exclusion mutuelle pour les flux ASF

Le contenu ASF peut contenir plusieurs flux qui s’excluent mutuellement. Ces flux ne peuvent pas être lus simultanément, mais un seul d’entre eux est lu à la fois. Par exemple, le fichier peut contenir un ensemble de flux qui inclut le même contenu encodé à une vitesse de transmission différente. Le flux utilisé est déterminé par la bande passante disponible pour l’application qui diffuse le contenu. L’objet d’exclusion mutuelle ASF, qui fait partie de l’objet Header, stocke des informations sur le groupe de flux mutuellement exclusifs.

Dans Media Foundation, l’objet d’exclusion mutuelle qui expose l’interface IMFASFMutualExclusion existe pour chaque objet d’exclusion mutuelle ASF. L’objet de profil contient une référence à tous les objets d’exclusion mutuelle.

L’objet d’exclusion mutuelle stocke des informations sur le groupe de flux mutuellement exclusifs en tant qu’enregistrements. Un objet d’exclusion mutuelle peut avoir plusieurs enregistrements qui peuvent être utilisés pour créer des scénarios complexes. Chaque enregistrement contient un ou plusieurs flux qui ne peuvent pas coexister avec les flux d’un autre enregistrement, gérés par l’objet d’exclusion mutuelle, en fonction du type d’exclusion mutuelle, tel que le débit binaire.

Un exemple courant d’exclusion mutuelle complexe est un fichier qui contient trois flux audio du même contenu à différentes vitesses de transmission dans chacune des trois langues. Un seul des neuf flux doit être lu à la fois, mais il existe deux types par lesquels ils s’excluent mutuellement : le langage et le débit binaire.

Pour cet exemple, les neuf flux se voient attribuer les numéros de flux suivants :

1 - Langue 1, vitesse de transmission 1 2 - Langue 1, Vitesse de transmission 2 3 - Langue 1, Vitesse de transmission 3 4 - Langue 2, Vitesse de transmission 1 5 - Langue 2, Vitesse de transmission 2 6 - Langue 2, Vitesse de transmission 3 7 - Langue 3, Débit 1 8 - Langue 3, Débit 2 9 - Langue 3, Vitesse de transmission 3

Ce scénario peut être implémenté à l’aide des quatre objets d’exclusion mutuelle suivants :

  • Le premier objet d’exclusion mutuelle comprend les flux 1, 2 et 3, qui s’excluent mutuellement par débit binaire. Chaque flux a son propre enregistrement.
  • Le deuxième objet d’exclusion mutuelle comprend les flux 4, 5 et 6, mutuellement exclusifs par débit binaire. Chaque flux a son propre enregistrement.
  • Le troisième objet d’exclusion mutuelle comprend 7, 8 et 9, mutuellement exclusifs par débit binaire. Chaque flux a son propre enregistrement.
  • Le quatrième objet d’exclusion mutuelle contient trois enregistrements, le premier incluant les flux 1, 2 et 3 ; le deuxième incluant les flux 4, 5 et 6; et le troisième incluant les flux 7, 8 et 9. Ces enregistrements s’excluent mutuellement par langue.

Lors de la lecture d’un fichier créé de cette façon, l’application de diffusion en continu sélectionne d’abord la langue, car elle est moins susceptible de changer au milieu de la présentation, puis sélectionne une vitesse de transmission.

Création et configuration d’objets d’exclusion mutuelle

La liste suivante résume le processus de configuration d’un objet d’exclusion mutuelle :

  1. Créez un objet d’exclusion mutuelle.
  2. Définissez le type d’exclusion mutuelle.
  3. Configurez l’objet d’exclusion mutuelle en ajoutant des enregistrements et les flux associés.
  4. Ajoutez l’objet d’exclusion mutuelle au profil.

Pour créer et configurer un objet d’exclusion mutuelle

  1. Appelez IMFASFProfile::CreateMutualExclusion pour créer un objet d’exclusion mutuelle vide.

  2. Appelez IMFASFMutualExclusion::SetType pour définir le critère du flux mutuellement exclusif.

    Les flux peuvent s’exclure mutuellement par langue, vitesse de transmission, présentation et critères personnalisés. Le type est représenté sous la forme d’un GUID. Pour obtenir la liste de ces constantes, consultez GUID de type d’exclusion mutuelle ASF.

  3. Appelez IMFASFMutualExclusion::AddRecord pour ajouter un enregistrement à l’objet d’exclusion mutuelle.

    Cette méthode ajoute un enregistrement vide et lui attribue un index d’enregistrement commençant par zéro.

  4. Appelez IMFASFMutualExclusion::AddStreamForRecord pour ajouter le numéro de flux à l’enregistrement spécifié par l’index d’enregistrement.

    Chaque enregistrement comprend un ou plusieurs flux. Chaque flux d’un enregistrement s’exclue mutuellement de tous les flux de tous les autres enregistrements. Pour obtenir le nombre de flux dans un enregistrement, appelez IMFASFMutualExclusion::GetStreamsForRecord en spécifiant l’index d’enregistrement.

    Pour supprimer un flux de l’enregistrement, appelez IMFASFMutualExclusion::RemoveStreamFromRecord et spécifiez l’index d’enregistrement et le numéro de flux.

  5. Appelez IMFASFProfile::AddMutualExclusion pour ajouter l’objet d’exclusion mutuelle configuré au profil.

Énumération d’objets d’exclusion mutuelle dans un profil

Si IMFASFProfile::AddMutualExclusion réussit, il affecte un index à l’objet spécifié, en commençant à zéro.

Pour énumérer les objets d’exclusion mutuelle associés à un profil, appelez IMFASFProfile::GetMutualExclusionCount et parcourez la liste en appelant IMFASFProfile::GetMutualExclusion. Les index d’exclusion mutuelle sont séquentiels et sont compris entre 0 et un de moins que le nombre de flux récupérés par GetMutualExclusionCount.

Un objet d’exclusion mutuelle est supprimé du profil en appelant IMFASFProfile::RemoveMutualExclusion. Le profil réattribue les index d’exclusion mutuelle afin qu’ils soient séquentiels à partir de zéro. Cela remplace les index précédemment stockés, qui ne sont plus valides après l’appel de cette méthode. Cela libère les enregistrements de flux d’exclusion mutuelle associés.

Suppression d’enregistrements dans un objet d’exclusion mutuelle

Pour supprimer un enregistrement d’un objet d’exclusion mutuelle, appelez IMFASFMutualExclusion::RemoveRecord. Si cette méthode réussit, l’objet d’exclusion mutuelle indexe les enregistrements restants afin qu’ils soient séquentiels à partir de zéro. L’application doit énumérer les enregistrements pour s’assurer que l’index est correct pour chaque enregistrement. Pour ce faire, appelez IMFASFMutualExclusion::GetRecordCount et parcourez les enregistrements en appelant IMFASFMutualExclusion::GetStreamsForRecord.

La suppression de l’enregistrement avec l’index le plus élevé n’a aucun effet sur les autres index.

Modification d’un objet d’exclusion mutuelle

Pour modifier la configuration de l’objet d’exclusion mutuelle dans le profil, l’application doit remplacer l’objet d’exclusion mutuelle existant par un autre objet qui contient les nouveaux paramètres.

Pour modifier la configuration de l’objet d’exclusion mutuelle dans le profil

  1. Énumérez les objets d’exclusion mutuelle dans le profil pour obtenir l’objet qui doit être modifié.

  2. Appelez IMFASFMutualExclusion::Clone pour cloner l’objet d’exclusion mutuelle.

  3. Configurez l’objet cloné en fonction des besoins.

  4. Appelez IMFASFProfile::RemoveMutualExclusion pour supprimer l’ancien objet d’exclusion mutuelle du profil.

  5. Appelez IMFASFProfile::AddMutualExclusion pour ajouter l’objet d’exclusion mutuelle mis à jour au profil.

Profil ASF