Pemutar adalah komponen aplikasi yang memfasilitasi pemutaran item media.
Antarmuka Player Media3
menyiapkan garis besar untuk fungsi yang umumnya ditangani oleh pemutar. Hal ini mencakup:
- Memengaruhi kontrol pemutaran, seperti memutar, menjeda, dan mencari
- Mengkueri properti media yang sedang diputar, seperti posisi pemutaran
- Mengelola playlist/antrean item media
- Mengonfigurasi properti pemutaran, seperti pengacakan, pengulangan, kecepatan, dan volume
- Merender video ke layar
Media3 juga menyediakan implementasi antarmuka Player, yang disebut
ExoPlayer.
Antarmuka umum antar-komponen
Beberapa komponen di Media3 mengimplementasikan antarmuka Pemutar, misalnya:
| Komponen | Catatan deskripsi &perilaku |
|---|---|
ExoPlayer |
API pemutar media, dan implementasi default antarmuka Player. |
MediaController |
Berinteraksi dengan MediaSession untuk mengirim perintah pemutaran. Jika
Player dan MediaSession Anda berada di
Service yang terpisah dari Activity atau
Fragment tempat UI pemutar berada, Anda dapat menetapkan
MediaController sebagai pemutar untuk komponen UI
seperti PlayerView atau Player
Composable. Panggilan metode pemutaran dan playlist dikirim
ke Player melalui MediaSession.
|
MediaBrowser |
Selain fungsi yang ditawarkan oleh
MediaController, berinteraksi dengan
MediaLibrarySession untuk menjelajahi konten media yang tersedia.
|
SimpleBasePlayer |
Implementasi Player yang mengurangi jumlah metode
untuk diimplementasikan hingga minimum. Berguna saat menggunakan pemutar kustom yang Anda
ingin Anda hubungkan ke MediaSession.
|
ForwardingSimpleBasePlayer |
Subclass SimpleBasePlayer yang dirancang untuk meneruskan operasi pemutaran
ke Player lain sekaligus memungkinkan penyesuaian perilaku konsisten yang sama seperti SimpleBasePlayer. Gunakan
class ini untuk menekan atau mengubah operasi pemutaran tertentu.
|
RemoteCastPlayer |
Implementasi Player untuk mengontrol pemutaran di aplikasi penerima Cast jarak jauh.
|
CastPlayer |
Implementasi Player untuk mengontrol pemutaran Cast lokal dan jarak jauh.
|
Meskipun MediaSession tidak mengimplementasikan antarmuka Player, MediaSession memerlukan Player saat membuatnya. Tujuannya adalah untuk memberikan akses ke Player dari proses atau thread lain.
Arsitektur pemutaran Media3
Jika Anda memiliki akses ke Player, Anda harus memanggil metodenya secara langsung untuk mengeluarkan perintah pemutaran. Anda dapat mengiklankan pemutaran dan memberikan kontrol pemutaran sumber eksternal dengan mengimplementasikan MediaSession. Sumber eksternal ini mengimplementasikan MediaController, yang memfasilitasi koneksi ke sesi media dan mengeluarkan permintaan perintah pemutaran.
Saat memutar media di latar belakang, Anda harus menampung sesi media dan pemutar dalam MediaSessionService atau MediaLibraryService yang berjalan sebagai layanan latar depan. Jika melakukannya, Anda dapat memisahkan pemutar dari Aktivitas di aplikasi yang berisi UI untuk kontrol pemutaran. Hal ini mungkin mengharuskan Anda menggunakan pengontrol media.
Player memainkan peran penting
dalam arsitektur Media3.Status pemutar
Status pemutar media yang mengimplementasikan antarmuka Player terutama terdiri dari 4 kategori informasi:
- Status pemutaran
- Ambil dengan
getPlaybackState(). - Nilai status yang ditentukan oleh antarmuka adalah
STATE_IDLE,STATE_BUFFERING,STATE_READY, danSTATE_ENDED.
- Ambil dengan
- Playlist item media
- Urutan instance
MediaItemuntuk pemutaran. - Ambil dengan
getCurrentTimeline() - Instance
Playerdapat menyediakan metode operasi playlist seperti menambahkan atau menghapus sebuahMediaItemdan metode praktis sepertigetCurrentMediaItem().
- Urutan instance
- Properti putar/jeda, seperti:
playWhenReady: Indikasi apakah pengguna ingin media diputar jika memungkinkan atau tetap dijeda- Alasan penekanan pemutaran:
Indikasi alasan pemutaran ditekan, jika berlaku, meskipun
playWhenReadyadalahtrue isPlaying: Indikasi apakah pemutar saat ini sedang diputar, yang hanya akan menjaditruejika status pemutaran adalahSTATE_READY,playWhenReadyadalahtrue, dan pemutaran tidak ditekan
- Posisi pemutaran, termasuk:
- Indeks item media saat ini:
Indeks
MediaItemsaat ini dalam playlist. isPlayingAd: Indikasi apakah iklan yang disisipkan sedang diputar.- Posisi pemutaran saat ini:
Posisi pemutaran saat ini dalam
MediaItematau iklan yang disisipkan.
- Indeks item media saat ini:
Indeks
Selain itu, antarmuka Player memungkinkan akses ke
trek yang tersedia,
metadata media,
kecepatan pemutaran,
volume dan properti tambahan pemutaran lainnya.
Memproses perubahan
Gunakan Player.Listener
untuk memproses perubahan di Player. Lihat dokumentasi ExoPlayer tentang
Peristiwa pemutar untuk
mengetahui detail tentang cara membuat dan menggunakan pemroses.
Perhatikan bahwa antarmuka pemroses tidak menyertakan callback apa pun untuk melacak progres pemutaran normal. Untuk terus memantau progres pemutaran, seperti menyiapkan UI progres bar, Anda harus mengkueri posisi saat ini pada interval yang tepat.
Kotlin
fun checkPlaybackPosition(delayMs: Long): Boolean = handler.postDelayed( { val currentPosition = player.currentPosition // Update UI based on currentPosition checkPlaybackPosition(delayMs) }, delayMs, )
Java
boolean checkPlaybackPosition(long delayMs) { return handler.postDelayed( () -> { long currentPosition = player.getCurrentPosition(); // Update UI based on currentPosition checkPlaybackPosition(delayMs); }, delayMs); }
Mengontrol pemutaran
Antarmuka Player menawarkan banyak cara untuk memanipulasi status dan mengontrol pemutaran:
- Kontrol pemutaran dasar
seperti
play(),pause(),prepare(), danstop(). - Operasi playlist seperti
addMediaItem()atauremoveMediaItem(). - Mencari untuk mengubah item atau posisi saat ini.
- Menetapkan mode pengulangan dan mode acak.
- Memperbarui preferensi pemilihan trek.
- Menetapkan kecepatan pemutaran .
Implementasi Player kustom
Untuk membuat pemutar kustom, Anda dapat memperluas the
SimpleBasePlayer
yang disertakan dalam Media3. Class ini menyediakan implementasi dasar antarmuka Player untuk mengurangi jumlah metode yang perlu Anda implementasikan hingga minimum.
Mulai dengan mengganti metode getState(). Metode ini harus mengisi status pemutar saat ini saat dipanggil, termasuk:
- Kumpulan perintah yang tersedia
- Properti pemutaran, seperti apakah pemutar harus mulai diputar saat status pemutaran adalah
STATE_READY, indeks item media yang sedang diputar, dan posisi pemutaran dalam item saat ini
Kotlin
class CustomPlayer(looper: Looper) : SimpleBasePlayer(looper) { override fun getState(): State { return State.Builder() .setAvailableCommands(Commands.EMPTY) // Set which playback commands the player can handle // Configure additional playback properties .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST) .setCurrentMediaItemIndex(0) .setContentPositionMs(0) .build() } }
Java
private static final class CustomPlayer extends SimpleBasePlayer { public CustomPlayer(Looper looper) { super(looper); } @Override protected State getState() { return new State.Builder() .setAvailableCommands(Commands.EMPTY) // Set which playback commands the player can handle // Configure additional playback properties .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST) .setCurrentMediaItemIndex(0) .setContentPositionMs(0) .build(); } }
SimpleBasePlayer akan memastikan bahwa State dibuat dengan kombinasi nilai status yang valid. Metode ini juga akan menangani pemroses dan memberi tahu pemroses tentang perubahan status. Jika Anda perlu memicu pembaruan status secara manual,
panggil invalidateState().
Selain metode getState(), Anda hanya perlu mengimplementasikan metode yang digunakan untuk perintah yang dideklarasikan pemutar Anda agar tersedia. Temukan metode pengendali yang dapat diganti yang sesuai dengan fungsi yang ingin Anda implementasikan. Misalnya,
ganti metode handleSeek()
untuk mendukung operasi seperti COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM
dan COMMAND_SEEK_TO_NEXT_MEDIA_ITEM.
Mengubah implementasi Player
Daripada membuat Player yang sepenuhnya kustom, Anda dapat menggunakan
ForwardingSimpleBasePlayer untuk mengubah status dan perilaku
Player yang ada. Lihat panduan di halaman Penyesuaian untuk
mengetahui detail selengkapnya.