Track-Auswahl

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