ExoPlayer memutar sebagian besar live stream adaptif langsung tanpa konfigurasi khusus. Lihat halaman Format yang Didukung untuk mengetahui detail selengkapnya.
Live stream adaptif menawarkan jendela media yang tersedia yang diperbarui secara berkala untuk bergerak dengan real-time saat ini. Artinya, posisi pemutaran akan selalu berada di suatu tempat dalam jendela ini, dan dalam sebagian besar kasus, mendekati real-time saat ini ketika streaming diproduksi. Perbedaan antara real-time saat ini dan posisi pemutaran disebut offset live.
Mendeteksi dan memantau pemutaran live
Setiap kali jendela live diperbarui, instance Player.Listener yang terdaftar
akan menerima peristiwa onTimelineChanged. Anda dapat mengambil detail tentang pemutaran langsung saat ini dengan membuat kueri berbagai metode Player dan Timeline.Window, seperti yang tercantum di bawah dan ditunjukkan pada gambar berikut.

Player.isCurrentWindowLivemenunjukkan apakah item media yang sedang diputar adalah live stream. Nilai ini tetap benar meskipun live stream telah berakhir.Player.isCurrentWindowDynamicmenunjukkan apakah item media yang sedang diputar masih diperbarui. Hal ini biasanya berlaku untuk live stream yang belum berakhir. Perhatikan bahwa tanda ini juga benar untuk live stream non-live dalam beberapa kasus.Player.getCurrentLiveOffsetmenampilkan selisih antara waktu nyata saat ini dan posisi pemutaran (jika tersedia).Player.getDurationmenampilkan durasi jendela live saat ini.Player.getCurrentPositionmenampilkan posisi pemutaran relatif terhadap awal jendela live.Player.getCurrentMediaItemmenampilkan item media saat ini, denganMediaItem.liveConfigurationberisi penggantian yang disediakan aplikasi untuk target parameter penyesuaian offset live dan offset live.Player.getCurrentTimelinemenampilkan struktur media saat ini dalamTimeline.Timeline.Windowsaat ini dapat diambil dariTimelinemenggunakanPlayer.getCurrentMediaItemIndexdanTimeline.getWindow. DalamWindow:Window.liveConfigurationberisi parameter penyesuaian offset live target dan offset live. Nilai ini didasarkan pada informasi dalam media dan penggantian yang disediakan aplikasi yang ditetapkan diMediaItem.liveConfiguration.Window.windowStartTimeMsadalah waktu sejak Epoch Unix saat jendela live dimulai.Window.getCurrentUnixTimeMsadalah waktu sejak Epoch Unix dari real-time saat ini. Nilai ini dapat dikoreksi oleh perbedaan waktu yang diketahui antara server dan klien.Window.getDefaultPositionMsadalah posisi di jendela live tempat pemutar akan memulai pemutaran secara default.
Mencari di live stream
Anda dapat mencari di mana saja dalam jendela live menggunakan Player.seekTo. Posisi
pencarian yang diteruskan bersifat relatif terhadap awal jendela live. Misalnya,
seekTo(0) akan mencari ke awal jendela live. Pemutar akan mencoba
mempertahankan offset live yang sama dengan posisi yang dituju setelah penelusuran.
Jendela live juga memiliki posisi default tempat pemutaran seharusnya dimulai. Posisi ini biasanya berada di dekat tepi langsung. Anda dapat mencari
ke posisi default dengan memanggil Player.seekToDefaultPosition.
UI pemutaran live
Komponen UI default ExoPlayer menampilkan durasi jendela live dan posisi pemutaran saat ini di dalamnya. Artinya, posisi akan tampak
berpindah ke belakang setiap kali jendela live diperbarui. Jika Anda memerlukan perilaku yang berbeda, misalnya menampilkan waktu Unix atau offset live saat ini, Anda dapat membuat fork PlayerControlView dan mengubahnya agar sesuai dengan kebutuhan Anda.
Mengonfigurasi parameter pemutaran live
ExoPlayer menggunakan beberapa parameter untuk mengontrol offset posisi pemutaran dari tepi live, dan rentang kecepatan pemutaran yang dapat digunakan untuk menyesuaikan offset ini.
ExoPlayer mendapatkan nilai untuk parameter ini dari tiga tempat, dalam urutan prioritas menurun (nilai pertama yang ditemukan akan digunakan):
- Nilai per
MediaItemyang diteruskan keMediaItem.Builder.setLiveConfiguration. - Nilai default global ditetapkan di
DefaultMediaSourceFactory. - Nilai dibaca langsung dari media.
Kotlin
// Global settings. val player = ExoPlayer.Builder(context) .setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000)) .build() // Per MediaItem settings. val mediaItem = MediaItem.Builder() .setUri(mediaUri) .setLiveConfiguration( MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build() ) .build() player.setMediaItem(mediaItem)
Java
// Global settings. ExoPlayer player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000)) .build(); // Per MediaItem settings. MediaItem mediaItem = new MediaItem.Builder() .setUri(mediaUri) .setLiveConfiguration( new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()) .build(); player.setMediaItem(mediaItem);
Nilai konfigurasi yang tersedia adalah:
targetOffsetMs: Offset live target. Pemutar akan mencoba mendekati offset live ini selama pemutaran jika memungkinkan.minOffsetMs: Offset live minimum yang diizinkan. Meskipun menyesuaikan offset ke kondisi jaringan saat ini, pemutar tidak akan mencoba mendapatkan di bawah offset ini selama pemutaran.maxOffsetMs: Offset live maksimum yang diizinkan. Meskipun menyesuaikan offset dengan kondisi jaringan saat ini, pemutar tidak akan mencoba mendapatkan offset ini selama pemutaran.minPlaybackSpeed: Kecepatan pemutaran minimum yang dapat digunakan pemutar untuk melakukan penggantian saat mencoba mencapai offset live target.maxPlaybackSpeed: Kecepatan pemutaran maksimum yang dapat digunakan pemutar untuk mengejar saat mencoba mencapai offset live target.
Penyesuaian kecepatan pemutaran
Saat memutar live stream latensi rendah, ExoPlayer menyesuaikan offset live dengan sedikit mengubah kecepatan pemutaran. Pemutar akan mencoba mencocokkan target perbedaan live yang disediakan oleh media atau aplikasi, tetapi juga akan mencoba bereaksi terhadap perubahan kondisi jaringan. Misalnya, jika terjadi buffering ulang selama pemutaran, pemutar akan memperlambat pemutaran sedikit untuk menjauh dari tepi live. Jika jaringan kemudian menjadi cukup stabil untuk mendukung pemutaran yang lebih dekat dengan edge live lagi, pemutar akan mempercepat pemutaran untuk kembali ke target offset live.
Jika penyesuaian kecepatan pemutaran otomatis tidak diinginkan, penyesuaian ini dapat dinonaktifkan dengan
menetapkan properti minPlaybackSpeed dan maxPlaybackSpeed ke 1.0f.
Demikian pula, fitur ini dapat diaktifkan untuk live stream non-latensi rendah dengan menetapkan
secara eksplisit ke nilai selain 1.0f. Lihat
bagian konfigurasi di atas untuk
mengetahui detail selengkapnya tentang cara menetapkan properti ini.
Menyesuaikan algoritma penyesuaian kecepatan pemutaran
Jika penyesuaian kecepatan diaktifkan, LivePlaybackSpeedControl akan menentukan penyesuaian yang dilakukan. Anda dapat menerapkan LivePlaybackSpeedControl kustom, atau menyesuaikan penerapan default, yaitu DefaultLivePlaybackSpeedControl. Dalam kedua kasus, instance dapat ditetapkan saat
mem-build pemutar:
Kotlin
val player = ExoPlayer.Builder(context) .setLivePlaybackSpeedControl( DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build() ) .build()
Java
ExoPlayer player = new ExoPlayer.Builder(context) .setLivePlaybackSpeedControl( new DefaultLivePlaybackSpeedControl.Builder() .setFallbackMaxPlaybackSpeed(1.04f) .build()) .build();
Parameter penyesuaian DefaultLivePlaybackSpeedControl yang relevan adalah:
fallbackMinPlaybackSpeeddanfallbackMaxPlaybackSpeed: Kecepatan pemutaran minimum dan maksimum yang dapat digunakan untuk penyesuaian jika media maupunMediaItemyang disediakan aplikasi tidak menentukan batas.proportionalControlFactor: Mengontrol seberapa lancar penyesuaian kecepatan. Nilai tinggi membuat penyesuaian lebih tiba-tiba dan reaktif, tetapi juga lebih mungkin terdengar. Nilai yang lebih kecil akan menghasilkan transisi yang lebih lancar antar-kecepatan, dengan biaya yang lebih lambat.targetLiveOffsetIncrementOnRebufferMs: Nilai ini ditambahkan ke target offset live setiap kali terjadi buffering ulang, agar dapat melanjutkan dengan lebih hati-hati. Fitur ini dapat dinonaktifkan dengan menyetel nilai ke 0.minPossibleLiveOffsetSmoothingFactor: Faktor perataan eksponensial yang digunakan untuk melacak kemungkinan offset langsung minimum berdasarkan media yang saat ini di-buffer. Nilai yang sangat mendekati 1 berarti estimasi lebih berhati-hati dan mungkin memerlukan waktu lebih lama untuk menyesuaikan diri dengan kondisi jaringan yang lebih baik, sedangkan nilai yang lebih rendah berarti estimasi akan menyesuaikan diri lebih cepat dengan risiko yang lebih tinggi untuk mengalami buffering ulang.
BehindLiveWindowException dan ERROR_CODE_BEHIND_LIVE_WINDOW
Posisi pemutaran mungkin tertinggal dari jendela live, misalnya jika pemutar dijeda atau melakukan buffering dalam jangka waktu yang cukup lama. Jika hal ini terjadi, pemutaran akan gagal dan pengecualian dengan kode error ERROR_CODE_BEHIND_LIVE_WINDOW akan dilaporkan melalui Player.Listener.onPlayerError. Kode aplikasi mungkin ingin menangani error tersebut dengan melanjutkan pemutaran di posisi default. PlayerActivity dari
aplikasi demo menunjukkan pendekatan ini.
Kotlin
override fun onPlayerError(error: PlaybackException) { if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) { // Re-initialize player at the live edge. player.seekToDefaultPosition() player.prepare() } else { // Handle other errors } }
Java
@Override public void onPlayerError(PlaybackException error) { if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) { // Re-initialize player at the live edge. player.seekToDefaultPosition(); player.prepare(); } else { // Handle other errors } }