Jika item media berisi beberapa trek, pemilihan trek adalah proses yang
menentukan trek mana yang dipilih untuk pemutaran. Proses pemilihan jalur
dikonfigurasi oleh TrackSelectionParameters, yang memungkinkan banyak
batasan dan penggantian yang berbeda yang memengaruhi pemilihan jalur ditentukan.
Mengueri jalur yang tersedia
Anda dapat memproses Player.Listener.onTracksChanged untuk mendapatkan notifikasi tentang perubahan
pada jalur, termasuk:
- Trek yang tersedia diketahui saat persiapan item media yang sedang diputar selesai. Perhatikan bahwa pemutar perlu menyiapkan item media untuk mengetahui track yang ada di dalamnya.
- Trek yang tersedia berubah karena pemutaran bertransisi dari satu item media ke item media lainnya.
- Perubahan pada jalur 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 Tracks.Group, dengan trek
dalam satu Group menampilkan konten yang sama, tetapi dalam format yang berbeda.
Sebagai contoh bagaimana trek dapat dikelompokkan, pertimbangkan pemutaran adaptif di mana 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 dikelompokkan, karena konten dalam bahasa yang berbeda tidak dianggap sama. Sebaliknya, trek audio dalam bahasa yang sama yang hanya berbeda dalam 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 mana yang didukung untuk
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); } }
- Jalur didukung jika
Playerdapat mendekode dan merender sampelnya. Perhatikan bahwa meskipun beberapa grup trek dengan jenis yang sama (misalnya, beberapa grup trek audio) didukung, hal ini hanya berarti bahwa grup tersebut didukung secara terpisah dan pemutar tidak selalu dapat memutarnya secara bersamaan. - Trek dipilih jika telah dipilih untuk diputar berdasarkan
TrackSelectionParameterssaat ini. Jika beberapa trek dalam satu grup trek dipilih, pemutar akan menggunakan trek ini untuk pemutaran adaptif (misalnya, beberapa trek video dengan kecepatan bit yang berbeda). Perhatikan bahwa hanya satu trek ini yang akan diputar dalam satu waktu.
Mengubah parameter pemilihan trek
Proses pemilihan jalur dapat dikonfigurasi menggunakan
Player.setTrackSelectionParameters. Anda dapat melakukannya sebelum dan selama pemutaran. Contoh berikut menunjukkan cara mendapatkan TrackSelectionParameters
saat ini dari pemutar, mengubahnya, dan memperbarui Player
dengan hasil yang diubah:
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 bitrate video maksimum dan minimum.
- Jumlah dan kecepatan bit maksimum saluran audio.
- Jenis MIME pilihan untuk video dan audio.
- Bahasa audio pilihan dan tanda peran.
- Bahasa teks pilihan dan tanda peran.
ExoPlayer menggunakan default yang wajar 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 jalur berbasis batasan daripada memilih jalur tertentu dari yang tersedia:
- Anda dapat menentukan batasan sebelum mengetahui trek apa yang disediakan item media. Artinya, batasan dapat ditentukan sebelum pemutar menyiapkan item media, sedangkan memilih trek tertentu memerlukan kode aplikasi untuk menunggu hingga trek yang tersedia diketahui.
- Batasan diterapkan untuk semua item media dalam playlist, meskipun item tersebut memiliki trek yang tersedia berbeda. Misalnya, batasan bahasa audio pilihan akan otomatis diterapkan untuk semua item media, meskipun
Formattrek dalam bahasa tersebut bervariasi dari satu item media ke item media berikutnya. Hal ini tidak terjadi saat memilih jalur tertentu, seperti yang dijelaskan di bawah.
Memilih lagu tertentu
Anda dapat memilih jalur tertentu menggunakan TrackSelectionParameters. Pertama,
trek yang saat ini tersedia untuk pemutar harus dikueri menggunakan
Player.getCurrentTracks. Kedua, setelah mengidentifikasi trek yang akan dipilih,
trek 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 yang sama persis dengan yang ditentukan dalam penggantian. Oleh karena itu, penggantian mungkin tidak berlaku untuk item media berikutnya jika item tersebut berisi trek yang berbeda.
Menonaktifkan jenis atau grup jalur
Jenis trek seperti video, audio, atau teks dapat dinonaktifkan sepenuhnya menggunakan
TrackSelectionParameters.Builder.setTrackTypeDisabled. Jenis trek 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 trek 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 jalur
Pemilihan jalur adalah tanggung jawab TrackSelector, yang instance-nya 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 yang fleksibel dan cocok untuk sebagian besar kasus penggunaan. Opsi ini menggunakan TrackSelectionParameters yang ditetapkan di Player, tetapi juga
menyediakan beberapa opsi penyesuaian lanjutan yang dapat ditentukan di
DefaultTrackSelector.ParametersBuilder:
Kotlin
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true) )
Java
trackSelector.setParameters( trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));
Tunneling
Tunneling dapat membantu pemutaran video yang efisien dari streaming beresolusi tinggi di beberapa perangkat TV. Lihat halaman konsumsi baterai untuk mengetahui catatan dan detail selengkapnya.
Anda dapat menyetel preferensi untuk pemutaran yang di-tunnel agar diaktifkan jika kombinasi perender dan trek yang dipilih mendukungnya. Untuk melakukannya, gunakan
DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true).
Pengurangan Beban Audio
Offload audio dapat membantu menghemat daya, terutama untuk pemutaran yang lebih lama dengan layar dinonaktifkan. Lihat halaman konsumsi baterai untuk mengetahui catatan dan detail lebih lanjut.
Anda dapat menyetel preferensi untuk pemutaran audio yang di-offload agar dapat diaktifkan jika kombinasi perender dan trek yang dipilih mendukungnya. 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());