Jika item media berisi beberapa trek, pemilihan trek adalah proses yang
menentukan mana yang dipilih untuk diputar. Proses pemilihan {i>track<i} adalah
dikonfigurasi oleh TrackSelectionParameters
, yang memungkinkan banyak
dan mengganti yang memengaruhi pemilihan trek agar ditentukan.
Membuat kueri jalur yang tersedia
Anda dapat mendengarkan Player.Listener.onTracksChanged
untuk mendapatkan notifikasi tentang perubahan
ke jalur, termasuk:
- Trek yang tersedia menjadi diketahui saat persiapan item media yang dimainkan hingga selesai. Perhatikan bahwa pemutar perlu menyiapkan item media untuk lagu apa yang ada di dalamnya.
- Trek yang tersedia berubah karena pemutaran bertransisi dari satu media item ke item lain.
- 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 membuat kueri trek saat ini dengan memanggil player.getCurrentTracks()
.
Tracks
yang ditampilkan berisi daftar objek Track.Group
, dengan jalur dalam
Group
tunggal menyajikan konten yang sama tetapi dalam format yang berbeda.
Sebagai contoh cara pengelompokan lagu, pertimbangkan pemutaran adaptif dengan feed video utama disediakan dalam lima kecepatan bit, dan feed video alternatif (misalnya, sudut kamera yang berbeda dalam pertandingan olahraga) diberikan dalam dua kecepatan bit. Dalam hal ini, akan ada dua grup trek video. Satu grup sesuai dengan grup feed video yang berisi lima trek, dan satu trek lagi untuk feed video alternatif yang berisi dua jalur.
Trek audio dengan bahasa yang berbeda tidak dikelompokkan, karena konten dalam bahasa yang berbeda tidak dianggap sama. Sebaliknya, trek audio dalam bahasa yang sama yang hanya berbeda pada properti seperti kecepatan bit, sampling saluran, jumlah saluran dan sebagainya dapat dikelompokkan. Hal ini juga berlaku untuk trek teks.
Setiap Group
dapat dikueri untuk menentukan jalur mana yang didukung
pemutaran, yang saat ini dipilih, dan Format
apa yang digunakan setiap trek:
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); } }
- Trek didukung jika
Player
dapat mendekode dan merender sampel. Perlu diketahui bahwa meskipun ada beberapa grup trek dari jenis yang sama (misalnya beberapa grup trek audio) didukung, itu hanya berarti bahwa trek tersebut didukung secara individu dan pemain belum tentu dapat memainkannya di perangkat lain di waktu yang sama. - Trek dipilih jika telah dipilih untuk pemutaran mengingat kondisi saat
TrackSelectionParameters
. Jika beberapa trek dalam satu grup trek dipilih, pemutar akan menggunakan trek ini untuk pemutaran adaptif (misalnya, beberapa trek video dengan kecepatan bit berbeda). Perhatikan bahwa hanya salah satu dari lagu akan diputar pada satu waktu.
Mengubah parameter pemilihan jalur
Proses pemilihan jalur dapat
dikonfigurasi menggunakan
Player.setTrackSelectionParameters
. Anda dapat melakukannya
sebelum dan selama
pemutaran. Contoh berikut menunjukkan cara memperoleh
TrackSelectionParameters
dari pemutar, mengubahnya, 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 jalur berbasis batasan
Sebagian besar opsi di TrackSelectionParameters
memungkinkan Anda menentukan batasan,
yang terpisah dari jalur yang benar-benar tersedia. Tersedia
batasan tersebut meliputi:
- Lebar, tinggi, kecepatan frame, dan kecepatan bit video maksimum dan minimum.
- Jumlah dan kecepatan bit channel audio maksimum.
- Jenis MIME yang disukai untuk video dan audio.
- Bahasa audio pilihan dan tanda peran.
- Bahasa teks pilihan dan tanda peran.
ExoPlayer menggunakan default yang masuk akal untuk batasan ini, misalnya membatasi resolusi video ke ukuran tampilan dan lebih memilih bahasa audio yang sesuai dengan setelan Lokalitas sistem pengguna.
Ada beberapa manfaat menggunakan pemilihan jalur berbasis batasan daripada memilih trek tertentu dari yang tersedia:
- Anda dapat menentukan batasan sebelum mengetahui trek yang disediakan oleh item media. Artinya, batasan dapat ditentukan sebelum pemain menyiapkan item media, sedangkan memilih trek tertentu memerlukan kode aplikasi untuk tunggu hingga {i>track <i}yang tersedia diketahui.
- Pembatas diterapkan untuk semua item media dalam playlist, meskipun item tersebut
item yang tersedia memiliki
jalur yang berbeda. Misalnya, bahasa audio pilihan
akan diterapkan secara otomatis ke 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,
untuk trek yang tersedia saat ini,
harus dikueri menggunakan
Player.getCurrentTracks
. Kedua, setelah mengidentifikasi
lagu mana yang akan dipilih,
keduanya 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 diterapkan ke item media yang berisi
TrackGroup
sama persis dengan yang ditentukan dalam penggantian. Oleh karena itu
mungkin tidak berlaku untuk item media berikutnya jika item tersebut berisi
{i>track <i}yang berbeda.
Menonaktifkan jenis atau grup trek
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, dimungkinkan untuk mencegah pemilihan {i>track<i} dari
TrackGroup
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
, sebuah instance
yang dapat disediakan 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 penggunaan
penggunaan. Kode 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));
{i>Tunneling<i}
Anda dapat mengaktifkan pemutaran yang disalurkan jika kombinasi perender dan
mendukung {i>track <i}yang dipilih. Untuk melakukannya, gunakan
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)
.
Offload Audio
Anda dapat mengaktifkan pemutaran audio yang dialihkan jika kombinasi
yang didukung oleh perender dan jalur yang dipilih. Untuk melakukannya, tentukan
AudioOffloadModePreferences
di TrackSelectionParameters
Anda.
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()); );