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