Wenn ein Media-Element mehrere Tracks enthält, wird durch die Trackauswahl festgelegt, welche davon für die Wiedergabe ausgewählt werden. Der Prozess zur Auswahl von Tracks wird durch TrackSelectionParameters konfiguriert. Damit können viele verschiedene Einschränkungen und Überschreibungen angegeben werden, die die Auswahl von Tracks beeinflussen.
Verfügbare Tracks abfragen
Du kannst Player.Listener.onTracksChanged abonnieren, um über Änderungen an Tracks benachrichtigt zu werden, z. B. wenn
- Die verfügbaren Tracks werden erst angezeigt, wenn die Vorbereitung des wiedergegebenen Medienelements abgeschlossen ist. Der Player muss ein Media-Element vorbereiten, um zu wissen, welche Tracks es enthält.
- Die verfügbaren Titel ändern sich, wenn die Wiedergabe von einem Media-Element zum nächsten wechselt.
- Ä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. } });
Sie können die aktuellen Tracks auch durch Aufrufen von player.getCurrentTracks() abfragen.
Das zurückgegebene Tracks enthält eine Liste von Tracks.Group-Objekten, wobei Tracks innerhalb eines einzelnen Group denselben Inhalt, aber in unterschiedlichen Formaten präsentieren.
Ein Beispiel für die Gruppierung von Tracks: Bei der adaptiven Wiedergabe wird ein Hauptvideofeed in fünf Bitraten und ein alternativer Videofeed (z. B. ein anderer Kamerawinkel bei einem Sportspiel) in zwei Bitraten bereitgestellt. 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 mit unterschiedlichen Sprachen werden nicht gruppiert, da Inhalte in verschiedenen Sprachen nicht als identisch gelten. Umgekehrt können Audiotracks in derselben Sprache, die sich nur in Eigenschaften wie Bitrate, Samplingrate oder Anzahl der Kanäle unterscheiden, gruppiert werden. Das gilt auch für Text-Tracks.
Für jedes Group kann abgefragt werden, welche Tracks für die Wiedergabe unterstützt werden, welche derzeit ausgewählt sind und welche Format für jeden Track 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
Playerseine Samples decodieren und rendern kann. Auch wenn mehrere Trackgruppen desselben Typs (z. B. mehrere Audio-Trackgruppen) unterstützt werden, bedeutet das nicht, dass der Player sie gleichzeitig abspielen kann. - Ein Track ist ausgewählt, wenn er aufgrund der aktuellen
TrackSelectionParametersfür die Wiedergabe ausgewählt wurde. Wenn mehrere Tracks in einer Trackgruppe ausgewählt sind, verwendet der Player diese Tracks für die adaptive Wiedergabe (z. B. mehrere Videotracks mit unterschiedlichen Bitraten). Es wird immer nur ein Track wiedergegeben.
Parameter für die Auswahl der Zielgruppe ändern
Der Prozess zur Auswahl des Tracks kann mit Player.setTrackSelectionParameters konfiguriert werden. Das ist sowohl vor als auch während der Wiedergabe möglich. Das folgende Beispiel zeigt, wie Sie die aktuellen TrackSelectionParameters vom Player abrufen, sie ändern und die Player mit dem geänderten Ergebnis aktualisieren:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
Constraint-basierte Track-Auswahl
Mit den meisten Optionen in TrackSelectionParameters können Sie Einschränkungen angeben, die unabhängig von den tatsächlich verfügbaren Tracks sind. Folgende Einschränkungen sind verfügbar:
- Maximale und minimale Videobreite, ‑höhe, ‑framerate und ‑bitrate.
- Maximale Anzahl von Audiokanälen und maximale Bitrate.
- Bevorzugte MIME-Typen für Video und Audio.
- Bevorzugte Audiosprachen und Rollen-Flags.
- Bevorzugte Textsprachen und Rollen-Flags.
ExoPlayer verwendet sinnvolle Standardwerte für diese Einschränkungen, z. B. wird die Videoauflösung auf die Displaygröße beschränkt und die Audiosprache bevorzugt, die der Systemeinstellung für das Gebietsschema des Nutzers entspricht.
Die einschränkungsbasierte Auswahl von Tracks bietet mehrere Vorteile gegenüber der Auswahl bestimmter verfügbarer Tracks:
- Sie können Einschränkungen festlegen, bevor Sie wissen, welche Tracks ein Media-Element bietet. Das bedeutet, dass Einschränkungen angegeben werden können, bevor der Player ein Media-Element vorbereitet hat. Für die Auswahl bestimmter Tracks muss der Anwendungscode hingegen warten, bis die verfügbaren Tracks bekannt sind.
- Einschränkungen werden auf alle Media-Elemente in einer Playlist angewendet, auch wenn für diese Elemente unterschiedliche Tracks verfügbar sind. Eine Einschränkung für die bevorzugte Audiosprache wird beispielsweise automatisch auf alle Media-Elemente angewendet, auch wenn sich die
Formatdes Tracks in dieser Sprache von Media-Element zu Media-Element unterscheidet. Das ist nicht der Fall, wenn Sie bestimmte Tracks auswählen, wie unten beschrieben.
Bestimmte Tracks auswählen
Mit TrackSelectionParameters können Sie bestimmte Tracks auswählen. Zuerst sollten die aktuell verfügbaren Tracks des Players mit Player.getCurrentTracks abgefragt werden. Nachdem die Tracks ausgewählt wurden, können sie mit einem TrackSelectionOverride für TrackSelectionParameters festgelegt werden.
Wenn Sie beispielsweise den ersten Track aus einem bestimmten audioTrackGroup auswählen möchten:
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 wird nur auf Media-Elemente angewendet, die ein TrackGroup enthalten, das genau dem im Override angegebenen entspricht. Daher wird eine Überschreibung möglicherweise nicht auf ein nachfolgendes Media-Element angewendet, wenn dieses andere Tracks enthält.
Track-Typen oder -Gruppen deaktivieren
Spurtypen wie Video, Audio oder Text können mit TrackSelectionParameters.Builder.setTrackTypeDisabled vollständig deaktiviert werden. Ein deaktivierter Tracktyp 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 können Sie die Auswahl von Tracks aus einem bestimmten TrackGroup verhindern, indem Sie für diese Gruppe eine leere Überschreibung angeben:
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());
Track-Auswahl anpassen
Die Auswahl des Tracks liegt in der Verantwortung eines TrackSelector. Eine Instanz davon kann bereitgestellt werden, wenn ein ExoPlayer erstellt wird, und später mit ExoPlayer.getTrackSelector() abgerufen werden.
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. Außerdem werden einige erweiterte Anpassungsoptionen bereitgestellt, die in der DefaultTrackSelector.ParametersBuilder angegeben werden können:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Tunneling
Tunneling kann bei einigen TV-Geräten zu einer effizienten Videowiedergabe von Streams mit hoher Auflösung beitragen. Weitere Hinweise und Details finden Sie auf der Seite Akkunutzung.
Du kannst eine Einstellung für die Wiedergabe über Tunnel festlegen, um sie in Fällen zu aktivieren, in denen die Kombination aus Renderern und ausgewählten Tracks sie unterstützt. Verwenden Sie dazu DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).
Audio-Offload
Durch die Audio-Auslagerung kann Strom gespart werden, insbesondere bei längeren Wiedergaben mit ausgeschaltetem Bildschirm. Weitere Hinweise und Details finden Sie auf der Seite Akkunutzung.
Sie können Einstellungen für die ausgelagerte Audiowiedergabe festlegen, um sie in Fällen zu aktivieren, in denen die Kombination aus Renderern und ausgewählten Tracks sie unterstützt. Geben Sie dazu AudioOffloadModePreferences in Ihrem 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());