ExoPlayer — Android uchun ochiq kodli media pleer kutubxonasi bo'lib, Google tomonidan o'rnatilgan MediaPlayer-ga muqobil sifatida ishlab chiqilgan. ExoPlayer turli formatlarda, jumladan DASH, HLS, SmoothStreaming va oddiy media fayllarda audio va videoni qayta tiklashni yagona API orqali adaptiv striming qo'llab-quvvatlashi bilan ta'minlaydi. Google I/O (2024) ma'lumotlariga ko'ra, ExoPlayer 60 000 dan ortiq Android ilovalarida, jumladan YouTube, Google TV va Netflix-da qo'llaniladi.
Asosiy ma'lumotlar
ExoPlayer — Android uchun ochiq kodli (Apache 2.0) multimedia qayta tiklash kutubxonasi bo'lib, birinchi versiyasi Google tomonidan 2014-yilda chiqarilgan. O'rnatilgan MediaPlayer-dan farqli o'laroq, tizim media kodekining (MediaCodec) yupqa qatlami bo'lgan ExoPlayer to'liq Java/Kotlin darajasida amalga oshirilgan bo'lib, bu dasturchilarga qayta tiklashning har bir bosqichi ustidan to'liq nazorat beradi.
Arxitektura jihatidan ExoPlayer modulli prinsip asosida qurilgan: qayta tiklashning har bir jihati alohida komponent tomonidan amalga oshiriladi. Asosiy modul (exoplayer-core) pleer, rendererlar, trek tanlagichlari va bufer boshqaruvini o'z ichiga oladi. Qo'shimcha modullar (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) tegishli striming protokollarini qo'llab-quvvatlashni qo'shadi. Bunday arxitektura ilovalarga faqat kerakli komponentlarni ulash imkonini beradi, APK hajmini minimallashtiradi.
ExoPlayer 2 (joriy asosiy versiya) 2018-yilda chiqarilgan va API-ni tubdan qayta ishlashni olib kelgan: Player Interface joriy etilishi, AndroidX Media3 orqali Compose qo'llab-quvvatlashi, yaxshilangan xato boshqaruvi va adaptiv trek tanlash algoritmlari. 2.19 versiyasidan (2024) boshlab ExoPlayer AndroidX Media kutubxonasining tarkibiy qismiga aylandi, bu standart Android bog'liqlik menejeri orqali integratsiya va yangilanishni soddalashtirdi.
ExoPlayer asosida ExoPlayerImpl komponenti yotadi, u qayta tiklash hayotiy siklini boshqaradi. U MediaSource (media manbai), TrackSelector (trek tanlash), LoadControl (buferlash boshqaruvi) va Renderer (video, audio, subtitr va metadata rendererlari) ro'yxatini o'z ichiga oladi. Har bir komponent Builder yoki fabrika metodlari orqali o'z tatbiqi bilan almashtirilishi mumkin.
Video render qilish uchun ExoPlayer SurfaceView, TextureView yoki SphericalSurfaceView (360 daraja video uchun) dan foydalanadi. Tavsiya etilgan variant SurfaceView hisoblanadi, chunki u apparat tezlashuvi va minimal energiya sarfini ta'minlaydi. Jetpack Compose uchun AndroidX Media3 kutubxonasi SurfaceView-ni o'rab oluvchi `AndroidView` komponentini va eksperimental `Media3Compose`-ni taqdim etadi.
ExoPlayer oddiy media pleerdan tashqariga chiqadigan keng funksiyalar to'plamini taqdim etadi. Asosiy imkoniyatlarga barcha mashhur striming protokollarini qo'llab-quvvatlash, moslashuvchan DRM tizimi, adaptiv bitrate almashtirish (ABR) va qayta tiklash analitika vositalari kiradi.
| Funksiya | Tavsif | Modul |
|---|---|---|
| DASH | MPEG standarti bo'yicha adaptiv striming | exoplayer-dash |
| HLS | Apple-dan HTTP Live Streaming | exoplayer-hls |
| SmoothStreaming | Microsoft-dan adaptiv striming | exoplayer-smoothstreaming |
| RTSP | Jonli efir uchun Real-Time Streaming Protocol | exoplayer-rtsp |
| Widevine | DRM kontent himoyasi | exoplayer-drm |
| Concatenation | Bir nechta media fayllarni birlashtirish | exoplayer-core |
| Ads | Reklama uchun IMA SDK integratsiyasi | exoplayer-ima |
ABR (Adaptive Bitrate) ExoPlayer-da AdaptiveTrackSelection interfeysi orqali amalga oshirilgan. Standart sifatida AdaptiveTrackSelectionFactory ishlatiladi, u DefaultAdaptiveTrackSelection yaratadi — tarmoq o'tkazish qobiliyati va bufer hajmini hisobga oluvchi muvozanatli algoritm. Muayyan stsenariylar uchun muqobil tatbiqlar ulanishi mumkin: BOLA (almashtirishlarni minimallashtirish), RandomAdaptiveTrackSelection (test) yoki TrackSelection interfeysi orqali o'z tatbiqingiz.
BandwidthMeter — tarmoq o'tkazish qobiliyatini o'lchash uchun yana bir asosiy komponent. Standart sifatida DefaultBandwidthMeter ishlatiladi, u pleerning barcha HTTP so'rovlari bo'yicha statistika to'playdi. Dasturchi uni qo'shimcha omillarni hisobga olish uchun kengaytirishi mumkin: tarmoq turi (Wi-Fi, 4G, 5G), uyali signali yoki foydalanuvchi uchun trafik narxi.
ExoPlayer Widevine (L1, L3), PlayReady va ClearKey DRM-ni qo'llab-quvvatlaydi. Litsenziya olish litsenziya serveri bilan o'zaro aloqada bo'lgan DrmSessionManager orqali sozlanadi. Premium video (4K HDR) uchun Widevine L1 apparat qo'llab-quvvatlashi talab qilinadi, bu chip darajasida himoyani ta'minlaydi va ekranni qo'lga kiritishning oldini oladi. DRM tizimini tanlash maqsadli platformaga bog'liq: Widevine Android va Chromecast-da, PlayReady Xbox va Windows-da, FairPlay iOS va Apple TV-da ishlatiladi. ExoPlayer MPD fayli asosida mavjud DRM tizimini avtomatik aniqlaydi va asosiy stsenariylar uchun qo'lda sozlashni talab qilmaydi.
ExoPlayer-ni Android loyihasiga ulash Gradle bog'liqliklari orqali amalga oshiriladi. 2.19 versiyasidan boshlab ExoPlayer AndroidX Media (androidx.media3) tarkibiga kiradi, bu Jetpack Compose va boshqa AndroidX komponentlari bilan moslikni ta'minlaydi. Keling, Kotlin-da bosqichma-bosqich integratsiyani ko'rib chiqaylik.
build.gradle (Module) fayliga ExoPlayer modullarini qo'shing. Minimal to'plam core, ui va kerakli striming protokoli uchun modulni o'z ichiga oladi. DASH kontentini qayta tiklash uchun exoplayer-dash, HLS uchun exoplayer-hls talab qilinadi.
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"
}
Activity yoki Fragment-da pleerni yaratish va sozlash. ExoPlayer video va o'rnatilgan boshqaruv elementlarini ko'rsatish uchun PlayerView (yoki sozlash uchun StyledPlayerView) dan foydalanadi. Minimal konfiguratsiya ExoPlayer.Builder orqali pleerni yaratish va manba URI bilan MediaItem-ni uzatishni o'z ichiga oladi.
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()
}
}
Ishlab chiqarish ilovalari uchun mumkin bo'lgan qayta tiklash xatolarini boshqarish zarur: tarmoq nosozliklari, qo'llab-quvvatlanmaydigan formatlar, DRM litsenziyalash xatolari. ExoPlayer onPlayerError, onPlaybackStateChanged va onPlayWhenReadyChanged metodlari bilan Player.Listener interfeysini taqdim etadi. Takrorlash imkoniyati bilan foydalanuvchiga ma'lumot beruvchi xato xabarlarini ko'rsatish tavsiya etiladi.
ExoPlayer va o'rnatilgan MediaPlayer o'rtasidagi tanlov Android ilovalarini ishlab chiqishda keng tarqalgan savoldir. MediaPlayer Android SDK-ning 1.0 versiyasidan boshlab qismidir, ExoPlayer esa Gradle orqali ulanishni talab qiladigan kutubxonadir. Keling, ularning farqlarini asosiy mezonlar bo'yicha ko'rib chiqaylik.
| Mezon | ExoPlayer | MediaPlayer |
|---|---|---|
| Arxitektura | Modulli, to'liq Java/Kotlin-da | Tizim C++ komponentlari ustidagi qatlam |
| Striming | DASH, HLS, SmoothStreaming, RTSP | Faqat mahalliy fayllar va HLS (Android 9+) |
| Sozlash | To'liq (har bir komponent almashtiriladi) | Minimal (faqat parametrlar) |
| Yangilanishlar | Google Play yoki APK orqali (OS-dan mustaqil) | Faqat Android yangilanishi (OTA) bilan |
| APK hajmi | +1-3 MB (modullarga qarab) | 0 (OS qismi) |
| Min SDK | API 16+ (Android 4.1) | API 1+ |
| DRM | Widevine, PlayReady, ClearKey | Widevine (cheklangan) |
ExoPlayer ustun striming (DASH, HLS), UI sozlash, DRM qo'llab-quvvatlash va Android versiyasidan mustaqillik talab qiladigan stsenariylarda. MediaPlayer APK hajmi kritik bo'lgan va adaptiv striming talablari bo'lmagan mahalliy media fayllarni qayta tiklaydigan oddiy ilovalar uchun mos keladi. Tarmoqdagi kontentga ega zamonaviy ilovalar uchun ExoPlayer aniq tanlovdir.
Istisno — minimal SDK-si API 16-dan (Android 4.1) past bo'lgan ilovalar, ular bozorda deyarli qolmagan. targetSdk 33+ va minimal SDK 21+ bo'lgan barcha ilovalar uchun ExoPlayer nafaqat afzal, balki AV1 va Dolby Vision kabi zamonaviy formatlarni tegishli kengaytmalar orqali qo'llab-quvvatlash uchun zarurdir.
Ishlab chiqarish ilovalari uchun asosiy ExoPlayer integratsiyasi ko'pincha qo'shimcha sozlash ni talab qiladi: keshlashni boshqarish, mobil tarmoqlar uchun buferlashni optimallashtirish, analitika bilan integratsiya va audio treklarni tanlashni sozlash. Keling, ilg'or foydalanish stsenariylarini ko'rib chiqaylik.
CacheDataSourceFactory yuklangan segmentlarni mahalliy xotirada keshlash imkonini beradi, bu takroriy ko'rishda trafikni tejaydi va oflayn qayta tiklashni ta'minlaydi. ExoPlayer exoplayer-cas kutubxonasidan SimpleCache dan foydalanadi — LRU evakuatsiyasi va hajm cheklovlari bilan fayl keshlash.
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 ilovalarda Wi-Fi va mobil tarmoq o'rtasidagi almashtirishni boshqarish muhimdir. ExoPlayer tarmoq holatini kuzatish uchun ConnectivityManager ni taqdim etadi. Ulanish yo'qolganda, pleerni to'xtatmasdan, pozitsiyani saqlagan holda PAUSED holatiga o'tkazish tavsiya etiladi. Ulanish tiklangandan so'ng, segmentlarni qayta yuklash bilan qayta tiklashni davom ettiring.
AndroidX Media3 chiqarilishi bilan kutubxona Jetpack Compose uchun eksperimental qo'llab-quvvatlashga ega bo'ldi. `AndroidView` komponenti SurfaceView yoki PlayerView-ni o'rab oladi, Compose ierarxiyasi bilan moslikni ta'minlaydi. Chuqurroq integratsiya uchun `androidx.media3:media3-ui-compose` kutubxonasi ishlatiladi, u Compose-mos pleer boshqaruv elementlarini taqdim etadi.
@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 } }
)
}
Tez-tez beriladigan savollar
ExoPlayer Android API 16+ (Android 4.1 Jelly Bean) ni qo'llab-quvvatlaydi. Biroq, fMP4 segmentlari bilan DASH va HLS uchun API 21+ (Android 5.0 Lollipop) tavsiya etiladi. DRM modullari (Widevine) API 19+ talab qiladi, HEVC apparat dekodlash esa API 21 dan boshlab mavjud.
Ha, ExoPlayer audio uchun juda mos keladi. Faqat tovushni qayta tiklash uchun SurfaceView yoki PlayerView talab qilinmaydi. ExoPlayer avtomatik audio renderer-ni tanlaydi va fon rejimida ishlaydi. Fon qayta tiklash uchun tizim boshqaruv elementlari bilan integratsiya uchun MediaSessionService dan foydalanish tavsiya etiladi.
TrackSelector ExoPlayer-da audio treklarni tanlashni boshqaradi. Almashish uchun player.getCurrentTracks().groups va player.setTrackSelectionParameters() dan afzal ko'rgan audio tilini ko'rsatib foydalaning. Bir nechta audio trekli DASH va HLS strimlari uchun almashish qayta tiklashni to'xtatmasdan amalga oshadi.
Ha, ExoPlayer ichki (MP4, WebM konteynerida) va tashqi subtitrlarni TTML, SRT, VTT va CEA-608 formatlarida qo'llab-quvvatlaydi. Tashqi subtitrlar uchun SingleSampleMediaSource yoki video oqimi bilan birlashtirish uchun MergingMediaSource ishlatiladi. Stilizatsiyalangan subtitrlar ko'rinishi CaptionStyleCompat orqali sozlanadi.
Past Kechikish strimingi uchun LoadControl-ni kichikroq maqsadli bufer qiymatlari bilan sozlang: HLS LL va DASH LL uchun DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) dan foydalaning. Shuningdek, jonli efirdan orqada qolganda buferning tezlashtirilgan to'ldirilishi uchun minPlaybackSpeed = 1.02 ni belgilang.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.