ExoPlayer — Android üçün açıq mənbəli media pleyer kitabxanasıdır, Google tərəfindən daxili MediaPlayer-ə alternativ olaraq hazırlanmışdır. ExoPlayer müxtəlif formatlarda, o cümlədən DASH, HLS, SmoothStreaming və adi media fayllarında audio və video oxutmağı vahid API vasitəsilə adaptiv striminq dəstəyi ilə təmin edir. Google I/O (2024) məlumatına görə, ExoPlayer 60 000-dən çox Android tətbiqində, o cümlədən YouTube, Google TV və Netflix-də istifadə olunur.
Əsas məqamlar
ExoPlayer — Android üçün açıq mənbə kodu (Apache 2.0) ilə multimedia oxutma kitabxanasıdır, ilk versiyası Google tərəfindən 2014-cü ildə buraxılmışdır. Daxili MediaPlayer-dən fərqli olaraq, sistem media kodekinin (MediaCodec) nazik bir qatı olan ExoPlayer tamamilə Java/Kotlin səviyyəsində reallaşdırılmışdır ki, bu da tərtibatçılara oxutmanın hər mərhələsi üzərində tam nəzarət verir.
Memarlıq baxımından ExoPlayer modul prinsipi üzərində qurulmuşdur: oxutmanın hər aspekti ayrıca komponent tərəfindən həyata keçirilir. Əsas modul (exoplayer-core) pleyer, rendererlər, trek seçiciləri və bufer idarəsini ehtiva edir. Əlavə modullar (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) müvafiq striminq protokollarının dəstəyini əlavə edir. Belə memarlıq tətbiqlərə yalnız lazımi komponentləri qoşmağa imkan verir, APK ölçüsünü minimuma endirir.
ExoPlayer 2 (cari əsas versiya) 2018-ci ildə buraxılmış və API-nin köklü yenidən işlənməsini gətirmişdir: Player Interface-in tətbiqi, AndroidX Media3 vasitəsilə Compose dəstəyi, təkmilləşdirilmiş səhv idarəetməsi və adaptiv trek seçim alqoritmləri. 2.19 versiyasından (2024) etibarən ExoPlayer AndroidX Media kitabxanasının tərkib hissəsi olmuşdur ki, bu da standart Android asılılıq meneceri vasitəsilə inteqrasiya və yeniləməni sadələşdirmişdir.
ExoPlayer-in əsasında ExoPlayerImpl komponenti dayanır, o oxutma həyat dövrünü idarə edir. O, MediaSource (media mənbəyi), TrackSelector (trek seçimi), LoadControl (buferləşdirmə idarəsi) və Renderer siyahısını (video, audio, altyazı və metadata rendererləri) ehtiva edir. Hər bir komponent Builder və ya fabrik metodları vasitəsilə öz tətbiqinizlə əvəz edilə bilər.
Video render etmək üçün ExoPlayer SurfaceView, TextureView və ya SphericalSurfaceView (360 dərəcə video üçün) istifadə edir. Tövsiyə olunan variant SurfaceView-dir, çünki o aparat sürətləndirilməsi və minimal enerji sərfiyyatı təmin edir. Jetpack Compose üçün AndroidX Media3 kitabxanası SurfaceView-i bükən `AndroidView` komponentini və eksperimental `Media3Compose`-i təqdim edir.
ExoPlayer adi media pleyerdən kənara çıxan geniş funksiyalar dəsti təqdim edir. Əsas imkanlara bütün məşhur striminq protokollarının dəstəyi, çevik DRM sistemi, adaptiv bitrate dəyişdirmə (ABR) və oxutma analitika alətləri daxildir.
| Funksiya | Təsvir | Modul |
|---|---|---|
| DASH | MPEG standartı üzrə adaptiv striminq | exoplayer-dash |
| HLS | Apple-dan HTTP Live Streaming | exoplayer-hls |
| SmoothStreaming | Microsoft-dan adaptiv striminq | exoplayer-smoothstreaming |
| RTSP | Canlı yayım üçün Real-Time Streaming Protocol | exoplayer-rtsp |
| Widevine | DRM məzmun qorunması | exoplayer-drm |
| Concatenation | Bir neçə media faylının birləşdirilməsi | exoplayer-core |
| Ads | Reklam üçün IMA SDK inteqrasiyası | exoplayer-ima |
ABR (Adaptive Bitrate) ExoPlayer-də AdaptiveTrackSelection interfeysi vasitəsilə reallaşdırılmışdır. Standart olaraq AdaptiveTrackSelectionFactory istifadə olunur, o DefaultAdaptiveTrackSelection yaradır — şəbəkə ötürmə qabiliyyəti və bufer ölçüsünü nəzərə alan balanslaşdırılmış alqoritm. Xüsusi ssenarilər üçün alternativ tətbiqlər qoşula bilər: BOLA (keçidləri minimuma endirmə), RandomAdaptiveTrackSelection (test) və ya TrackSelection interfeysi vasitəsilə öz tətbiqiniz.
BandwidthMeter — şəbəkə ötürmə qabiliyyətini ölçmək üçün başqa bir əsas komponentdir. Standart olaraq DefaultBandwidthMeter istifadə olunur, o pleyerin bütün HTTP sorğuları üzrə statistika toplayır. Tərtibatçı onu əlavə amilləri nəzərə almaq üçün genişləndirə bilər: şəbəkə növü (Wi-Fi, 4G, 5G), hücrə siqnalı və ya istifadəçi üçün trafik dəyəri.
ExoPlayer Widevine (L1, L3), PlayReady və ClearKey DRM-ni dəstəkləyir. Lisenziyanın alınması lisenziya serveri ilə qarşılıqlı əlaqədə olan DrmSessionManager vasitəsilə konfiqurasiya olunur. Premium video (4K HDR) üçün Widevine L1 aparat dəstəyi tələb olunur ki, bu da çip səviyyəsində qorunma təmin edir və ekranın ələ keçirilməsinin qarşısını alır. DRM sisteminin seçimi hədəf platformadan asılıdır: Widevine Android və Chromecast-də, PlayReady Xbox və Windows-da, FairPlay iOS və Apple TV-də istifadə olunur. ExoPlayer MPD faylı əsasında mövcud DRM sistemini avtomatik müəyyən edir və əsas ssenarilər üçün əl ilə konfiqurasiya tələb etmir.
ExoPlayer-in Android layihəsinə qoşulması Gradle asılılıqları vasitəsilə həyata keçirilir. 2.19 versiyasından etibarən ExoPlayer AndroidX Media (androidx.media3) tərkibinə daxildir ki, bu da Jetpack Compose və digər AndroidX komponentləri ilə uyğunluğu təmin edir. Kotlin-də addım-addım inteqrasiyanı nəzərdən keçirək.
build.gradle (Module) faylına ExoPlayer modullarını əlavə edin. Minimum dəst core, ui və tələb olunan striminq protokolu üçün modulu əhatə edir. DASH məzmununu oxutmaq üçün exoplayer-dash, HLS üçün exoplayer-hls tələb olunur.
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 və ya Fragment-də pleyerin yaradılması və quraşdırılması. ExoPlayer video və daxili idarəetmə elementlərini göstərmək üçün PlayerView (və ya fərdiləşdirmə üçün StyledPlayerView) istifadə edir. Minimum konfiqurasiya ExoPlayer.Builder vasitəsilə pleyerin yaradılması və mənbə URI ilə MediaItem-in ötürülməsini əhatə edir.
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()
}
}
İstehsalat tətbiqləri üçün mümkün oxutma səhvlərinin idarə edilməsi zəruridir: şəbəkə nasazlıqları, dəstəklənməyən formatlar, DRM lisenziyalaşdırma səhvləri. ExoPlayer onPlayerError, onPlaybackStateChanged və onPlayWhenReadyChanged metodları ilə Player.Listener interfeysini təqdim edir. Təkrar etmə imkanı ilə istifadəçiyə məlumatlandırıcı səhv mesajları göstərmək tövsiyə olunur.
ExoPlayer ilə daxili MediaPlayer arasında seçim Android tətbiqlərinin hazırlanmasında geniş yayılmış sualdır. MediaPlayer Android SDK-nın 1.0 versiyasından etibarən hissəsidir, ExoPlayer isə Gradle vasitəsilə qoşulma tələb edən kitabxanadır. Onların fərqlərini əsas meyarlar üzrə nəzərdən keçirək.
| Meyar | ExoPlayer | MediaPlayer |
|---|---|---|
| Memarlıq | Modul, tamamilə Java/Kotlin-də | Sistem C++ komponentləri üzərində qat |
| Striminq | DASH, HLS, SmoothStreaming, RTSP | Yalnız yerli fayllar və HLS (Android 9+) |
| Fərdiləşdirmə | Tam (hər komponent dəyişdirilə bilər) | Minimal (yalnız parametrlər) |
| Yeniləmələr | Google Play və ya APK vasitəsilə (OS-dən asılı deyil) | Yalnız Android yeniləməsi (OTA) ilə |
| APK ölçüsü | +1-3 MB (modullardan asılı olaraq) | 0 (OS hissəsi) |
| Min SDK | API 16+ (Android 4.1) | API 1+ |
| DRM | Widevine, PlayReady, ClearKey | Widevine (məhdud) |
ExoPlayer üstündür striminq (DASH, HLS), UI fərdiləşdirmə, DRM dəstəyi və Android versiyasından asılı olmama tələb edən ssenarilərdə. MediaPlayer APK ölçüsünün kritik olduğu və adaptiv striminq tələblərinin olmadığı yerli media fayllarını oxudan sadə tətbiqlər üçün uyğundur. Şəbəkədən məzmunu olan müasir tətbiqlər üçün ExoPlayer birmənalı seçimdir.
İstisna — minimal SDK-sı API 16-dan (Android 4.1) aşağı olan tətbiqlər, bunlar bazarda praktiki olaraq qalmayıb. targetSdk 33+ və minimal SDK 21+ olan bütün tətbiqlər üçün ExoPlayer yalnız üstünlük deyil, həm də AV1 və Dolby Vision kimi müasir formatları müvafiq genişləndirmələr vasitəsilə dəstəkləmək üçün zəruridir.
İstehsalat tətbiqləri üçün əsas ExoPlayer inteqrasiyası tez-tez əlavə quraşdırma tələb edir: keşləşdirmənin idarə edilməsi, mobil şəbəkələr üçün buferləşdirmənin optimallaşdırılması, analitika ilə inteqrasiya və audio treklərin seçiminin fərdiləşdirilməsi. Qabaqcıl istifadə ssenarilərini nəzərdən keçirək.
CacheDataSourceFactory yüklənmiş seqmentləri yerli yaddaşda keşləşdirməyə imkan verir ki, bu da təkrar izləmə zamanı trafikə qənaət edir və oflayn oxutmanı təmin edir. ExoPlayer exoplayer-cas kitabxanasından SimpleCache istifadə edir — LRU evakuasiyası və ölçü limitləri dəstəyi ilə fayl keşləşdirməsi.
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 tətbiqlərdə Wi-Fi və mobil şəbəkə arasında keçidin idarə edilməsi vacibdir. ExoPlayer şəbəkə vəziyyətini izləmək üçün ConnectivityManager təqdim edir. Əlaqə itkisi zamanı pleyeri dayandırmaq yox, mövqeyi qorumaqla PAUSED vəziyyətinə keçirmək tövsiyə olunur. Əlaqə bərpa edildikdən sonra seqmentlərin yenidən yüklənməsi ilə oxutmanı davam etdirin.
AndroidX Media3-ün buraxılması ilə kitabxana Jetpack Compose üçün eksperimental dəstək əldə etmişdir. `AndroidView` komponenti SurfaceView və ya PlayerView-i bükərək Compose iyerarxiyası ilə uyğunluğu təmin edir. Daha dərin inteqrasiya üçün `androidx.media3:media3-ui-compose` kitabxanası istifadə olunur, o Compose-uyumlu pleyer idarəetmə elementlərini təqdim edir.
@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 verilən suallar
ExoPlayer Android API 16+ (Android 4.1 Jelly Bean) dəstəkləyir. Lakin fMP4 seqmentləri ilə DASH və HLS üçün API 21+ (Android 5.0 Lollipop) tövsiyə olunur. DRM modulları (Widevine) API 19+ tələb edir, HEVC aparat dekodlaşdırması isə API 21-dən etibarən mövcuddur.
Bəli, ExoPlayer audio üçün əladır. Yalnız səs oxutmaq üçün SurfaceView və ya PlayerView tələb olunmur. ExoPlayer avtomatik audio renderer seçəcək və fon rejimində işləyəcək. Fon oxutması üçün sistem idarəetmə elementləri ilə inteqrasiya üçün MediaSessionService istifadə etmək tövsiyə olunur.
TrackSelector ExoPlayer-də audio treklərin seçimini idarə edir. Keçid üçün player.getCurrentTracks().groups və player.setTrackSelectionParameters() istifadə edin, üstünlük verilən audio dilini göstərin. Çoxsaylı audio trekləri olan DASH və HLS strimləri üçün keçid oxutmanı kəsmədən baş verir.
Bəli, ExoPlayer daxili (MP4, WebM konteynerində) və xarici altyazıları TTML, SRT, VTT və CEA-608 formatlarında dəstəkləyir. Xarici altyazılar üçün SingleSampleMediaSource və ya video axını ilə birləşdirmək üçün MergingMediaSource istifadə olunur. Stilizə olunmuş altyazıların göstərilməsi CaptionStyleCompat vasitəsilə konfiqurasiya olunur.
Aşağı Gecikmə striminqi üçün LoadControl-u daha kiçik hədəf bufer dəyərləri ilə konfiqurasiya edin: HLS LL və DASH LL üçün DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) istifadə edin. Həmçinin canlı yayımdan geri qaldıqda buferin sürətləndirilmiş doldurulması üçün minPlaybackSpeed = 1.02 təyin edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun