Sélection du titre

Lorsqu'un élément multimédia contient plusieurs pistes, la sélection de piste est le processus qui détermine celles qui sont choisies pour la lecture. Le processus de sélection des pistes est configuré par TrackSelectionParameters, ce qui permet de spécifier de nombreuses contraintes et forçages différents qui influencent la sélection des pistes.

Interroger les titres disponibles

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

  • Les pistes disponibles sont 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 quels titres 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 pistes sélectionnées.

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 en cours en appelant player.getCurrentTracks(). Le Tracks renvoyé contient une liste d'objets Tracks.Group, où les pistes d'un même Group présentent le même contenu, mais dans différents formats.

Pour illustrer comment les pistes peuvent être regroupées, prenons l'exemple d'une lecture adaptative où un flux vidéo principal est fourni en cinq débits et un flux vidéo alternatif (par exemple, un angle de caméra différent dans un match de sport) est fourni en deux débits. Dans ce cas, il existe deux groupes de pistes vidéo, l'un correspondant 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 les contenus dans différentes langues ne sont pas considérés comme identiques. À l'inverse, les pistes audio dans la même langue qui ne diffèrent que par des 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.

Vous pouvez interroger chaque Group pour déterminer les pistes compatibles avec la lecture, celles qui sont actuellement sélectionnées et les Format utilisées par 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);
  }
}

  • Un canal est compatible si le Player peut décoder et afficher ses échantillons. Notez que même si plusieurs groupes de pistes du même type (par exemple, plusieurs groupes de pistes audio) sont acceptés, cela signifie seulement qu'ils sont acceptés individuellement et que le lecteur n'est pas nécessairement en mesure de les lire en même temps.
  • Un titre est sélectionné s'il a été choisi pour la lecture en fonction de l'TrackSelectionParameters actuelle. Si plusieurs pistes d'un même 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'un seul de ces titres sera lu à la fois.

Modifier les paramètres de sélection de titres

Le processus de sélection des pistes 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 titres basée sur des contraintes

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

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

ExoPlayer utilise des valeurs par défaut adaptées à ces contraintes, par exemple en limitant la résolution vidéo à la taille de l'écran et en privilégiant la langue audio correspondant au paramètre de langue du système de l'utilisateur.

L'utilisation d'une sélection de canaux basée sur des contraintes plutôt que de sélectionner des canaux spécifiques parmi ceux qui sont disponibles présente plusieurs avantages:

  • Vous pouvez spécifier des contraintes avant de savoir quelles pistes 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.
  • Les contraintes s'appliquent à tous les éléments multimédias d'une playlist, même si ces éléments comportent des titres différents 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 la Format du titre 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 pistes spécifiques

Vous pouvez sélectionner des pistes spécifiques à l'aide de TrackSelectionParameters. Tout d'abord, les pistes actuellement disponibles du lecteur doivent être interrogées à l'aide de Player.getCurrentTracks. Deuxièmement, une fois les canaux à sélectionner identifiés, ils peuvent être définis sur TrackSelectionParameters à l'aide d'un TrackSelectionOverride. Par exemple, pour sélectionner le premier titre 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 TrackSelectionOverride ne s'applique qu'aux éléments multimédias contenant un TrackGroup correspondant exactement à celui spécifié dans le forçage. Par conséquent, un forçage peut ne pas s'appliquer à un élément multimédia ultérieur si cet élément contient des pistes différentes.

Désactiver des types ou des groupes de pistes

Les types de pistes tels que la vidéo, l'audio ou le texte peuvent être complètement désactivés à l'aide de TrackSelectionParameters.Builder.setTrackTypeDisabled. Un type de piste désactivé sera 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());

Vous pouvez également empêcher la sélection de pistes à 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 titres

La sélection de la piste est la responsabilité d'un TrackSelector, une instance pouvant être fournie chaque fois qu'un ExoPlayer est créé et obtenu ultérieurement 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. Il utilise l'TrackSelectionParameters défini dans le Player, mais fournit également des options de personnalisation avancées qui peuvent être spécifiées dans le DefaultTrackSelector.ParametersBuilder:

Kotlin

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

Java

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

Tunnelisation

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

Déchargement audio

Vous pouvez activer la lecture audio hors charge lorsque la combinaison des moteurs de rendu et des pistes sélectionnées le permet. Pour ce faire, spécifiez AudioOffloadModePreferences dans votre 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());
);