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
Playerest 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
TrackSelectionParametersactuelle. 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
Formatde 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());