Track-Auswahl

Wenn ein Medienelement mehrere Tracks enthält, wird durch die Titelauswahl bestimmt, welche davon für die Wiedergabe ausgewählt werden. Die Trackauswahl wird von TrackSelectionParameters konfiguriert. Damit können viele verschiedene Einschränkungen und Überschreibungen angegeben werden, die die Trackauswahl beeinflussen.

Verfügbare Tracks abfragen

Sie können auf Player.Listener.onTracksChanged warten, um über Änderungen an Tracks informiert zu werden, darunter:

  • Die verfügbaren Titel werden bekannt, wenn die Vorbereitung des wiedergegebenen Mediaelements abgeschlossen ist. Der Player muss ein Medienelement vorbereiten, damit bekannt ist, welche Titel darin enthalten sind.
  • Die verfügbaren Titel ändern sich, wenn die Wiedergabe von einem Medienelement zu einem anderen übergeht.
  • Ä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 auch player.getCurrentTracks() aufrufen, um die aktuellen Tracks abzufragen. Das zurückgegebene Tracks enthält eine Liste von Track.Group-Objekten, wobei Tracks innerhalb einer einzelnen Group denselben Inhalt, jedoch in unterschiedlichen Formaten enthalten.

Ein Beispiel für die Gruppierung von Tracks ist die adaptive Wiedergabe, bei der ein Hauptvideofeed mit fünf Bitraten und ein alternativer Videofeed (z. B. bei einem Sportspiel ein anderer Kamerawinkel) in zwei Bitraten bereitgestellt wird. In diesem Fall gibt es zwei Video-Track-Gruppen: eine für den Hauptvideofeed mit fünf Tracks und eine zweite für den alternativen Videofeed mit zwei Tracks.

Audiotracks mit unterschiedlichen Sprachen werden nicht gruppiert, da Inhalte in verschiedenen Sprachen nicht als identisch angesehen werden. Umgekehrt können Audiotracks in derselben Sprache, die sich nur in Eigenschaften wie Bitrate, Abtastrate, Kanalanzahl usw. unterscheiden, gruppiert werden. Dies gilt auch für Textspuren.

Jede Group kann abgefragt werden, um zu ermitteln, welche Tracks für die Wiedergabe unterstützt werden, welche aktuell ausgewählt sind und welche Format jeder Track verwendet:

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 seine Beispiele decodieren und rendern kann. Auch wenn mehrere Trackgruppen desselben Typs (z. B. mehrere Audiotrackgruppen) unterstützt werden, bedeutet dies nur, dass sie einzeln unterstützt werden und der Player sie nicht unbedingt gleichzeitig abspielen kann.
  • Ein Titel ist ausgewählt, wenn er unter Berücksichtigung des aktuellen TrackSelectionParameters für die Wiedergabe ausgewählt wurde. Wenn mehrere Tracks innerhalb einer Trackgruppe ausgewählt sind, verwendet der Player diese Tracks für die adaptive Wiedergabe, z. B. mehrere Videotracks mit unterschiedlichen Bitraten. Beachte, dass jeweils nur einer dieser Tracks wiedergegeben wird.

Parameter zur Titelauswahl ändern

Die Trackauswahl kann mit Player.setTrackSelectionParameters konfiguriert werden. Das ist sowohl vor als auch während der Wiedergabe möglich. Das folgende Beispiel zeigt, wie du den aktuellen TrackSelectionParameters aus dem Player abrufen, ändern und den 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änkungsbasierte Auswahl des Tracks

Mit den meisten Optionen in TrackSelectionParameters können Sie Einschränkungen angeben, die unabhängig von den tatsächlich verfügbaren Tracks sind. Verfügbare Einschränkungen:

  • Maximale und minimale Videobreite, -höhe, Framerate und Bitrate.
  • Maximale Anzahl der Audiokanäle und 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. die Beschränkung der Videoauflösung auf die Anzeigegröße und die bevorzugte Audiosprache, die der Systemsprache des Nutzers entspricht.

Die einschränkungsbasierte Tracksauswahl bietet gegenüber der Auswahl bestimmter Tracks aus den verfügbaren Tracks mehrere Vorteile:

  • Sie können Beschränkungen festlegen, bevor Sie wissen, was ein Medienelement verfolgt. Einschränkungen können also festgelegt werden, bevor der Player ein Medienelement vorbereitet hat. Bei der Auswahl bestimmter Tracks hingegen muss der Anwendungscode warten, bis die verfügbaren Tracks bekannt sind.
  • Einschränkungen werden für alle Medienelemente in einer Playlist angewendet, auch wenn für diese Elemente unterschiedliche Titel verfügbar sind. Beispielsweise wird eine bevorzugte Audiosprache automatisch auf alle Medienelemente angewendet, auch wenn sich die Format des Titels in dieser Sprache von einem Medienelement zum nächsten unterscheidet. Das ist nicht der Fall, wenn Sie bestimmte Tracks wie unten beschrieben auswählen.

Bestimmte Titel auswählen

Es ist möglich, mit TrackSelectionParameters bestimmte Titel auszuwählen. Zuerst sollten die derzeit verfügbaren Tracks des Spielers mit Player.getCurrentTracks abgefragt werden. Nachdem Sie dann die auszuwählenden Tracks ermittelt haben, können sie auf TrackSelectionParameters mit einem TrackSelectionOverride festgelegt werden. So kannst du beispielsweise den ersten Titel eines 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 wird nur auf Medienelemente angewendet, die eine TrackGroup enthalten, die genau mit der in der Überschreibung angegebenen übereinstimmt. Daher gilt eine Überschreibung möglicherweise nicht für ein nachfolgendes Medienelement, wenn dieses Element andere Tracks enthält.

Tracking-Typen oder -Gruppen deaktivieren

Titeltypen wie Video, Audio oder Text können mit TrackSelectionParameters.Builder.setTrackTypeDisabled vollständig deaktiviert werden. Ein 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 kannst du die Auswahl von Tracks aus einer bestimmten TrackGroup verhindern, indem du für diese Gruppe eine leere Überschreibung angibst:

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 liegt in der Verantwortung einer TrackSelector, deren Instanz immer dann bereitgestellt werden kann, 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 eine flexible TrackSelector, die für die meisten Anwendungsfälle geeignet ist. Dabei wird der in Player festgelegte TrackSelectionParameters verwendet, bietet aber auch einige erweiterte Anpassungsoptionen, die in der DefaultTrackSelector.ParametersBuilder festgelegt werden können:

Kotlin

trackSelector.setParameters(
  trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)

Java

trackSelector.setParameters(
    trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

Tunneling

Sie können die getunnelte Wiedergabe aktivieren, wenn dies von der Kombination aus Renderern und ausgewählten Tracks unterstützt wird. Verwenden Sie dazu DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Audio-Offload

Du kannst die ausgelagerte Audiowiedergabe aktivieren, wenn dies von der Kombination aus Renderern und ausgewählten Tracks unterstützt wird. 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());
);