Wybór ścieżki

Gdy element multimedialny zawiera wiele ścieżek, wybór ścieżki określa, które z nich zostaną odtworzone do odtworzenia. Proces wyboru ścieżki konfiguruje TrackSelectionParameters, co pozwala określić wiele różnych ograniczeń i zastąpień wpływających na wybór ścieżki.

Wykonywanie zapytań o dostępne ścieżki

Możesz posłuchać podcastu Player.Listener.onTracksChanged, aby otrzymywać powiadomienia o zmianach w ścieżkach, takich jak:

  • Dostępne ścieżki stają się znane podczas przygotowywania odtwarzanego elementu multimedialnego. Pamiętaj, że odtwarzacz musi przygotować element multimedialny, aby określić, jakie ścieżki zawiera.
  • Dostępne ścieżki zmieniają się w związku z przejściem odtwarzania z jednego elementu multimedialnego do innego.
  • 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 o bieżące ścieżki, wywołując player.getCurrentTracks(). Zwracany Tracks zawiera listę obiektów Track.Group, gdzie ścieżki w obrębie pojedynczego elementu Group zawierają te same treści, ale w innym formacie.

Przykładem sposobu grupowania utworów jest odtwarzanie adaptacyjne, w którym główny kanał wideo jest udostępniany z pięcioma szybkościami transmisji bitów, a alternatywny obraz wideo (np. o innym kącie widzenia podczas meczu sportowego) ma 2 szybkości transmisji bitów. W tym przypadku mamy 2 grupy ścieżek wideo – jedną związaną z głównym kanałem wideo zawierającym 5 ścieżek i drugą dla alternatywnego pliku wideo zawierającą 2 ścieżki.

Ścieżki audio w różnych językach nie są grupowane, ponieważ treści w różnych językach nie są uznawane za takie same. I na odwrót: można grupować ścieżki audio w tym samym języku, które różnią się tylko właściwościami takimi jak szybkość transmisji bitów, częstotliwość próbkowania, liczba kanałów itp. Dotyczy to również ścieżek tekstowych.

Do każdego parametru Group można wysłać zapytanie, aby określić, które ścieżki są obsługiwane na potrzeby odtwarzania, które są obecnie wybrane i czego używa każda z nich (Format):

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 dekodować i renderować jej próbki. Pamiętaj, że nawet jeśli obsługiwanych jest wiele grup ścieżek tego samego typu (np. wiele grup ścieżek audio), oznacza to tylko, że są one obsługiwane indywidualnie, a odtwarzacz niekoniecznie może odtwarzać je jednocześnie.
  • Ścieżka jest wybrana, jeśli została wybrana do odtworzenia w ramach bieżącego procesu TrackSelectionParameters. Gdy wybierzesz wiele ścieżek w jednej grupie ścieżek, odtwarzacz użyje ich do dostosowania odtwarzania (np. wielu ścieżek wideo o różnych szybkościach transmisji bitów). Pamiętaj, że w danym momencie odtworzona będzie tylko jedna z tych ścieżek.

Modyfikowanie parametrów wyboru ścieżki

Proces wyboru ścieżki audio można skonfigurować za pomocą parametru Player.setTrackSelectionParameters. Możesz to zrobić zarówno przed odtwarzaniem, jak i w jego trakcie. Ten przykład pokazuje, jak uzyskać bieżącą wartość TrackSelectionParameters z odtwarzacza, zmodyfikować ją i zaktualizować Player o zmodyfikowany wynik:

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 określić ograniczenia, które są niezależne od ścieżek, które są faktycznie dostępne. Dostępne ograniczenia:

  • Maksymalna i minimalna szerokość, wysokość, liczba klatek i szybkość transmisji bitów filmu.
  • Maksymalna liczba kanałów audio i szybkość transmisji bitów.
  • Preferowane typy MIME w przypadku wideo i audio.
  • Preferowane języki dźwięku i flagi ról.
  • Preferowane języki tekstu i flagi ról.

W przypadku tych ograniczeń ExoPlayer stosuje rozsądne ustawienia domyślne, np. ogranicza rozdzielczość wideo do rozmiaru wyświetlacza i preferuje język dźwięku zgodny z ustawieniami języka użytkownika w systemie.

Korzystanie z wyboru na podstawie ograniczeń zamiast wybierania określonych ścieżek z dostępnych ścieżek ma kilka zalet:

  • Zanim dowiesz się, jakie ścieżki są udostępniane przez element multimedialny, możesz określić ograniczenia. Oznacza to, że ograniczenia można określić, zanim odtwarzacz przygotuje element multimedialny, a wybór określonych ścieżek wymaga, aby kod aplikacji czekał na ich poznanie.
  • Ograniczenia są stosowane do wszystkich elementów multimedialnych na playliście, nawet jeśli mają one różne dostępne ścieżki. Na przykład do wszystkich elementów multimedialnych automatycznie zostanie zastosowane ograniczenie preferowanego języka ścieżki audio, nawet jeśli Format ścieżki w danym języku różni się w zależności od elementu multimedialnego. Dzieje się tak podczas wybierania konkretnych ścieżek, co opisano poniżej.

Wybieranie konkretnych ścieżek

Możesz wybrać określone ścieżki za pomocą TrackSelectionParameters. Najpierw należy wysłać zapytanie o aktualnie dostępne utwory w odtwarzaczu za pomocą metody Player.getCurrentTracks. Po drugie, po określeniu ścieżek, które wybrać, można je ustawić w TrackSelectionParameters za pomocą TrackSelectionOverride. Aby na przykład wybrać pierwszą ścieżkę z określonego elementu 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());

Zasada TrackSelectionOverride będzie stosowana tylko do elementów multimedialnych, które zawierają TrackGroup dokładnie zgodny z elementem określonym w zastępowaniu. Dlatego zastąpienie może nie mieć zastosowania do kolejnego elementu multimedialnego, który zawiera inne ścieżki.

Wyłączanie typów lub grup ścieżek

Typy ścieżek, takie jak wideo, audio czy tekstowe, można całkowicie wyłączyć za pomocą narzędzia TrackSelectionParameters.Builder.setTrackTypeDisabled. Wyłączony typ śledzenia zostanie wyłączony 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 ścieżek z danej grupy 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 obiekt TrackSelector, którego wystąpienie może być dostarczane za każdym razem, gdy tworzony jest komponent ExoPlayer, a później uzyskiwany za pomocą 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 elastyczna usługa TrackSelector odpowiednia do większości zastosowań. Używa on TrackSelectionParameters ustawionego w Player, ale udostępnia też 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 obsługuje je połączenie mechanizmów renderowania i wybranych ścieżek. Aby to zrobić, użyj funkcji DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Wyciszenie dźwięku

Możesz włączyć odtwarzanie dźwięku z obciążeniem, jeśli obsługuje je kombinacja mechanizmów renderowania i wybranych ścieżek. Aby to zrobić, w elemencie TrackSelectionParameters wpisz AudioOffloadModePreferences.

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