Track-Auswahl

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