ExoPlayer adalah pustaka pemutar media sumber terbuka untuk Android, dikembangkan oleh Google sebagai alternatif untuk MediaPlayer bawaan. ExoPlayer menyediakan pemutaran audio dan video dalam berbagai format, termasuk DASH, HLS, SmoothStreaming, dan file media biasa, melalui API terpadu dengan dukungan untuk streaming adaptif. Menurut Google I/O (2024), ExoPlayer digunakan di lebih dari 60.000 aplikasi Android, termasuk YouTube, Google TV, dan Netflix.
Poin Utama
ExoPlayer adalah pustaka pemutaran multimedia untuk Android dengan kode sumber terbuka (Apache 2.0), yang versi pertamanya dirilis oleh Google pada tahun 2014. Tidak seperti MediaPlayer bawaan, yang merupakan lapisan tipis di atas codec media sistem (MediaCodec), ExoPlayer diimplementasikan sepenuhnya di tingkat Java/Kotlin, memberikan pengembang kontrol penuh atas setiap tahap pemutaran.
Secara arsitektur, ExoPlayer dibangun di atas prinsip modular: setiap aspek pemutaran diimplementasikan oleh komponen terpisah. Modul utama (exoplayer-core) berisi pemutar, renderer, pemilih trek, dan manajemen buffer. Modul tambahan (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) menambahkan dukungan untuk protokol streaming yang sesuai. Arsitektur ini memungkinkan aplikasi untuk menghubungkan hanya komponen yang diperlukan, meminimalkan ukuran APK.
ExoPlayer 2 (versi utama saat ini) dirilis pada tahun 2018 dan membawa perombakan besar pada API: pengenalan Player Interface, dukungan Compose melalui AndroidX Media3, penanganan kesalahan yang ditingkatkan, dan algoritma pemilihan trek adaptif. Mulai versi 2.19 (2024), ExoPlayer menjadi bagian dari pustaka AndroidX Media, yang menyederhanakan integrasi dan pembaruan melalui manajer dependensi Android standar.
Inti dari ExoPlayer adalah komponen ExoPlayerImpl, yang mengelola siklus hidup pemutaran. Ini berisi MediaSource (sumber media), TrackSelector (pemilihan trek), LoadControl (manajemen buffer), dan daftar Renderer (renderer untuk video, audio, teks, dan metadata). Setiap komponen dapat diganti dengan implementasi sendiri melalui Builder atau metode pabrik.
Untuk merender video, ExoPlayer menggunakan SurfaceView, TextureView, atau SphericalSurfaceView (untuk video 360 derajat). Opsi yang disarankan adalah SurfaceView, karena memberikan akselerasi perangkat keras dan konsumsi daya minimal. Untuk Jetpack Compose, pustaka AndroidX Media3 menyediakan komponen `AndroidView` yang membungkus SurfaceView, dan `Media3Compose` eksperimental dengan integrasi Compose asli.
ExoPlayer menyediakan serangkaian fitur luas yang melampaui pemutar media biasa. Fitur utama mencakup dukungan untuk semua protokol streaming populer, sistem DRM yang fleksibel, peralihan bitrate adaptif (ABR), dan alat analitik pemutaran.
| Fitur | Deskripsi | Modul |
|---|---|---|
| DASH | Streaming adaptif sesuai standar MPEG | exoplayer-dash |
| HLS | HTTP Live Streaming dari Apple | exoplayer-hls |
| SmoothStreaming | Streaming adaptif dari Microsoft | exoplayer-smoothstreaming |
| RTSP | Real-Time Streaming Protocol untuk siaran langsung | exoplayer-rtsp |
| Widevine | Perlindungan konten DRM | exoplayer-drm |
| Concatenation | Penggabungan beberapa file media | exoplayer-core |
| Ads | Integrasi IMA SDK untuk iklan | exoplayer-ima |
ABR (Adaptive Bitrate) di ExoPlayer diimplementasikan melalui antarmuka AdaptiveTrackSelection. Secara default, AdaptiveTrackSelectionFactory digunakan, yang membuat DefaultAdaptiveTrackSelection — algoritma seimbang yang mempertimbangkan bandwidth jaringan dan ukuran buffer. Untuk skenario spesifik, implementasi alternatif dapat dihubungkan: BOLA (meminimalkan peralihan), RandomAdaptiveTrackSelection (pengujian), atau implementasi sendiri melalui antarmuka TrackSelection.
BandwidthMeter adalah komponen kunci lain yang bertanggung jawab untuk mengukur bandwidth jaringan. Secara default, DefaultBandwidthMeter digunakan, yang mengumpulkan statistik dari semua permintaan HTTP pemutar. Pengembang dapat memperluasnya untuk mempertimbangkan faktor tambahan: jenis jaringan (Wi-Fi, 4G, 5G), sinyal menara seluler, atau biaya lalu lintas bagi pengguna.
ExoPlayer mendukung Widevine (L1, L3), PlayReady, dan ClearKey DRM. Mendapatkan lisensi dikonfigurasikan melalui DrmSessionManager, yang berinteraksi dengan server lisensi. Untuk video premium (4K HDR), diperlukan dukungan perangkat keras Widevine L1, yang memberikan perlindungan tingkat chip dan mencegah pengambilan layar. Pemilihan sistem DRM tergantung pada platform target: Widevine digunakan di Android dan Chromecast, PlayReady di Xbox dan Windows, FairPlay di iOS dan Apple TV. ExoPlayer secara otomatis menentukan sistem DRM yang tersedia berdasarkan file MPD dan tidak memerlukan konfigurasi manual untuk skenario dasar.
Menghubungkan ExoPlayer ke proyek Android dilakukan melalui dependensi Gradle. Mulai versi 2.19, ExoPlayer menjadi bagian dari AndroidX Media (androidx.media3), yang memastikan kompatibilitas dengan Jetpack Compose dan komponen AndroidX lainnya. Mari kita lihat integrasi langkah demi langkah dalam Kotlin.
Tambahkan modul ExoPlayer ke file build.gradle (Module). Set minimum mencakup core, ui, dan modul untuk protokol streaming yang diperlukan. Untuk memutar konten DASH, diperlukan exoplayer-dash, untuk HLS — exoplayer-hls.
dependencies {
implementation "androidx.media3:media3-exoplayer:1.5.0"
implementation "androidx.media3:media3-ui:1.5.0"
implementation "androidx.media3:media3-exoplayer-dash:1.5.0"
implementation "androidx.media3:media3-exoplayer-hls:1.5.0"
}
Membuat dan mengonfigurasi pemutar di Activity atau Fragment. ExoPlayer menggunakan PlayerView (atau StyledPlayerView untuk kustomisasi) untuk menampilkan video dan kontrol bawaan. Konfigurasi minimum mencakup pembuatan pemutar melalui ExoPlayer.Builder dan meneruskan MediaItem dengan URI sumber.
class PlayerActivity : AppCompatActivity() {
private var player: ExoPlayer? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_player)
player = ExoPlayer.Builder(this).build()
val playerView = findViewById<StyledPlayerView>(R.id.playerView)
playerView.player = player
val mediaItem = MediaItem
.Builder()
.setUri("https://example.com/video.mp4")
.build()
player?.setMediaItem(mediaItem)
player?.prepare()
}
override fun onDestroy() {
player?.release()
super.onDestroy()
}
}
Untuk aplikasi produksi, penanganan kesalahan pemutaran yang mungkin terjadi sangat penting: kegagalan jaringan, format yang tidak didukung, kesalahan lisensi DRM. ExoPlayer menyediakan antarmuka Player.Listener dengan metode onPlayerError, onPlaybackStateChanged, dan onPlayWhenReadyChanged. Disarankan untuk menampilkan pesan kesalahan informatif kepada pengguna dengan kemungkinan pengulangan.
Pemilihan antara ExoPlayer dan MediaPlayer bawaan adalah pertanyaan umum dalam pengembangan aplikasi Android. MediaPlayer adalah bagian dari Android SDK sejak versi 1.0, sementara ExoPlayer adalah pustaka yang memerlukan koneksi melalui Gradle. Mari kita lihat perbedaan mereka berdasarkan kriteria utama.
| Kriteria | ExoPlayer | MediaPlayer |
|---|---|---|
| Arsitektur | Modular, sepenuhnya di Java/Kotlin | Lapisan di atas komponen C++ sistem |
| Streaming | DASH, HLS, SmoothStreaming, RTSP | Hanya file lokal dan HLS (Android 9+) |
| Kustomisasi | Penuh (setiap komponen dapat diganti) | Minimal (hanya parameter) |
| Pembaruan | Melalui Google Play atau APK (independen dari OS) | Hanya melalui pembaruan Android (OTA) |
| Ukuran APK | +1-3 MB (tergantung modul) | 0 (bagian dari sistem) |
| Min SDK | API 16+ (Android 4.1) | API 1+ |
| DRM | Widevine, PlayReady, ClearKey | Widevine (terbatas) |
ExoPlayer unggul dalam skenario yang memerlukan streaming (DASH, HLS), kustomisasi UI, dukungan DRM, dan independensi dari versi Android. MediaPlayer cocok untuk aplikasi sederhana yang memutar file media lokal, di mana ukuran APK sangat penting dan tidak ada persyaratan untuk streaming adaptif. Untuk aplikasi modern dengan konten dari jaringan, ExoPlayer adalah pilihan yang jelas.
Pengecualian — aplikasi dengan SDK minimum di bawah API 16 (Android 4.1), yang praktis tidak ada lagi di pasar. Untuk semua aplikasi dengan targetSdk 33+ dan SDK minimum 21+, ExoPlayer tidak hanya lebih disukai, tetapi juga diperlukan untuk mendukung format modern seperti AV1 dan Dolby Vision melalui ekstensi yang sesuai.
Untuk aplikasi produksi, integrasi dasar ExoPlayer sering memerlukan konfigurasi tambahan: manajemen cache, optimalisasi buffering untuk jaringan seluler, integrasi dengan analitik, dan kustomisasi pemilihan trek audio. Mari kita lihat skenario penggunaan lanjutan.
CacheDataSourceFactory memungkinkan penyimpanan segmen yang diunduh di penyimpanan lokal, menghemat lalu lintas saat menonton ulang dan menyediakan pemutaran offline. ExoPlayer menggunakan SimpleCache dari pustaka exoplayer-cas — cache file dengan dukungan evakuasi LRU dan batas ukuran.
val cache = SimpleCache(
cacheDir,
LeastRecentlyUsedCacheEvictor(50 * 1024 * 1024),
AppDatabaseProvider(this)
)
val cacheDataSourceFactory = CacheDataSource
.Factory()
.setCache(cache)
val player = ExoPlayer.Builder(this)
.setMediaSourceFactory(
DefaultMediaSourceFactory(cacheDataSourceFactory)
)
.build()
Dalam aplikasi seluler, penanganan peralihan antara Wi-Fi dan jaringan seluler sangat penting. ExoPlayer menyediakan ConnectivityManager untuk melacak status jaringan. Saat kehilangan koneksi, disarankan untuk tidak menghentikan pemutar, tetapi beralih ke status PAUSED dengan mempertahankan posisi. Setelah koneksi pulih, lanjutkan pemutaran dengan memuat ulang segmen.
Dengan dirilisnya AndroidX Media3, pustaka ini mendapatkan dukungan eksperimental untuk Jetpack Compose. Komponen `AndroidView` membungkus SurfaceView atau PlayerView, memastikan kompatibilitas dengan hierarki Compose. Untuk integrasi yang lebih dalam, pustaka `androidx.media3:media3-ui-compose` digunakan, yang menyediakan kontrol pemutar yang kompatibel dengan Compose.
@Composable
fun VideoPlayer(uri: String) {
val context = LocalContext.current
val player = remember {
ExoPlayer.Builder(context).build()
.also { it.setMediaItem(MediaItem.fromUri(uri)) }
}
DisposableEffect(key = null) {
player.prepare()
onDispose { player.release() }
}
AndroidView(
factory = { StyledPlayerView(context).also { it.player = player } }
)
}
Pertanyaan yang Sering Diajukan
ExoPlayer mendukung Android API 16+ (Android 4.1 Jelly Bean). Namun, untuk DASH dan HLS dengan segmen fMP4, disarankan API 21+ (Android 5.0 Lollipop). Modul DRM (Widevine) memerlukan API 19+, dan decoding perangkat keras HEVC tersedia sejak API 21.
Ya, ExoPlayer sangat cocok untuk audio. Untuk pemutaran hanya suara, tidak diperlukan SurfaceView atau PlayerView. ExoPlayer akan secara otomatis memilih renderer audio dan bekerja di latar belakang. Untuk pemutaran latar belakang, disarankan menggunakan MediaSessionService untuk integrasi dengan kontrol sistem.
TrackSelector di ExoPlayer mengelola pemilihan trek audio. Untuk beralih, gunakan player.getCurrentTracks().groups dan player.setTrackSelectionParameters() dengan menentukan bahasa audio yang diinginkan. Untuk streaming DASH dan HLS dengan beberapa trek audio, peralihan terjadi tanpa mengganggu pemutaran.
Ya, ExoPlayer mendukung teks bawaan (dalam wadah MP4, WebM) dan teks eksternal dalam format TTML, SRT, VTT, dan CEA-608. Untuk teks eksternal, digunakan SingleSampleMediaSource atau MergingMediaSource untuk menggabungkan dengan streaming video. Tampilan teks bergaya dikonfigurasikan melalui CaptionStyleCompat.
Untuk streaming Low-Latency, konfigurasikan LoadControl dengan nilai target buffer yang lebih kecil: gunakan DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) untuk HLS LL dan DASH LL. Juga atur minPlaybackSpeed = 1.02 untuk pengisian buffer yang dipercepat saat tertinggal dari siaran langsung.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga