Jika item media berisi beberapa trek, pemilihan trek adalah proses yang
menentukan trek mana yang dipilih untuk diputar. Proses pemilihan jalur
dikonfigurasi oleh TrackSelectionParameters
, yang memungkinkan berbagai
batasan dan penggantian yang memengaruhi pemilihan trek ditentukan.
Membuat kueri untuk trek yang tersedia
Anda dapat memproses Player.Listener.onTracksChanged
agar diberi tahu tentang perubahan
pada jalur, termasuk:
- Jalur yang tersedia akan diketahui saat persiapan item media yang diputar selesai. Perhatikan bahwa pemutar harus menyiapkan item media untuk mengetahui trek yang ada di dalamnya.
- Trek yang tersedia berubah karena transisi pemutaran dari satu item media ke item media lainnya.
- Perubahan pada trek yang dipilih.
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. } });
Anda juga dapat mengkueri jalur saat ini dengan memanggil player.getCurrentTracks()
.
Tracks
yang ditampilkan berisi daftar objek Track.Group
, dengan trek dalam
satu Group
menampilkan konten yang sama, tetapi dalam format berbeda.
Sebagai contoh cara pengelompokan trek, pertimbangkan pemutaran adaptif dengan feed video utama disediakan dalam lima kecepatan bit, dan feed video alternatif (misalnya, sudut kamera yang berbeda dalam pertandingan olahraga) disediakan dalam dua kecepatan bit. Dalam hal ini, akan ada dua grup trek video, satu sesuai dengan feed video utama yang berisi lima trek, dan yang kedua untuk feed video alternatif yang berisi dua trek.
Trek audio yang bahasanya berbeda tidak akan dikelompokkan karena konten dalam bahasa yang berbeda tidak dianggap sama. Sebaliknya, trek audio dalam bahasa yang sama yang hanya memiliki perbedaan pada properti seperti kecepatan bit, frekuensi sampling, jumlah saluran, dan sebagainya dapat dikelompokkan. Hal ini juga berlaku untuk trek teks.
Setiap Group
dapat dikueri untuk menentukan trek yang didukung untuk
pemutaran, lagu yang saat ini dipilih, dan Format
yang digunakan oleh setiap lagu:
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); } }
- Jalur didukung jika
Player
dapat mendekode dan merender contohnya. Perhatikan bahwa meskipun jika beberapa grup trek dengan jenis yang sama (misalnya beberapa grup trek audio) didukung, hanya berarti bahwa trek tersebut didukung satu per satu dan pemutar belum tentu dapat memutarnya secara bersamaan. - Trek dipilih jika telah dipilih untuk diputar berdasarkan
TrackSelectionParameters
saat ini. Jika beberapa trek dalam satu grup trek dipilih, pemutar akan menggunakan trek tersebut untuk pemutaran adaptif (misalnya, beberapa trek video dengan kecepatan bit yang berbeda). Perhatikan bahwa hanya satu dari trek ini yang akan diputar pada satu waktu.
Mengubah parameter pemilihan trek
Proses pemilihan trek dapat dikonfigurasi menggunakan
Player.setTrackSelectionParameters
. Anda dapat melakukannya sebelum dan
selama pemutaran. Contoh berikut menunjukkan cara mendapatkan TrackSelectionParameters
saat ini dari pemutar, memodifikasinya, dan mengupdate Player
dengan hasil yang dimodifikasi:
Kotlin
player.trackSelectionParameters = player.trackSelectionParameters .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build()
Java
player.setTrackSelectionParameters( player .getTrackSelectionParameters() .buildUpon() .setMaxVideoSizeSd() .setPreferredAudioLanguage("hu") .build());
Pemilihan trek berbasis batasan
Sebagian besar opsi di TrackSelectionParameters
memungkinkan Anda menentukan batasan,
yang tidak bergantung pada jalur yang sebenarnya tersedia. Batasan yang tersedia meliputi:
- Lebar, tinggi, kecepatan frame, dan kecepatan bit video maksimum dan minimum.
- Jumlah dan kecepatan bit saluran audio maksimum.
- Jenis MIME yang disukai untuk video dan audio.
- Bahasa audio dan tanda peran pilihan.
- Bahasa teks pilihan dan tombol peran.
ExoPlayer menggunakan default yang logis untuk batasan ini, misalnya membatasi resolusi video ke ukuran tampilan dan memilih bahasa audio yang cocok dengan setelan Lokalitas sistem pengguna.
Ada beberapa manfaat menggunakan pemilihan trek berbasis batasan daripada memilih jalur tertentu dari jalur yang tersedia:
- Anda dapat menentukan batasan sebelum mengetahui trek apa yang disediakan item media. Ini berarti batasan dapat ditentukan sebelum pemutar menyiapkan item media, sedangkan memilih jalur tertentu memerlukan kode aplikasi untuk menunggu hingga jalur yang tersedia diketahui.
- Batasan diterapkan untuk semua item media dalam playlist, meskipun
item tersebut memiliki trek berbeda yang tersedia. Misalnya, batasan bahasa audio pilihan
akan otomatis diterapkan untuk semua item media, meskipun
Format
trek dalam bahasa tersebut bervariasi dari satu item media ke item media berikutnya. Hal ini tidak berlaku saat memilih trek tertentu, seperti yang dijelaskan di bawah.
Memilih trek tertentu
Anda dapat memilih trek tertentu menggunakan TrackSelectionParameters
. Pertama,
kueri yang saat ini tersedia untuk pemutar harus dikueri menggunakan
Player.getCurrentTracks
. Kedua, setelah mengidentifikasi trek mana yang akan dipilih,
jalur tersebut dapat ditetapkan di TrackSelectionParameters
menggunakan TrackSelectionOverride
.
Misalnya, untuk memilih trek pertama dari audioTrackGroup
tertentu:
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
hanya akan berlaku untuk item media yang berisi
TrackGroup
sama persis dengan item yang ditentukan dalam penggantian. Oleh karena itu,
penggantian mungkin tidak berlaku untuk item media berikutnya jika item tersebut berisi
jalur yang berbeda.
Menonaktifkan jenis atau grup jalur
Jenis trek seperti video, audio, atau teks dapat dinonaktifkan sepenuhnya menggunakan
TrackSelectionParameters.Builder.setTrackTypeDisabled
. Jenis jalur yang dinonaktifkan
akan dinonaktifkan untuk semua item media:
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());
Atau, Anda dapat mencegah pemilihan jalur dari TrackGroup
tertentu dengan menentukan penggantian kosong untuk grup tersebut:
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());
Menyesuaikan pemilih trek
Pemilihan jalur adalah tanggung jawab TrackSelector
, yang instancenya
dapat diberikan setiap kali ExoPlayer
dibuat dan kemudian diperoleh
dengan 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
adalah TrackSelector
fleksibel yang cocok untuk sebagian besar kasus
penggunaan. Class ini menggunakan TrackSelectionParameters
yang ditetapkan di Player
, tetapi juga
menyediakan beberapa opsi penyesuaian lanjutan yang dapat ditentukan dalam
DefaultTrackSelector.ParametersBuilder
:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true)) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Terowongan
Anda dapat mengaktifkan pemutaran yang disalurkan jika kombinasi perender dan
jalur yang dipilih mendukungnya. Untuk melakukannya, gunakan
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
.
Pengurangan Audio
Anda dapat mengaktifkan pemutaran audio yang dialihkan jika kombinasi
renderer dan trek yang dipilih mendukungnya. Untuk melakukannya, tentukan
AudioOffloadModePreferences
di 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()); );