Wenn ein Medienelement mehrere Titel enthält, wird durch die Titelauswahl bestimmt, welche davon für die Wiedergabe ausgewählt werden. Die Titelauswahl wird über TrackSelectionParameters
konfiguriert. So können viele verschiedene Einschränkungen und Überschreibungen festgelegt werden, die die Titelauswahl beeinflussen.
Verfügbare Titel abfragen
Wenn du Player.Listener.onTracksChanged
hörst, wirst du über Änderungen an Titeln benachrichtigt, z. B.:
- Die verfügbaren Titel werden bekannt, wenn die Vorbereitung des wiedergegebenen Medienelements abgeschlossen ist. Der Player muss ein Medienelement vorbereiten, um zu wissen, welche Titel es enthält.
- Die verfügbaren Titel ändern sich, weil die Wiedergabe von einem Medienelement zum nächsten wechselt.
- Änderungen an den ausgewählten Titeln.
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. } });
Sie können die aktuellen Titel auch durch Aufrufen von player.getCurrentTracks()
abfragen.
Die zurückgegebene Tracks
enthält eine Liste von Tracks.Group
-Objekten, bei denen die Titel innerhalb einer einzelnen Group
denselben Inhalt, aber in verschiedenen Formaten enthalten.
Ein Beispiel für die Gruppierung von Tracks ist eine adaptive Wiedergabe, bei der ein Hauptvideofeed in fünf Bitrate und ein alternativer Videofeed (z. B. ein anderer Kamerawinkel bei einem Sportereignis) in zwei Bitrate bereitgestellt wird. In diesem Fall gibt es zwei Videotrackgruppen: eine für den Hauptvideofeed mit fünf Tracks und eine für den alternativen Videofeed mit zwei Tracks.
Audiotracks in unterschiedlichen Sprachen werden nicht gruppiert, da Inhalte in verschiedenen Sprachen nicht als identisch betrachtet werden. Umgekehrt können Audiotracks in derselben Sprache, die sich nur in Eigenschaften wie Bitrate, Abtastrate, Kanalanzahl usw. unterscheiden, gruppiert werden. Das gilt auch für Untertitel.
Für jeden Group
kann abgefragt werden, welche Titel für die Wiedergabe unterstützt werden, welche derzeit ausgewählt sind und welche Format
für jeden Titel verwendet werden:
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 die
Player
seine Samples decodieren und rendern kann. Auch wenn mehrere Titelgruppen desselben Typs (z. B. mehrere Audiotitelgruppen) unterstützt werden, bedeutet das nur, dass sie einzeln unterstützt werden und der Player sie nicht unbedingt gleichzeitig abspielen kann. - Ein Titel ist ausgewählt, wenn er für die Wiedergabe unter Berücksichtigung der aktuellen
TrackSelectionParameters
ausgewählt wurde. Wenn mehrere Tracks innerhalb einer Titelgruppe ausgewählt sind, verwendet der Player diese Tracks für die adaptive Wiedergabe (z. B. mehrere Videotracks mit unterschiedlichen Bitraten). Hinweis: Es wird immer nur einer dieser Titel abgespielt.
Parameter für die Titelauswahl ändern
Die Titelauswahl kann mit Player.setTrackSelectionParameters
konfiguriert werden. Das ist sowohl vor als auch während der Wiedergabe möglich. Im folgenden Beispiel wird gezeigt, wie du die aktuellen TrackSelectionParameters
vom Player abrufen, ändern und die Player
mit dem geänderten Ergebnis aktualisieren kannst:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
Einschränkungenbasierte Titelauswahl
Mit den meisten Optionen in TrackSelectionParameters
können Sie Einschränkungen angeben, die unabhängig von den tatsächlich verfügbaren Titeln sind. Zu den verfügbaren Einschränkungen gehören:
- Maximale und minimale Videobreite, -höhe, -Framerate und -Bitrate
- Maximale Anzahl von Audiokanälen und Bitrate.
- Bevorzugte MIME-Typen für Video und Audio
- Bevorzugte Audiosprachen und Rollenflaggen.
- Bevorzugte Textsprachen und Rollenflaggen
ExoPlayer verwendet für diese Einschränkungen sinnvolle Standardeinstellungen. So wird beispielsweise die Videoauflösung auf die Bildschirmgröße beschränkt und die Audiosprache wird der Systemlokalisierung des Nutzers vorgezogen.
Die Constraint-basierte Titelauswahl hat mehrere Vorteile gegenüber der Auswahl bestimmter Titel aus den verfügbaren Titeln:
- Du kannst Einschränkungen angeben, bevor du weißt, welche Titel ein Medienelement enthält. Das bedeutet, dass Einschränkungen angegeben werden können, bevor der Player ein Medienelement vorbereitet hat. Bei der Auswahl bestimmter Titel muss der Anwendungscode dagegen warten, bis die verfügbaren Titel bekannt sind.
- Einschränkungen gelten für alle Medienelemente in einer Playlist, auch wenn für diese Elemente unterschiedliche Titel verfügbar sind. Eine Einschränkung für die bevorzugte Audiosprache wird beispielsweise automatisch auf alle Medienelemente angewendet, auch wenn die
Format
des Titels in dieser Sprache von Medium zu Medium variiert. Das ist nicht der Fall, wenn du bestimmte Titel auswählst, wie unten beschrieben.
Bestimmte Titel auswählen
Mit TrackSelectionParameters
kannst du bestimmte Titel auswählen. Zuerst sollten die derzeit verfügbaren Titel des Players mit Player.getCurrentTracks
abgefragt werden. Zweitens: Nachdem du die gewünschten Titel ausgewählt hast, kannst du sie mit einem TrackSelectionOverride
auf TrackSelectionParameters
setzen.
So wählst du beispielsweise den ersten Titel aus einer bestimmten audioTrackGroup
aus:
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());
Eine TrackSelectionOverride
wird nur auf Medienelemente angewendet, die eine TrackGroup
enthalten, die genau mit der in der Überschreibung angegebenen übereinstimmt. Daher wird eine Überschreibung möglicherweise nicht auf ein nachfolgendes Medienelement angewendet, wenn dieses Element unterschiedliche Titel enthält.
Titeltypen oder -gruppen deaktivieren
Mit TrackSelectionParameters.Builder.setTrackTypeDisabled
können Sie Tracktypen wie Video, Audio oder Text vollständig deaktivieren. Ein deaktivierter Titeltyp 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 kannst du die Auswahl von Titeln aus einer bestimmten TrackGroup
verhindern, indem du für diese Gruppe eine leere Überschreibung festlegst:
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 Titelauswahl obliegt einem TrackSelector
. Eine Instanz davon kann bereitgestellt werden, wenn ein ExoPlayer
erstellt und später mit ExoPlayer.getTrackSelector()
abgerufen wird.
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 ein flexibles TrackSelector
, das für die meisten Anwendungsfälle geeignet ist. Dabei wird die in der Player
festgelegte TrackSelectionParameters
verwendet. Es bietet aber auch einige erweiterte Anpassungsoptionen, die in der DefaultTrackSelector.ParametersBuilder
angegeben werden können:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Tunneling
Du kannst die getunnelte Wiedergabe aktivieren, wenn die Kombination aus Renderern und ausgewählten Tracks dies unterstützt. Verwenden Sie dazu DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
.
Audio-Offload
Du kannst die ausgelagerte Audiowiedergabe aktivieren, wenn die Kombination aus Renderern und ausgewählten Tracks dies unterstützt. Geben Sie dazu AudioOffloadModePreferences
in Ihrer TrackSelectionParameters
an.
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()); );