Wybór ścieżki

Jeśli element multimedialny zawiera wiele ścieżek, wybór ścieżek to proces, który określa, które z nich zostaną wybrane do odtwarzania. Proces wyboru ścieżki jest konfigurowany za pomocą elementu TrackSelectionParameters, który umożliwia określenie wielu różnych ograniczeń i zastąpień wpływających na wybór ścieżki.

Wykonywanie zapytań dotyczących dostępnych ścieżek

Możesz słuchać Player.Listener.onTracksChanged, aby otrzymywać powiadomienia o zmianach dotyczących ścieżek, w tym:

  • Dostępne utwory są znane po zakończeniu przygotowywania odtwarzanego elementu multimedialnego. Pamiętaj, że odtwarzacz musi przygotować element multimedialny, aby wiedzieć, jakie utwory zawiera.
  • Dostępne utwory zmieniają się z powodu przejścia od jednego elementu multimedialnego do drugiego.
  • zmiany w 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ż wysłać zapytanie o bieżące ścieżki, wywołując player.getCurrentTracks(). Zwrócony obiekt Tracks zawiera listę obiektów Tracks.Group, gdzie utwory w ramach jednego obiektu Group zawierają te same treści, ale w różnych formatach.

Przykładem grupowania ścieżek jest odtwarzanie adaptacyjne, w którym główny sygnał wideo jest dostarczany w 5 bitrastępach, a alternatywny sygnał wideo (np. inny kąt kamery w meczu sportowym) w 2 bitrastępach. W tym przypadku będą 2 grupy ścieżek wideo: jedna odpowiadająca głównemu kanałowi wideo z 5 ścieżkami i druga odpowiadająca alternatywnemu kanałowi wideo z 2 ścieżkami.

Ścieżki audio w różnych językach nie są grupowane, ponieważ treści w różnych językach nie są uważane za takie same. Z drugiej strony 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.

Każdy Group może być zapytany, aby określić, które ścieżki są obsługiwane do odtwarzania, które są obecnie wybrane i jakie Format są używane w przypadku każdej ścieżki:

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

  • Utwór jest obsługiwany, jeśli Player może dekodować i renderować jego próbki. Pamiętaj, że nawet jeśli obsługiwane są liczne grupy ścieżek tego samego typu (np. liczne grupy ścieżek audio), oznacza to tylko, że są one obsługiwane pojedynczo, a odtwarzacz niekoniecznie może odtwarzać je jednocześnie.
  • Utwór jest wybrany, jeśli został wybrany do odtworzenia w ramach bieżącego TrackSelectionParameters. Jeśli wybrano wiele ścieżek w ramach jednej grupy ścieżek, odtwarzacz wykorzystuje te ścieżki do odtwarzania adaptacyjnego (np. wiele ścieżek wideo z różnymi bitrate’ami). Pamiętaj, że w danym momencie odtwarzany jest tylko jeden utwór.

Modyfikowanie parametrów wyboru utworu

Proces wyboru ścieżki można skonfigurować za pomocą Player.setTrackSelectionParameters. Możesz to zrobić zarówno przed, jak i w trakcie odtwarzania. Ten przykład pokazuje, jak uzyskać bieżące dane TrackSelectionParameters od gracza, zmodyfikować je i zaktualizować zmienną Player za pomocą zmodyfikowanego wyniku:

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 sekcji TrackSelectionParameters umożliwia określenie ograniczeń, które są niezależne od faktycznie dostępnych ścieżek. Dostępne ograniczenia:

  • Maksymalna i minimalna szerokość, wysokość, liczba klatek i szybkość transmisji bitów filmu.
  • Maksymalna liczba kanałów audio i bitrate.
  • Preferowane typy MIME dla plików wideo i audio.
  • preferowane języki audio i flagi ról;
  • preferowane języki tekstu i flagi ról;

ExoPlayer używa domyślnych wartości dla tych ograniczeń, na przykład ogranicza rozdzielczość wideo do rozmiaru wyświetlacza i preferuje język dźwięku, który pasuje do ustawień języka w systemie użytkownika.

Wybór utworów na podstawie ograniczeń zamiast wybierania konkretnych utworów z dostępnych ma kilka zalet:

  • Możesz określić ograniczenia, zanim poznasz listę utworów w danym nośniku. Oznacza to, że ograniczenia można określić przed przygotowaniem przez odtwarzacz elementu multimedialnego, podczas gdy wybranie konkretnych ścieżek wymaga, aby kod aplikacji zaczekał, aż znane będą dostępne ścieżki.
  • Ograniczenia są stosowane do wszystkich elementów multimedialnych na playliście, nawet jeśli mają one różne dostępne utwory. Na przykład preferowany język audio będzie automatycznie stosowany do wszystkich elementów multimediów, nawet jeśli Format utworu w tym języku różni się w zależności od elementu multimediów. Nie dotyczy to jednak wybranych ścieżek, jak opisano poniżej.

Wybieranie konkretnych ścieżek

Za pomocą TrackSelectionParameters można wybrać konkretne ścieżki. Najpierw należy zapytać o obecnie dostępne ścieżki odtwarzacza za pomocą parametru Player.getCurrentTracks. Po określeniu, które ścieżki chcesz wybrać, możesz je ustawić w elementach TrackSelectionParameters za pomocą elementu TrackSelectionOverride. Aby na przykład wybrać pierwszą ścieżkę 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 zawierających TrackGroup dokładnie pasujący do wartości określonej w zastąpieniu. Dlatego zastąpienie może nie dotyczyć kolejnego elementu multimedialnego, jeśli zawiera on inne ścieżki.

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

Typy ścieżek, takie jak wideo, audio lub tekst, można całkowicie wyłączyć, używając opcji TrackSelectionParameters.Builder.setTrackTypeDisabled. Wyłączony typ utworu będzie wyłączony we wszystkich elementach multimediów:

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 określonej grupyTrackGroup, podając pustą zastąpioną wartość 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

Wybór ścieżki należy do TrackSelector. Przykład TrackSelector może zostać dostarczony, gdy ExoPlayer zostanie utworzony, a następnie uzyskany 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 elastyczny TrackSelector odpowiedni do większości zastosowań. Używa ona TrackSelectionParameters ustawionego w Player, ale oferuje też opcje dostosowywania zaawansowanego, 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 w przypadkach, gdy połączenie procesorów i wybranych ścieżek obsługuje tę funkcję. Aby to zrobić, użyj funkcji DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).

Odciążanie dźwięku

Możesz włączyć odciążone odtwarzanie dźwięku w przypadku, gdy połączenie procesorów i wybranych ścieżek obsługuje tę funkcję. Aby to zrobić, w pliku TrackSelectionParameters podaj wartość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());
);