Wenn ein Medienelement mehrere Tracks enthält, ist die Track-Auswahl der Prozess,
bestimmt, welche davon
für die Wiedergabe ausgewählt werden. Der Prozess der Titelauswahl
konfiguriert von TrackSelectionParameters
, womit viele verschiedene
Einschränkungen und Überschreibungen, die die Angabe der Titelauswahl beeinflussen.
Verfügbare Tracks abfragen
Du kannst Player.Listener.onTracksChanged
anhören, um über Änderungen benachrichtigt zu werden
zu Tracks wie:
- Die verfügbaren Tracks werden bei der Vorbereitung des Medienelements ermittelt. abgeschlossenen Wiedergaben. Der Player muss ein Medienelement vorbereiten, damit welche Tracks es enthält.
- Die verfügbaren Titel ändern sich aufgrund der Übertragung von einem Medium. zu einem anderen Element.
- Änderungen an den ausgewählten Tracks.
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. } });
Du kannst die aktuellen Tracks auch durch Aufrufen von player.getCurrentTracks()
abfragen.
Die zurückgegebene Tracks
enthält eine Liste von Track.Group
-Objekten, wobei Tracks innerhalb eines
einzelne Group
präsentieren den gleichen Inhalt, aber in unterschiedlichen Formaten.
Ein Beispiel für die Gruppierung von Titeln ist eine adaptive Wiedergabe, bei der ein Hauptvideofeed in fünf Bitraten und ein alternativer Videofeed bereitgestellt wird. (zum Beispiel ein anderer Kamerawinkel bei einem Sportmatch) wird in zwei Bitraten bereitgestellt. In diesem Fall gibt es zwei Video-Track-Gruppen, eine für die Hauptgruppe Videofeed mit fünf Titeln und einem zweiten für den alternativen Videofeed mit zwei Titeln.
Audiotracks mit unterschiedlichen Sprachen werden nicht gruppiert, da die Inhalte in verschiedene Sprachen gelten nicht als gleich. Im Gegensatz dazu können Audiotracks in der gleichen Sprache, die sich nur in Eigenschaften wie Bitrate, Sampling unterscheiden z. B. die Kanalanzahl oder -rate. Dies gilt auch für Text-Tracks.
Jeder Group
kann abgefragt werden, um zu ermitteln, welche Tracks für
die aktuell ausgewählt sind und was Format
in den einzelnen Titeln verwendet wird:
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); } }
- Ein Track wird unterstützt, wenn der
Player
seinen decodieren und rendern kann. Proben. Auch wenn mehrere Trackgruppen desselben Typs (z. B. mehrere Audiotracks) unterstützt werden, bedeutet dies nur, dass sie einzeln unterstützt und der Player kann sie nicht unbedingt gleichzeitig. - Ein Titel gilt als ausgewählt, wenn er anhand der aktuellen
TrackSelectionParameters
Wenn mehrere Tracks in einer Trackgruppe ausgewählt haben, werden diese Tracks für die adaptive Wiedergabe verwendet (z. B. mehrere Videotracks mit unterschiedlichen Bitraten enthalten. Beachten Sie, dass nur eine dieser gleichzeitig abgespielt werden.
Parameter für die Trackauswahl ändern
Die Trackauswahl kann über
Player.setTrackSelectionParameters
Das ist sowohl vor als auch während
Wiedergabe starten. Das folgende Beispiel zeigt, wie Sie den aktuellen
TrackSelectionParameters
aus dem Player, ändere sie und aktualisiere Player
durch das geänderte Ergebnis:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
Einschränkungsbasierte Titelauswahl
Mit den meisten Optionen in TrackSelectionParameters
können Sie Einschränkungen,
die unabhängig von den
tatsächlich verfügbaren Tracks sind. Verfügbar
Zu den Einschränkungen gehören:
- Maximale und minimale Videobreite, -höhe, -framerate und -bitrate
- Maximale Anzahl und Bitrate von Audiokanälen.
- Bevorzugte MIME-Typen für Video und Audio.
- Bevorzugte Audiosprachen und Rollenkennzeichen.
- Bevorzugte Textsprachen und Rollenkennzeichen.
ExoPlayer verwendet vernünftige Standardwerte für diese Einschränkungen, der Anzeigegröße anpassen und die Audiosprache des mit der Spracheinstellung des Systems übereinstimmt.
Die einschränkungsbasierte Track-Auswahl hat gegenüber Auswahl bestimmter Tracks aus den verfügbaren:
- Sie können Einschränkungen festlegen, bevor Sie wissen, was ein Medienelement erfasst. Das bedeutet, dass Einschränkungen angegeben werden können, bevor der Spieler ein ein Medienelement, während für die Auswahl bestimmter Tracks ein Anwendungscode erforderlich ist, warten, bis die verfügbaren Tracks bekannt werden.
- Einschränkungen werden auf alle Medienelemente in einer Playlist angewendet, selbst wenn diese
Elemente haben unterschiedliche Tracks. Zum Beispiel eine bevorzugte Audiosprache
wird automatisch auf alle Medienelemente angewendet, auch wenn das
Format
des Titels in dieser Sprache variieren je nach Medienelement. Dies ist bei der Auswahl bestimmter Tracks nicht der Fall, wie unten beschrieben.
Bestimmte Tracks auswählen
Mit TrackSelectionParameters
kannst du bestimmte Tracks auswählen. Erstens:
sollten die aktuell verfügbaren Tracks des Spielers
Player.getCurrentTracks
Nachdem Sie die Titel ausgewählt haben,
Sie können für TrackSelectionParameters
mit einem TrackSelectionOverride
festgelegt werden.
So kannst du beispielsweise den ersten Titel aus einem bestimmten audioTrackGroup
auswählen:
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());
Ein TrackSelectionOverride
gilt nur für Medienelemente, die Folgendes enthalten:
TrackGroup
stimmt genau mit dem in der Überschreibung angegebenen Wert überein. Daher ist eine
wird die Überschreibung möglicherweise nicht auf ein nachfolgendes Medienelement angewendet, wenn dieses Element folgende Elemente enthält:
in verschiedenen Tracks.
Track-Typen oder -Gruppen deaktivieren
Tracktypen wie Video, Audio oder Text können mit
TrackSelectionParameters.Builder.setTrackTypeDisabled
Deaktivierter Track-Typ
wird für alle Medienelemente deaktiviert:
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());
Alternativ ist es möglich, die Auswahl von Tracks von einem bestimmten
TrackGroup
durch Angabe einer leeren Überschreibung für diese Gruppe:
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());
Titelauswahl anpassen
Die Trackauswahl erfolgt in der Verantwortung einer TrackSelector
, einer Instanz
von denen angegeben werden kann, wenn eine ExoPlayer
erstellt und später abgerufen wird
mit 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
ist eine flexible TrackSelector
und eignet sich für die meisten Anwendungen
Cases. Sie verwendet das in Player
festgelegte TrackSelectionParameters
, aber auch
bietet einige erweiterte Anpassungsoptionen, die im Feld
DefaultTrackSelector.ParametersBuilder
:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Tunneling
Sie können die getunnelte Wiedergabe aktivieren, wenn die Kombination aus Renderern und
ausgewählten Tracks dies unterstützen. Verwenden Sie dazu
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
Audio-Offload
Sie können die ausgelagerte Audiowiedergabe aktivieren, wenn die Kombination aus
von Renderern und ausgewählten Tracks unterstützt. Geben Sie dazu
AudioOffloadModePreferences
in deinem 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()); );