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