Sélection du titre

Lorsqu'un élément multimédia contient plusieurs pistes, détermine laquelle d'entre elles est sélectionnée pour la lecture. Le processus de sélection des pistes est configurée par TrackSelectionParameters, ce qui permet à de nombreuses les contraintes et les forçages ayant une influence sur la sélection de pistes à spécifier.

Interroger les canaux disponibles

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

  • Pistes disponibles connues lors de la préparation de l'élément multimédia en cours de préparation lectures complètes. Notez que le lecteur doit préparer un élément multimédia pour connaître les pistes qu'elle contient.
  • Les pistes disponibles changent en raison d'une transition de lecture à partir d'un contenu multimédia élément à un autre.
  • Modifications apportées aux titres 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 titres en cours en appelant player.getCurrentTracks(). Le Tracks renvoyé contient une liste d'objets Track.Group, où suit un élément Group présentent le même contenu, mais dans des formats différents.

Pour illustrer le regroupement de pistes, prenons l'exemple d'une lecture adaptative : un flux vidéo principal est fourni dans cinq débits et un flux vidéo alternatif (par exemple, un angle de caméra différent lors d'un match) est fourni dans deux débits. Dans ce cas, deux groupes de pistes vidéo sont créés, l'un correspondant à l'emplacement principal flux vidéo contenant cinq pistes et une seconde pour le flux vidéo alternatif contenant deux pistes.

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

Chaque Group peut être interrogé pour déterminer les pistes compatibles qui sont actuellement sélectionnés, ainsi que l'élément Format utilisé 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);
  }
}

  • Une piste est compatible si la Player est capable de décoder et d'afficher son exemples. Notez que même si plusieurs groupes de suivi du même type (par exemple, plusieurs groupes de pistes audio) sont compatibles, cela signifie simplement qu'ils sont pris en charge individuellement et que le lecteur n'est pas forcément en mesure de les lire en même temps.
  • Une piste est sélectionnée si elle a été choisie pour la lecture compte tenu de la TrackSelectionParameters Si plusieurs pistes d'un même groupe sélectionné, le lecteur utilise ces pistes pour une lecture adaptative (par exemple, plusieurs pistes vidéo avec des débits différents). Notez qu'un seul de ces éléments de tous les titres disponibles simultanément.

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

Le processus de sélection de la piste peut être configuré Player.setTrackSelectionParameters Vous pouvez le faire avant et pendant lecture. L'exemple suivant montre comment obtenir la valeur TrackSelectionParameters du lecteur, les modifier et mettre à jour les Player par 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 piste basée sur des contraintes

La plupart des options de TrackSelectionParameters vous permettent de spécifier des contraintes, qui sont indépendantes des pistes disponibles. Disponible comprennent:

  • Largeur, hauteur, fréquence d'images et débit minimal et maximal de la vidéo.
  • Nombre et débit maximal de canaux audio.
  • Types MIME préférés pour la vidéo et l'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 raisonnables pour ces contraintes, par exemple en limitant la résolution vidéo à la taille d'affichage, et privilégiez la langue audio correspond aux paramètres régionaux définis par l'utilisateur.

La sélection de pistes basée sur des contraintes présente plusieurs avantages en sélectionnant des titres spécifiques parmi ceux disponibles:

  • Vous pouvez spécifier des contraintes avant de savoir quel suivi un élément multimédia fournit. Cela signifie que les contraintes peuvent être spécifiées avant que le joueur n'ait préparé une élément multimédia, alors que la sélection de pistes spécifiques nécessite un code d'application attendre que les canaux disponibles soient connus.
  • Des contraintes sont appliquées à tous les éléments multimédias d'une playlist, même lorsque ceux-ci éléments ont différents canaux disponibles. Par exemple, la langue audio préférée est automatiquement appliquée à tous les éléments multimédias, même si 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 titres spécifiques avec TrackSelectionParameters. Tout d'abord, les titres actuellement disponibles du joueur doivent être interrogés Player.getCurrentTracks Deuxièmement, après avoir identifié les pistes à sélectionner, ils peuvent être définis 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 TrackSelectionOverride ne s'applique qu'aux éléments multimédias contenant un TrackGroup correspond exactement à celui spécifié dans le forçage. D'où une peut ne pas s'appliquer à un autre élément multimédia si celui-ci contient différentes pistes.

Désactiver des types ou des groupes de canaux

Vous pouvez désactiver complètement certains types de pistes (vidéo, audio ou texte, par exemple) TrackSelectionParameters.Builder.setTrackTypeDisabled Un type de canal 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());

Il est également possible d'empêcher la sélection de titres à partir d'un TrackGroup en spécifiant un remplacement 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 de la piste relève d'un TrackSelector, une instance pouvant être fournies 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 utilisations cas d'utilisation. Elle utilise le TrackSelectionParameters défini dans Player, mais aussi propose 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 si la combinaison de moteurs de rendu des pistes sélectionnées le prend en charge. Pour ce faire, utilisez DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)

Déchargement audio

Vous pouvez activer la lecture audio déchargée si la combinaison de et les pistes sélectionnées le prennent en charge. 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());
);