Sélection du titre

Lorsqu'un élément multimédia contient plusieurs pistes, la sélection de pistes est le processus qui détermine lesquelles 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 substitutions différentes qui influencent la sélection des pistes.

Interroger les pistes disponibles

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

  • Les pistes disponibles sont connues lorsque la préparation de l'élément multimédia en cours de lecture est 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 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 actuelles en appelant player.getCurrentTracks(). L'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 des formats différents.

Pour illustrer le regroupement des pistes, prenons l'exemple d'une lecture adaptative où un flux vidéo principal est fourni avec cinq débits binaires et un flux vidéo alternatif (par exemple, un angle de caméra différent lors d'un match sportif) est fourni avec deux débits binaires. Dans ce cas, il y aura deux groupes de pistes vidéo : un correspondant au flux vidéo principal contenant cinq pistes et un second pour le flux vidéo alternatif contenant deux pistes.

Les pistes audio dont les langues diffèrent ne sont pas regroupées, car le contenu dans différentes langues n'est pas considéré comme identique. À 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 binaire, la fréquence 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 les pistes compatibles avec la lecture, celles actuellement sélectionnées et le 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 prise en charge 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 (par exemple, plusieurs groupes de pistes audio) sont acceptés, cela signifie uniquement qu'ils sont acceptés individuellement et que le lecteur n'est pas nécessairement en mesure de les lire en même temps.
  • Une piste est sélectionnée si elle a été choisie pour la lecture en fonction de la 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 binaires différents). Notez qu'un seul de ces titres sera lu à la fois.

Modifier les paramètres de sélection des pistes

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 actuels du lecteur, les modifier et mettre à jour les 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 basée sur des contraintes

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

  • Largeur, hauteur, fréquence d'images et débit vidéo maximaux et minimaux.
  • Nombre maximal de canaux audio et débit binaire.
  • 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 de l'écran et en privilégiant la langue audio qui correspond au paramètre régional 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 quelles pistes un élément multimédia fournit. Cela signifie que les contraintes peuvent être spécifiées avant que le lecteur n'ait préparé un élément multimédia, alors 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 lorsque ces éléments ont des pistes disponibles différentes. Par exemple, une contrainte de langue audio préférée sera automatiquement appliquée à tous les éléments multimédias, même si le 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 pistes 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 pour le lecteur doivent être interrogées à l'aide de Player.getCurrentTracks. Ensuite, une fois les pistes à sélectionner identifiées, elles peuvent être définies 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'appliquera qu'aux éléments multimédias contenant un TrackGroup correspondant exactement à celui spécifié dans le remplacement. Par conséquent, un remplacement 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 vidéo, audio ou texte peuvent être complètement désactivés à l'aide de TrackSelectionParameters.Builder.setTrackTypeDisabled. Un type de piste désactivé le sera 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 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 pistes

La sélection des pistes est la responsabilité d'un TrackSelector, dont une instance peut être fournie chaque fois qu'un ExoPlayer est créé et obtenue 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 qui convient à la plupart des cas d'utilisation. Il 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));

Tunneling

La mise en tunnel peut aider à lire efficacement les flux haute résolution sur certains téléviseurs. Pour en savoir plus, consultez la page Consommation de la batterie.

Vous pouvez définir une préférence pour la lecture tunnelée afin de l'activer lorsque la combinaison de moteurs de rendu et de pistes sélectionnées la prend en charge. Pour ce faire, utilisez DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Déchargement audio

Le déchargement audio peut aider à économiser de l'énergie, en particulier pour les lectures plus longues avec l'écran éteint. Consultez la page sur la consommation de batterie pour plus d'informations.

Vous pouvez définir des préférences pour la lecture audio déchargée afin de l'activer lorsque la combinaison de moteurs de rendu et de 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());