Wybór ścieżki

Jeśli element multimedialny zawiera wiele ścieżek, wybór ścieżki to proces, określa, które z nich zostaną wybrane do odtwarzania. Proces wyboru utworu jest skonfigurowane przez TrackSelectionParameters, co umożliwia wiele różnych ograniczeń i zastąpień, które mają wpływ na wybór ścieżki do określenia.

Wysyłanie zapytań o dostępne ścieżki

Możesz odsłuchać utwór Player.Listener.onTracksChanged, aby otrzymywać powiadomienia o zmianach do ścieżek, w tym:

  • Dostępne ścieżki stają się znane podczas przygotowywania elementu multimedialnego pełne odtworzenia. Pamiętaj, że odtwarzacz musi przygotować element multimedialny do odczytania które ścieżki są dostępne.
  • Dostępne ścieżki zmieniają się z powodu przejścia z jednego multimediów do innego elementu.
  • Zmiany na wybranych ścieżkach.

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.
      }
    });

Możesz też wysyłać zapytania dotyczące bieżących utworów, wywołując player.getCurrentTracks(). Zwrócona wartość Tracks zawiera listę Track.Group obiektów, gdzie jest śledzona w obrębie pojedyncze Group zawierają te same treści, ale w różnych formatach.

Przykładem grupowania utworów jest odtwarzanie adaptacyjne, w którym główny kanał wideo jest dostępny z 5 szybkością transmisji bitów, a alternatywny kanał wideo (np. inny kąt kamery w trakcie meczu sportowego) jest podawany w 2 szybkości transmisji bitów. W tym przypadku będą 2 grupy ścieżek wideo: jedna odpowiada głównej kanał wideo zawierający pięć utworów i drugi plik wideo z dwoma ścieżkami.

Ścieżki audio, których język się różni, nie są grupowane, ponieważ treści różne języki nie są traktowane jako takie same. Natomiast ścieżki audio w tym samym języku, które różnią się tylko właściwościami, takimi jak szybkość transmisji bitów, próbkowanie. stawki, liczbę kanałów itd. Dotyczy to również ścieżek tekstowych.

Każdy element Group można wysłać w celu określenia, które ścieżki są obsługiwane które są obecnie wybrane i jakie Format wykorzystuje każdy z utworów:

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

  • Ścieżka jest obsługiwana, jeśli Player może zdekodować i wyrenderować przykłady. Pamiętaj, że nawet wtedy, gdy wiele grup ścieżek tego samego typu (na przykład wiele grup ścieżek audio) są obsługiwane, oznacza to tylko, że są one są obsługiwane indywidualnie, a odtwarzacz niekoniecznie będzie w stanie je odtworzyć o tej samej nazwie.
  • Ścieżka jest wybierana, jeśli została wybrana do odtworzenia w danej chwili TrackSelectionParameters Jeśli w grupie ścieżek jest wiele ścieżek, wybrane, odtwarzacz wykorzysta te ścieżki do odtwarzania adaptacyjnego (na przykład wiele ścieżek wideo o różnych szybkościach transmisji bitów). Pamiętaj, że tylko jedno z nich utwory zostaną odtworzone w dowolnym momencie.

Zmiana parametrów wyboru ścieżki

Proces wyboru ścieżki można skonfigurować za pomocą: Player.setTrackSelectionParameters Możesz to zrobić zarówno przed, jak i w trakcie odtwarzania. Poniższy przykład pokazuje, jak uzyskać bieżącą TrackSelectionParameters z odtwarzacza, zmodyfikuj i zaktualizuj Player ze zmienionym wynikiem:

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setMaxVideoSizeSd()
    .setPreferredAudioLanguage("hu")
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("hu")
        .build());

Wybór ścieżki na podstawie ograniczeń

Większość opcji w TrackSelectionParameters pozwala na określanie ograniczeń, które są niezależne od ścieżek, które są w rzeczywistości dostępne. Dostępny(-a) ograniczenia obejmują:

  • Maksymalna i minimalna szerokość, wysokość, liczbę klatek i szybkość transmisji bitów.
  • Maksymalna liczba kanałów audio i szybkość transmisji bitów.
  • Preferowane typy MIME w przypadku reklam wideo i audio.
  • Preferowane języki ścieżki audio i flagi ról.
  • Preferowane języki tekstu i flagi ról.

ExoPlayer używa rozsądnych wartości domyślnych w przypadku tych ograniczeń, na przykład z rozdzielczością wideo na rozmiar wyświetlacza i preferowanym językiem dźwięku pasuje do ustawienia języka w systemie użytkownika.

Stosowanie wyboru ścieżki opartej na ograniczeniach zamiast wybierając konkretne utwory spośród dostępnych:

  • Zanim dowiesz się, co śledzi element multimedialny, możesz określić ograniczenia. Oznacza to, że ograniczenia można określić, zanim odtwarzacz przygotuje elementu multimedialnego, a wybór konkretnych ścieżek wymaga kodu aplikacji, poczekaj, aż dostępne ścieżki staną się znane.
  • Ograniczenia są stosowane do wszystkich elementów multimedialnych na playliście, nawet jeśli elementy mają różne dostępne ścieżki. Na przykład preferowany język ścieżki dźwiękowej ograniczenie zostanie automatycznie zastosowane do wszystkich elementów multimedialnych, nawet jeśli Format utworu w tym języku różni się w zależności od elementu multimedialnego. Nie ma to jednak zastosowania przy wybieraniu konkretnych utworów, co opisaliśmy poniżej.

Wybieranie konkretnych ścieżek

Można też wybrać konkretne ścieżki za pomocą funkcji TrackSelectionParameters. Po pierwsze, dostępne obecnie utwory należy wysłać za pomocą Player.getCurrentTracks Po drugie, gdy ustalisz, które ścieżki warto wybrać, można je ustawić w TrackSelectionParameters za pomocą TrackSelectionOverride. Aby na przykład wybrać pierwszy utwór z konkretnego audioTrackGroup:

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

TrackSelectionOverride będzie mieć zastosowanie tylko do elementów multimedialnych, które zawierają TrackGroup dokładnie odpowiada temu określonemu w zastąpieniu. Dlatego może nie mieć zastosowania do kolejnego elementu multimedialnego, jeśli zawiera on różnych ścieżek.

Wyłączanie typów śledzenia lub grup

Różne typy ścieżek, np. wideo, audio czy tekstowe, można całkowicie wyłączyć za pomocą TrackSelectionParameters.Builder.setTrackTypeDisabled Wyłączono typ ścieżki Zostanie wyłączona dla wszystkich elementów multimedialnych:

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

Możesz też uniemożliwić wybór utworów z konkretnego TrackGroup, określając puste zastąpienie dla tej grupy:

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

Dostosowywanie selektora ścieżek

Za wybór ścieżki odpowiada instancja TrackSelector, instancja które mogą być podawane za każdym razem, gdy zostanie skompilowana i później uzyskana wartość ExoPlayer dzięki funkcji 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 to elastyczny model TrackSelector odpowiedni do większości zastosowań przypadków. Wykorzystuje ono pole TrackSelectionParameters ustawione w obiekcie Player, ale również zawiera zaawansowane opcje dostosowywania, które można określić w DefaultTrackSelector.ParametersBuilder:

Kotlin

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

Java

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

Tunelowanie

Możesz włączyć odtwarzanie tunelowane, jeśli połączenie mechanizmów renderowania – wybrane ścieżki ją obsługują. W tym celu użyj DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)

Odciążanie dźwięku

Możesz włączyć odtwarzanie wyłączonego dźwięku, jeśli kombinacja które obsługują mechanizm renderowania i wybrane ścieżki. Aby to zrobić, wpisz AudioOffloadModePreferences w: 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());
);