Sélection du titre

Lorsqu'un élément multimédia contient plusieurs pistes, la sélection de la piste est le processus qui détermine celles à lire. Le processus de sélection du canal est configuré par TrackSelectionParameters, ce qui permet de spécifier de nombreuses contraintes et forçages ayant une incidence sur la sélection du canal.

Interroger les canaux disponibles

Vous pouvez écouter Player.Listener.onTracksChanged pour être informé des modifications apportées aux titres, y compris:

  • Les pistes disponibles deviennent connues une fois la préparation de l'élément multimédia en cours de lecture terminée. Notez que le lecteur doit préparer un élément multimédia pour savoir quelles pistes il contient.
  • Les pistes disponibles changent en raison de la transition de la lecture d'un élément multimédia à un autre.
  • Modifications apportées aux canaux sélectionnés.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTracksChanged(tracks: Tracks) {
      // Update UI using current tracks.
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTracksChanged(Tracks tracks) {
        // Update UI using current tracks.
      }
    });

Vous pouvez également interroger les pistes actuelles en appelant player.getCurrentTracks(). Le Tracks renvoyé contient une liste d'objets Track.Group, où les pistes d'un même Group présentent le même contenu, mais dans des formats différents.

Pour illustrer la façon dont les pistes peuvent être regroupées, prenons une lecture adaptative dans laquelle un flux vidéo principal est fourni dans cinq débits et un autre flux vidéo (par exemple, un angle de caméra différent lors d'un match de sport) est fourni dans deux débits. Dans ce cas, il y a deux groupes de pistes vidéo : l'un correspond au flux vidéo principal contenant cinq pistes, et l'autre au flux vidéo alternatif contenant deux pistes.

Les pistes audio dont les langues diffèrent ne sont pas regroupées, car le contenu dans des langues différentes n'est pas considéré comme identique. À l'inverse, les pistes audio de la même langue qui ne diffèrent que par leurs propriétés telles que le débit, le taux d'échantillonnage, le nombre de canaux, etc. peuvent être regroupées. Cela s'applique également aux pistes de texte.

Chaque Group peut être interrogé pour déterminer quelles pistes sont compatibles avec la lecture, celles actuellement sélectionnées et ce que Format utilise chaque piste:

Kotlin

for (trackGroup in tracks.groups) {
  // Group level information.
  val trackType = trackGroup.type
  val trackInGroupIsSelected = trackGroup.isSelected
  val trackInGroupIsSupported = trackGroup.isSupported
  for (i in 0 until trackGroup.length) {
    // Individual track information.
    val isSupported = trackGroup.isTrackSupported(i)
    val isSelected = trackGroup.isTrackSelected(i)
    val trackFormat = trackGroup.getTrackFormat(i)
  }
}

Java

for (Tracks.Group trackGroup : tracks.getGroups()) {
  // Group level information.
  @C.TrackType int trackType = trackGroup.getType();
  boolean trackInGroupIsSelected = trackGroup.isSelected();
  boolean trackInGroupIsSupported = trackGroup.isSupported();
  for (int i = 0; i < trackGroup.length; i++) {
    // Individual track information.
    boolean isSupported = trackGroup.isTrackSupported(i);
    boolean isSelected = trackGroup.isTrackSelected(i);
    Format trackFormat = trackGroup.getTrackFormat(i);
  }
}

  • Une piste est compatible si Player est capable de décoder et d'afficher ses échantillons. Notez que même si plusieurs groupes de pistes du même type sont acceptés (par exemple, plusieurs groupes de pistes audio), cela signifie simplement qu'ils le sont individuellement et que le lecteur ne peut pas nécessairement les lire en même temps.
  • Un titre est sélectionné s'il a été choisi pour la lecture en fonction de l'TrackSelectionParameters en cours. Si plusieurs pistes d'un groupe de pistes sont sélectionnées, le lecteur les utilise pour la lecture adaptative (par exemple, plusieurs pistes vidéo avec des débits différents). Notez qu'une seule de ces pistes sera lue à la fois.

Modifier les paramètres de sélection de la piste

Le processus de sélection de canal peut être configuré à l'aide de Player.setTrackSelectionParameters. Vous pouvez le faire avant et pendant la lecture. L'exemple suivant montre comment obtenir les TrackSelectionParameters actuelles du lecteur, les modifier et mettre à jour le Player avec le résultat modifié:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setMaxVideoSizeSd()
    .setPreferredAudioLanguage("hu")
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("hu")
        .build());

Sélection de pistes en fonction de la contrainte

La plupart des options de TrackSelectionParameters vous permettent de spécifier des contraintes, qui sont indépendantes des pistes réellement disponibles. Les contraintes disponibles incluent:

  • Largeur, hauteur, fréquence d'images et débit maximal et minimal de la vidéo.
  • Nombre maximal de canaux audio et débit.
  • Types MIME recommandés pour la vidéo et l'audio.
  • Langues audio préférées et indicateurs de rôle.
  • Langues de texte et options de rôle préférées.

ExoPlayer utilise des valeurs par défaut raisonnables pour ces contraintes, par exemple en limitant la résolution vidéo à la taille d'affichage et en préférant la langue audio qui correspond aux paramètres régionaux du système de l'utilisateur.

La sélection de pistes basée sur des contraintes présente plusieurs avantages par rapport à la sélection de pistes spécifiques parmi celles disponibles:

  • Vous pouvez spécifier des contraintes avant de savoir quels suivis un élément multimédia fournit. Cela signifie que des contraintes peuvent être spécifiées avant que le lecteur n'ait préparé un élément multimédia, tandis que la sélection de pistes spécifiques nécessite que le code de l'application attende que les pistes disponibles soient connues.
  • Des contraintes sont appliquées à tous les éléments multimédias d'une playlist, même lorsque différentes pistes sont disponibles. Par exemple, une contrainte de langue audio préférée sera automatiquement appliquée à tous les éléments multimédias, même si l'élément Format de la piste dans cette langue varie d'un élément multimédia à l'autre. Ce n'est pas le cas lorsque vous sélectionnez des titres spécifiques, comme décrit ci-dessous.

Sélectionner des titres spécifiques

Vous pouvez sélectionner des titres spécifiques avec TrackSelectionParameters. Tout d'abord, les pistes actuellement disponibles sur le lecteur doivent être interrogées à l'aide de Player.getCurrentTracks. Ensuite, après avoir identifié les pistes à sélectionner, vous pouvez les définir sur TrackSelectionParameters à l'aide d'un TrackSelectionOverride. Par exemple, pour sélectionner la première piste d'un audioTrackGroup spécifique:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setOverrideForType(
      TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
    )
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setOverrideForType(
            new TrackSelectionOverride(
                audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0))
        .build());

Un élément TrackSelectionOverride ne s'applique qu'aux éléments multimédias contenant un élément TrackGroup correspondant exactement à celui spécifié dans le forçage. Par conséquent, il est possible qu'une modification ne s'applique pas à un élément multimédia ultérieur s'il contient des pistes différentes.

Désactiver des types de canaux ou des groupes

Les types de pistes, comme la vidéo, l'audio ou le texte, peuvent être entièrement désactivés à l'aide de TrackSelectionParameters.Builder.setTrackTypeDisabled. Si un type de piste est désactivé, il est désactivé pour tous les éléments multimédias:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
        .build());

Il est également possible d'empêcher la sélection de titres à partir d'un TrackGroup spécifique en spécifiant un forçage vide pour ce groupe:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .addOverride(
      TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
    )
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .addOverride(
            new TrackSelectionOverride(
                disabledTrackGroup.getMediaTrackGroup(),
                /* trackIndices= */ ImmutableList.of()))
        .build());

Personnaliser le sélecteur de piste

La sélection du canal est la responsabilité d'un TrackSelector, dont l'instance peut être fournie chaque fois qu'une ExoPlayer est créée, puis obtenue avec ExoPlayer.getTrackSelector().

Kotlin

val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()

Java

DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

DefaultTrackSelector est un TrackSelector flexible adapté à la plupart des cas d'utilisation. Elle utilise le TrackSelectionParameters défini dans Player, mais fournit également des options de personnalisation avancées qui peuvent être spécifiées dans DefaultTrackSelector.ParametersBuilder:

Kotlin

trackSelector.setParameters(
  trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)

Java

trackSelector.setParameters(
    trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

Tunnelisation

Vous pouvez activer la lecture par tunnel dans les cas où la combinaison de moteurs de rendu et de pistes sélectionnées le permet. Pour ce faire, utilisez DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Déchargement audio

Vous pouvez activer la lecture audio déchargée si elle est compatible avec la combinaison de moteurs de rendu et des pistes sélectionnées. Pour ce faire, spécifiez AudioOffloadModePreferences dans le fichier TrackSelectionParameters.

Kotlin

val audioOffloadPreferences =
  AudioOffloadPreferences.Builder()
      .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
      // Add additional options as needed
      .setIsGaplessSupportRequired(true)
      .build()
player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setAudioOffloadPreferences(audioOffloadPreferences)
    .build()

Java

AudioOffloadPreferences audioOffloadPreferences =
  new AudioOffloadPreferences.Builder()
      .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
      // Add additional options as needed
      .setIsGaplessSupportRequired(true)
      .build();
player.setTrackSelectionParameters(
  player.getTrackSelectionParameters()
    .buildUpon()
    .setAudioOffloadPreferences(audioOffloadPreferences)
    .build());
);