ExoPlayer: bu nədir, imkanları və quraşdırılması

Müəllif: IT Sectr Dərc olunub: 2026-05-23 Oxuma vaxtı: 8 dəq

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 — Google-dan Android üçün açıq mənbə kodu ilə media pleyer kitabxanasıdır.
  • Platformalararası formatlar — ExoPlayer modul genişləndirmə sistemi vasitəsilə DASH, HLS, SmoothStreaming və RTSP-ni dəstəkləyir.
  • Fərdiləşdirmə — pleyerin hər bir komponenti (renderer, məlumat mənbəyi, DRM) öz tətbiqinizlə əvəz edilə bilər.
  • Canvas və Compose — ExoPlayer həm ənənəvi View yanaşması (SurfaceView), həm də Jetpack Compose ilə inteqrasiya olunur.
  • DRM — modul DRM sistemi vasitəsilə Widevine, PlayReady və ClearKey dəstəyi.

ExoPlayer nədir?

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 memarlığı

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-in imkanları

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.

FunksiyaTəsvirModul
DASHMPEG standartı üzrə adaptiv striminqexoplayer-dash
HLSApple-dan HTTP Live Streamingexoplayer-hls
SmoothStreamingMicrosoft-dan adaptiv striminqexoplayer-smoothstreaming
RTSPCanlı yayım üçün Real-Time Streaming Protocolexoplayer-rtsp
WidevineDRM məzmun qorunmasıexoplayer-drm
ConcatenationBir neçə media faylının birləşdirilməsiexoplayer-core
AdsReklam üçün IMA SDK inteqrasiyasıexoplayer-ima

Adaptiv bitrate dəyişdirmə

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.

DRM və məzmun qorunması

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-i Android layihəsinə necə inteqrasiya etmək olar

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.

Asılılıqların qoşulması

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.

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

Activity-də əsas inteqrasiya

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.

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

Səhv və vəziyyətlərin idarə edilməsi

İ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 vs MediaPlayer: müqayisə

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.

MeyarExoPlayerMediaPlayer
MemarlıqModul, tamamilə Java/Kotlin-dəSistem C++ komponentləri üzərində qat
StriminqDASH, HLS, SmoothStreaming, RTSPYalnı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ərGoogle 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 SDKAPI 16+ (Android 4.1)API 1+
DRMWidevine, PlayReady, ClearKeyWidevine (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.

ExoPlayer-in qabaqcıl quraşdırılması

İ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.

Məzmunun keşləşdirilməsi

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.

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

Şəbəkə dəyişmənin idarə edilməsi

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.

Jetpack Compose ilə inteqrasiya

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.

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

Tez-tez verilən suallar

ExoPlayer üçün minimum Android versiyası nədir?

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.

ExoPlayer-i video olmadan yalnız audio üçün istifadə etmək olar?

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.

ExoPlayer-də audio treklər arasında necə keçid etmək olar?

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.

ExoPlayer altyazıları dəstəkləyir?

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.

ExoPlayer-də canlı yayım gecikməsini necə azaltmaq olar?

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ə

  • ExoPlayer — Google-dan modul memarlığı və tam fərdiləşdirmə ilə açıq mənbəli media pleyer kitabxanası.
  • Adaptiv striminq — modul genişləndirmə sistemi vasitəsilə DASH, HLS, SmoothStreaming və RTSP-ni dəstəkləyir.
  • DRM — Widevine, PlayReady və ClearKey vahid API ilə exoplayer-drm modulu vasitəsilə inteqrasiya olunur.
  • Keşləşdirmə — SimpleCache oflayn oxutma və təkrar izləmələrdə trafikə qənaət təmin edir.
  • Compose — AndroidX Media3-dən etibarən ExoPlayer AndroidView vasitəsilə Jetpack Compose ilə inteqrasiya olunur.
  • Fərdiləşdirmə — hər bir komponent (MediaSource, TrackSelector, LoadControl, Renderer) dəyişdirilə bilər.
  • Tövsiyə olunur — striminq, DRM və ya oxutma fərdiləşdirməsi tələb edən bütün layihələr üçün ExoPlayer istifadə edin.

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.

Layihəni müzakirə et

Həm də oxuyun