ExoPlayer: apa itu, fitur dan konfigurasi

Penulis: IT Sectr Diterbitkan: 2026-05-23 Waktu membaca: 8 mnt

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 pemutar media sumber terbuka untuk Android dari Google.
  • Format lintas platform — ExoPlayer mendukung DASH, HLS, SmoothStreaming, dan RTSP melalui sistem ekstensi modular.
  • Kustomisasi — setiap komponen pemutar (renderer, sumber data, DRM) dapat diganti dengan implementasi sendiri.
  • Canvas dan Compose — ExoPlayer terintegrasi baik dengan pendekatan View tradisional (SurfaceView) maupun dengan Jetpack Compose.
  • DRM — dukungan untuk Widevine, PlayReady, dan ClearKey melalui sistem DRM modular.

Apa itu ExoPlayer?

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.

Arsitektur ExoPlayer

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.

Fitur ExoPlayer

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.

FiturDeskripsiModul
DASHStreaming adaptif sesuai standar MPEGexoplayer-dash
HLSHTTP Live Streaming dari Appleexoplayer-hls
SmoothStreamingStreaming adaptif dari Microsoftexoplayer-smoothstreaming
RTSPReal-Time Streaming Protocol untuk siaran langsungexoplayer-rtsp
WidevinePerlindungan konten DRMexoplayer-drm
ConcatenationPenggabungan beberapa file mediaexoplayer-core
AdsIntegrasi IMA SDK untuk iklanexoplayer-ima

Peralihan Bitrate Adaptif

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.

DRM dan Perlindungan Konten

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.

Cara Mengintegrasikan ExoPlayer ke Proyek Android

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.

Menambahkan Dependensi

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.

groovy
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"
}

Integrasi Dasar di Activity

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.

kotlin
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()
    }
}

Penanganan Kesalahan dan Status

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.

ExoPlayer vs MediaPlayer: Perbandingan

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.

KriteriaExoPlayerMediaPlayer
ArsitekturModular, sepenuhnya di Java/KotlinLapisan di atas komponen C++ sistem
StreamingDASH, HLS, SmoothStreaming, RTSPHanya file lokal dan HLS (Android 9+)
KustomisasiPenuh (setiap komponen dapat diganti)Minimal (hanya parameter)
PembaruanMelalui Google Play atau APK (independen dari OS)Hanya melalui pembaruan Android (OTA)
Ukuran APK+1-3 MB (tergantung modul)0 (bagian dari sistem)
Min SDKAPI 16+ (Android 4.1)API 1+
DRMWidevine, PlayReady, ClearKeyWidevine (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.

Konfigurasi Lanjutan ExoPlayer

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.

Cache Konten

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.

kotlin
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()

Penanganan Peralihan Jaringan

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.

Integrasi dengan Jetpack Compose

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.

kotlin
@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

Berapa versi Android minimum untuk ExoPlayer?

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.

Bisakah ExoPlayer digunakan untuk audio tanpa video?

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.

Bagaimana cara beralih antar trek audio di ExoPlayer?

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.

Apakah ExoPlayer mendukung teks?

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.

Bagaimana cara mengurangi latensi saat streaming langsung di ExoPlayer?

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

  • ExoPlayer — pustaka pemutar media sumber terbuka dari Google dengan arsitektur modular dan kustomisasi penuh.
  • Streaming adaptif — mendukung DASH, HLS, SmoothStreaming, dan RTSP melalui sistem ekstensi modular.
  • DRM — Widevine, PlayReady, dan ClearKey terintegrasi melalui modul exoplayer-drm dengan API terpadu.
  • Cache — SimpleCache menyediakan pemutaran offline dan penghematan lalu lintas saat menonton ulang.
  • Compose — sejak AndroidX Media3, ExoPlayer terintegrasi dengan Jetpack Compose melalui AndroidView.
  • Kustomisasi — setiap komponen (MediaSource, TrackSelector, LoadControl, Renderer) dapat diganti.
  • Direkomendasikan — gunakan ExoPlayer untuk semua proyek yang memerlukan streaming, DRM, atau kustomisasi pemutaran.

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.

Diskusikan proyek

Baca juga