Jeśli element multimedialny zawiera wiele ścieżek, wybór ścieżki to proces, który określa, które z nich zostaną wybrane do odtwarzania. Proces wyboru ścieżki jest konfigurowany przez TrackSelectionParameters, co 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 nasłuchiwać Player.Listener.onTracksChanged, aby otrzymywać powiadomienia o zmianach w ścieżkach, w tym:
- Dostępne ścieżki stają się znane po zakończeniu przygotowywania odtwarzanego elementu multimedialnego. Pamiętaj, że odtwarzacz musi przygotować element multimedialny, aby wiedzieć, jakie ścieżki zawiera.
- Dostępne ścieżki zmieniają się, gdy odtwarzanie przechodzi z jednego elementu multimedialnego na inny.
- 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 utwory, wywołując player.getCurrentTracks().
Zwrócony obiekt Tracks zawiera listę obiektów Tracks.Group, w których ścieżki w ramach jednego obiektu Group prezentują tę samą treść, ale w różnych formatach.
Przykładem grupowania ścieżek może być adaptacyjne odtwarzanie, w którym główny strumień wideo jest udostępniany w 5 szybkościach transmisji bitów, a alternatywny strumień wideo (np. inny kąt kamery podczas meczu sportowego) jest udostępniany w 2 szybkościach transmisji bitów. W tym przypadku będą 2 grupy ścieżek wideo: jedna odpowiadająca głównemu kanałowi wideo zawierającemu 5 ścieżek, a druga – alternatywnemu kanałowi wideo zawierającemu 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. Z kolei ś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., można grupować. Dotyczy to również ścieżek tekstowych.
Każdy element Group może być użyty do sprawdzenia, które ścieżki są obsługiwane w przypadku odtwarzania, które są obecnie wybrane i jakiego elementu Format używa każda ścieżka:
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
Playermoż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 jest w stanie odtwarzać je w tym samym czasie. - Utwór jest wybrany, jeśli został wybrany do odtworzenia w bieżącym kontekście
TrackSelectionParameters. Jeśli w grupie ścieżek wybrano kilka ścieżek, odtwarzacz używa ich do adaptacyjnego odtwarzania (np. kilku ścieżek wideo o różnych szybkościach transmisji). Pamiętaj, że w danym momencie odtwarzany jest tylko jeden z tych ścieżek.
Modyfikowanie parametrów wyboru ścieżki
Proces wyboru ścieżki można skonfigurować za pomocą parametru Player.setTrackSelectionParameters. Możesz to zrobić zarówno przed odtwarzaniem, jak i w jego trakcie. Poniższy przykład pokazuje, jak uzyskać bieżące TrackSelectionParameters od odtwarzacza, zmodyfikować je 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 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 na sekundę i szybkość transmisji bitów filmu.
- Maksymalna liczba kanałów audio i szybkość transmisji bitów.
- 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 rozsądnych wartości domyślnych tych ograniczeń, np. ogranicza rozdzielczość wideo do rozmiaru wyświetlacza i preferuje język dźwięku zgodny z ustawieniem regionalnym systemu użytkownika.
Wybieranie ścieżek na podstawie ograniczeń ma kilka zalet w porównaniu z wybieraniem konkretnych ścieżek spośród dostępnych:
- Ograniczenia możesz określić, zanim dowiesz się, jakie ścieżki zawiera element multimedialny. Oznacza to, że ograniczenia można określić, zanim odtwarzacz przygotuje element multimedialny, natomiast wybór konkretnych ścieżek wymaga, aby kod aplikacji czekał, aż dostępne ścieżki staną się znane.
- 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 ograniczenie dotyczące preferowanego języka audio zostanie automatycznie zastosowane do wszystkich elementów multimedialnych, nawet jeśli
Formatścieżki w tym języku różni się w poszczególnych elementach multimedialnych. Nie dotyczy to jednak sytuacji, gdy wybierasz konkretne ścieżki, jak opisano poniżej.
Wybieranie konkretnych ścieżek
Możesz wybrać konkretne ścieżki za pomocą ikony TrackSelectionParameters. Najpierw należy wysłać zapytanie o obecnie dostępne ścieżki odtwarzacza za pomocą funkcji Player.getCurrentTracks. Po drugie, po określeniu, które ścieżki mają zostać wybrane, można je ustawić w polu TrackSelectionParameters za pomocą 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());
Symbol TrackSelectionOverride będzie stosowany tylko do elementów multimedialnych, które zawierają symbol TrackGroup dokładnie taki sam jak ten określony w zastąpieniu. Dlatego zastąpienie może nie mieć zastosowania do kolejnego elementu multimedialnego, jeśli zawiera on inne ścieżki.
Wyłączanie typów lub grup ścieżek
Typy ścieżek, takie jak wideo, audio czy tekst, można całkowicie wyłączyć za pomocą
TrackSelectionParameters.Builder.setTrackTypeDisabled. Wyłączony typ ścieżki
będzie wyłączony we wszystkich elementach 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ć wybieranie ścieżek z określonej grupyTrackGroup, podając dla niej pustą wartość zastępczą:
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, którego instancję można udostępnić podczas tworzenia ExoPlayer, a później uzyskać 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 w większości przypadków. Używa TrackSelectionParameters ustawionego w Player, ale też udostępnia 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
Tunelowanie może pomóc w wydajnym odtwarzaniu strumieni wideo w wysokiej rozdzielczości na niektórych telewizorach. Więcej informacji i szczegółów znajdziesz na stronie zużycie baterii.
Możesz ustawić preferencje dotyczące odtwarzania tunelowanego, aby włączyć je w przypadkach, gdy kombinacja renderujących i wybranych ścieżek je obsługuje. Aby to zrobić, użyj DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).
Odciążanie dźwięku
Przeniesienie przetwarzania dźwięku może pomóc w oszczędzaniu energii, zwłaszcza podczas dłuższego odtwarzania przy wyłączonym ekranie. Więcej informacji znajdziesz na stronie dotyczącej zużycia baterii.
Możesz ustawić preferencje dotyczące odtwarzania dźwięku z przeniesionym przetwarzaniem, aby włączyć je w przypadkach, gdy obsługuje to kombinacja rendererów i wybranych ścieżek. Aby to zrobić, w TrackSelectionParameters podaj 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());