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()); );