ExoPlayer, Google tarafından yerleşik MediaPlayer'a alternatif olarak geliştirilen, Android için açık kaynaklı bir medya oynatıcı kütüphanesidir. ExoPlayer, uyarlanabilir akış desteğiyle tek bir API üzerinden DASH, HLS, SmoothStreaming ve normal medya dosyaları dahil olmak üzere çeşitli formatlarda ses ve video oynatımı sağlar. Google I/O (2024) verilerine göre ExoPlayer, YouTube, Google TV ve Netflix dahil 60.000'den fazla Android uygulamasında kullanılmaktadır.
Kilit Noktalar
ExoPlayer, ilk sürümü 2014 yılında Google tarafından yayınlanan, Android için açık kaynaklı (Apache 2.0) bir multimedya oynatma kütüphanesidir. Sistem medya kodekinin (MediaCodec) üzerinde ince bir katman olan yerleşik MediaPlayer'ın aksine ExoPlayer, tamamen Java/Kotlin düzeyinde uygulanmıştır ve geliştiricilere oynatmanın her aşaması üzerinde tam kontrol sağlar.
Mimari olarak ExoPlayer, modüler bir prensip üzerine inşa edilmiştir: oynatmanın her yönü ayrı bir bileşen tarafından uygulanır. Çekirdek modül (exoplayer-core), oynatıcıyı, işleyicileri, parça seçicileri ve arabellek yönetimini içerir. Ek modüller (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming), ilgili akış protokollerine destek ekler. Bu mimari, uygulamaların yalnızca gerekli bileşenleri içermesine olanak tanır ve APK boyutunu en aza indirir.
ExoPlayer 2 (mevcut ana sürüm) 2018'de yayınlandı ve köklü bir API revizyonu getirdi: Player Interface'in tanıtımı, AndroidX Media3 aracılığıyla Compose desteği, iyileştirilmiş hata yönetimi ve uyarlanabilir parça seçim algoritmaları. Sürüm 2.19'dan (2024) itibaren ExoPlayer, AndroidX Media kütüphanesinin bir parçası haline gelmiş ve standart Android bağımlılık yöneticisi aracılığıyla entegrasyonu ve güncellemeleri basitleştirmiştir.
ExoPlayer'ın merkezinde, oynatma yaşam döngüsünü yöneten ExoPlayerImpl bileşeni bulunur. Bu bileşen, MediaSource (medya kaynağı), TrackSelector (parça seçimi), LoadControl (arabelleğe alma yönetimi) ve Renderer listesini (video, ses, altyazı ve meta veriler için işleyiciler) içerir. Her bileşen, Builder veya fabrika yöntemleri aracılığıyla özel bir uygulamayla değiştirilebilir.
Video işleme için ExoPlayer, SurfaceView, TextureView veya SphericalSurfaceView (360 derece video için) kullanır. Önerilen seçenek, donanım hızlandırması ve minimum güç tüketimi sağladığı için SurfaceView'dır. Jetpack Compose için AndroidX Media3 kütüphanesi, SurfaceView'ı saran `AndroidView` bileşenini ve yerel Compose entegrasyonuna sahip deneysel `Media3Compose` bileşenini sağlar.
ExoPlayer, normal bir medya oynatıcının ötesinde geniş bir özellik yelpazesi sunar. Temel yetenekler arasında tüm popüler akış protokollerinin desteği, esnek bir DRM sistemi, uyarlanabilir bit hızı anahtarlaması (ABR) ve oynatma analizi araçları bulunur.
| Özellik | Açıklama | Modül |
|---|---|---|
| DASH | MPEG standardına göre uyarlanabilir akış | exoplayer-dash |
| HLS | Apple'dan HTTP Live Streaming | exoplayer-hls |
| SmoothStreaming | Microsoft'tan uyarlanabilir akış | exoplayer-smoothstreaming |
| RTSP | Canlı için gerçek zamanlı akış protokolü | exoplayer-rtsp |
| Widevine | DRM içerik koruması | exoplayer-drm |
| Concatenation | Birden fazla medya dosyasını birleştirme | exoplayer-core |
| Ads | Reklam için IMA SDK entegrasyonu | exoplayer-ima |
ExoPlayer'da ABR (Adaptive Bitrate), AdaptiveTrackSelection arayüzü aracılığıyla uygulanır. Varsayılan olarak, ağ bant genişliğini ve arabellek boyutunu dikkate alan dengeli bir algoritma olan DefaultAdaptiveTrackSelection'ı oluşturan AdaptiveTrackSelectionFactory kullanılır. Belirli senaryolar için alternatif uygulamalar bağlanabilir: BOLA (anahtarlamaları en aza indirme), RandomAdaptiveTrackSelection (test) veya TrackSelection arayüzü aracılığıyla özel uygulama.
BandwidthMeter — ağ bant genişliğini ölçmekten sorumlu bir diğer anahtar bileşendir. Varsayılan olarak, oynatıcının tüm HTTP istekleri hakkında istatistik toplayan DefaultBandwidthMeter kullanılır. Geliştirici, ek faktörleri hesaba katmak için bunu genişletebilir: ağ türü (Wi-Fi, 4G, 5G), hücre kulesi sinyali veya kullanıcı için veri maliyeti.
ExoPlayer, Widevine (L1, L3), PlayReady ve ClearKey DRM'yi destekler. Lisans alma, lisans sunucusuyla etkileşime giren DrmSessionManager aracılığıyla yapılandırılır. Premium video (4K HDR) için, çip düzeyinde koruma sağlayan ve ekran yakalamayı önleyen Widevine L1 donanım desteği gerekir. DRM sistemi seçimi hedef platforma bağlıdır: Widevine Android ve Chromecast'te, PlayReady Xbox ve Windows'ta, FairPlay iOS ve Apple TV'de kullanılır. ExoPlayer, MPD dosyasına dayalı olarak kullanılabilir DRM sistemini otomatik olarak belirler ve temel senaryolar için manuel yapılandırma gerektirmez.
ExoPlayer'ın bir Android projesine bağlanması Gradle bağımlılıkları aracılığıyla yapılır. Sürüm 2.19'dan itibaren ExoPlayer, AndroidX Media'nın (androidx.media3) bir parçasıdır ve Jetpack Compose ve diğer AndroidX bileşenleriyle uyumluluk sağlar. Kotlin'de adım adım entegrasyonu inceleyelim.
ExoPlayer modüllerini build.gradle dosyasına (Module) ekleyin. Minimum küme, core, ui ve gerekli akış protokolü için modülü içerir. DASH içeriği oynatma için exoplayer-dash, HLS için exoplayer-hls gerekir.
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"
}
Bir Activity veya Fragment'te oynatıcı oluşturma ve yapılandırma. ExoPlayer, videoyu ve yerleşik kontrolleri görüntülemek için PlayerView (veya özelleştirme için StyledPlayerView) kullanır. Minimum yapılandırma, ExoPlayer.Builder aracılığıyla oynatıcı oluşturmayı ve kaynak URI'si ile bir MediaItem iletmeyi içerir.
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()
}
}
Prodüksiyon uygulamaları için olası oynatma hatalarının yönetimi gereklidir: ağ arızaları, desteklenmeyen formatlar, DRM lisanslama hataları. ExoPlayer, onPlayerError, onPlaybackStateChanged ve onPlayWhenReadyChanged yöntemleriyle Player.Listener arayüzünü sağlar. Kullanıcıya yeniden deneme seçeneğiyle bilgilendirici hata mesajları gösterilmesi önerilir.
ExoPlayer ve yerleşik MediaPlayer arasında seçim yapmak, Android uygulaması geliştirirken yaygın bir sorudur. MediaPlayer sürüm 1.0'dan beri Android SDK'nın bir parçasıyken, ExoPlayer bir Gradle bağımlılığı gerektiren bir kütüphanedir. Temel kriterlere göre farklılıklarını inceleyelim.
| Kriter | ExoPlayer | MediaPlayer |
|---|---|---|
| Mimari | Modüler, tamamen Java/Kotlin | Sistem C++ bileşenleri üzerinde katman |
| Akış | DASH, HLS, SmoothStreaming, RTSP | Sadece yerel dosyalar ve HLS (Android 9+) |
| Özelleştirme | Tam (herhangi bir bileşen değiştirilebilir) | Minimum (sadece parametreler) |
| Güncellemeler | Google Play veya APK aracılığıyla (OS'den bağımsız) | Sadece Android güncellemesi (OTA) ile |
| APK Boyutu | +1–3 MB (modüllere göre) | 0 (OS'in parçası) |
| Min SDK | API 16+ (Android 4.1) | API 1+ |
| DRM | Widevine, PlayReady, ClearKey | Widevine (sınırlı) |
ExoPlayer kazanır akış (DASH, HLS), UI özelleştirme, DRM desteği ve Android sürümünden bağımsızlık gerektiren senaryolarda. MediaPlayer, APK boyutunun kritik olduğu ve uyarlanabilir akış gereksinimlerinin olmadığı, yerel medya dosyalarını oynatan basit uygulamalar için uygundur. Ağdan içerik alan modern uygulamalar için ExoPlayer açık bir seçimdir.
İstisna — minimum SDK'sı API 16'nın (Android 4.1) altında olan ve pazarda neredeyse bulunmayan uygulamalar. targetSdk 33+ ve minimum SDK 21+ olan tüm uygulamalar için ExoPlayer yalnızca tercih edilen değil, aynı zamanda uygun uzantılar aracılığıyla AV1 ve Dolby Vision gibi modern formatları desteklemek için gereklidir.
Prodüksiyon uygulamaları için, temel ExoPlayer entegrasyonu genellikle ek yapılandırma gerektirir: önbellek yönetimi, mobil ağlar için arabellek optimizasyonu, analiz entegrasyonu ve ses parçası seçimi özelleştirmesi. Gelişmiş kullanım senaryolarını inceleyelim.
CacheDataSourceFactory, indirilen segmentlerin yerel depolamada önbelleğe alınmasını sağlar, tekrarlanan izlemelerde trafikten tasarruf sağlar ve çevrimdışı oynatmaya olanak tanır. ExoPlayer, exoplayer-cas kütüphanesinden SimpleCache — LRU tahliye desteği ve boyut sınırları olan dosya tabanlı önbellekleme kullanır.
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()
Mobil uygulamalarda, Wi-Fi ve hücresel ağ arasındaki anahtarlamanın yönetimi kritiktir. ExoPlayer, ağ durumunu izlemek için ConnectivityManager sağlar. Bağlantı kaybı durumunda, oynatıcıyı durdurmak yerine konumu koruyarak PAUSED durumuna almanız önerilir. Bağlantı yeniden sağlandıktan sonra, segmentleri yeniden yükleyerek oynatmaya devam edin.
AndroidX Media3'ün piyasaya sürülmesiyle birlikte kütüphane, Jetpack Compose için deneysel destek kazanmıştır. `AndroidView` bileşeni, SurfaceView veya PlayerView'ı sarar ve Compose hiyerarşisiyle uyumluluk sağlar. Daha derin entegrasyon için, Compose uyumlu oynatıcı kontrolleri sağlayan `androidx.media3:media3-ui-compose` kütüphanesi kullanılır.
@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 } }
)
}
Sıkça sorulan sorular
ExoPlayer, Android API 16+ (Android 4.1 Jelly Bean) destekler. Ancak fMP4 segmentli DASH ve HLS için API 21+ (Android 5.0 Lollipop) önerilir. DRM modülleri (Widevine) API 19+ gerektirir ve donanım HEVC kod çözme API 21'den itibaren kullanılabilir.
Evet, ExoPlayer ses için mükemmeldir. Yalnızca ses oynatma için SurfaceView veya PlayerView gerekmez. ExoPlayer otomatik olarak ses işleyicisini seçecek ve arka planda çalışacaktır. Arka plan oynatma için, sistem kontrolleriyle entegrasyon için MediaSessionService kullanılması önerilir.
ExoPlayer'daki TrackSelector, ses parçası seçimini yönetir. Geçiş yapmak için, tercih edilen ses dilini belirterek player.getCurrentTracks().groups ve player.setTrackSelectionParameters() kullanın. Birden fazla ses parçasına sahip DASH ve HLS akışlarında geçiş, oynatma kesintisi olmadan gerçekleşir.
Evet, ExoPlayer gömülü (MP4, WebM kaplarında) ve harici altyazıları TTML, SRT, VTT ve CEA-608 formatlarında destekler. Harici altyazılar için, video akışıyla birleştirmek üzere SingleSampleMediaSource veya MergingMediaSource kullanılır. Stilize altyazı görüntülemesi CaptionStyleCompat aracılığıyla yapılandırılır.
Düşük gecikmeli akış için LoadControl'u daha küçük hedef arabellek değerleriyle yapılandırın: HLS LL ve DASH LL için DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) kullanın. Ayrıca canlı yayının gerisinde kaldığınızda hızlandırılmış arabellek doldurma için minPlaybackSpeed = 1.02 ayarlayın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun