ExoPlayer: mi ez, funkciók és beállítás

Szerző: IT Sectr Megjelenés: 2026-05-23 Olvasási idő: 8 perc

Az ExoPlayer egy nyílt forráskódú médialejátszó könyvtár Androidra, amelyet a Google fejlesztett a beépített MediaPlayer alternatívájaként. Az ExoPlayer audio és video lejátszást biztosít különböző formátumokban, beleértve a DASH, HLS, SmoothStreaming és szokásos médiafájlokat, egységes API-n keresztül adaptív streaming támogatással. A Google I/O (2024) szerint az ExoPlayert több mint 60 000 Android-alkalmazás használja, beleértve a YouTube-ot, a Google TV-t és a Netflixet.

Főbb pontok

  • ExoPlayer egy nyílt forráskódú médialejátszó könyvtár Androidra a Google-tól.
  • Platformfüggetlen formátumok — az ExoPlayer támogatja a DASH, HLS, SmoothStreaming és RTSP protokollokat moduláris kiterjesztési rendszeren keresztül.
  • Testreszabás — a lejátszó minden komponense (renderelő, adatforrás, DRM) saját implementációra cserélhető.
  • Canvas és Compose — az ExoPlayer integrálható a hagyományos View megközelítéssel (SurfaceView) és a Jetpack Compose-zal is.
  • DRM — Widevine, PlayReady és ClearKey támogatás moduláris DRM-rendszeren keresztül.

Mi az ExoPlayer?

ExoPlayer egy multimédia lejátszó könyvtár Androidra nyílt forráskóddal (Apache 2.0), amelynek első verzióját a Google 2014-ben adta ki. A beépített MediaPlayerrel ellentétben, amely egy vékony réteg a rendszer média kodek (MediaCodec) fölött, az ExoPlayer teljes egészében Java/Kotlin szinten van implementálva, ami teljes ellenőrzést biztosít a fejlesztőknek a lejátszás minden szakasza felett.

Architektúráját tekintve az ExoPlayer moduláris elven épül: a lejátszás minden aspektusát külön komponens valósítja meg. A fő modul (exoplayer-core) tartalmazza a lejátszót, a renderelőket, a sávválasztókat és a pufferkezelést. A kiegészítő modulok (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) hozzáadják a megfelelő streaming protokollok támogatását. Ez az architektúra lehetővé teszi az alkalmazások számára, hogy csak a szükséges komponenseket csatlakoztassák, minimalizálva az APK méretét.

ExoPlayer 2 (a jelenlegi főverzió) 2018-ban jelent meg, és alapvető API-átdolgozást hozott: a Player Interface bevezetését, a Compose támogatását AndroidX Media3-on keresztül, továbbfejlesztett hibakezelést és adaptív sávválasztó algoritmusokat. A 2.19-es verziótól (2024) kezdve az ExoPlayer az AndroidX Media könyvtár részévé vált, ami egyszerűsítette az integrációt és a frissítést a szabványos Android függőségkezelőn keresztül.

Az ExoPlayer architektúrája

Az ExoPlayer középpontjában az ExoPlayerImpl komponens áll, amely a lejátszás életciklusát kezeli. Tartalmazza a MediaSource-t (médiaforrás), a TrackSelector-t (sávválasztás), a LoadControl-t (pufferelés kezelése) és a Renderer-ek listáját (video, audio, felirat és metaadat renderelők). Minden komponens saját implementációra cserélhető Builder vagy gyártási metódusok segítségével.

Videó megjelenítéséhez az ExoPlayer SurfaceView-t, TextureView-t vagy SphericalSurfaceView-t (360 fokos videóhoz) használ. Az ajánlott opció a SurfaceView, mivel hardveres gyorsítást és minimális energiafogyasztást biztosít. A Jetpack Compose-hoz az AndroidX Media3 könyvtár biztosítja az `AndroidView` komponenst, amely becsomagolja a SurfaceView-t, és a kísérleti `Media3Compose`-t natív Compose-integrációval.

Az ExoPlayer funkciói

ExoPlayer széles funkciókészletet kínál, amely túlmutat a szokásos médialejátszón. A fő funkciók közé tartozik az összes népszerű streaming protokoll támogatása, rugalmas DRM-rendszer, adaptív bitrate váltás (ABR) és lejátszási analitikai eszközök.

FunkcióLeírásModul
DASHAdaptív streaming MPEG szabvány szerintexoplayer-dash
HLSHTTP Live Streaming az Apple-tőlexoplayer-hls
SmoothStreamingAdaptív streaming a Microsoft-tólexoplayer-smoothstreaming
RTSPReal-Time Streaming Protocol élő adáshozexoplayer-rtsp
WidevineDRM tartalomvédelemexoplayer-drm
ConcatenationTöbb médiafájl összefűzéseexoplayer-core
AdsIMA SDK integráció reklámokhozexoplayer-ima

Adaptív bitrate váltás

ABR (Adaptive Bitrate) az ExoPlayer-ben az AdaptiveTrackSelection interfészen keresztül van implementálva. Alapértelmezésben az AdaptiveTrackSelectionFactory kerül használatra, amely létrehozza a DefaultAdaptiveTrackSelection-t — egy kiegyensúlyozott algoritmust, amely figyelembe veszi a hálózati sávszélességet és a puffer méretét. Speciális forgatókönyvekhez alternatív implementációk csatlakoztathatók: BOLA (váltások minimalizálása), RandomAdaptiveTrackSelection (tesztelés) vagy saját implementáció a TrackSelection interfészen keresztül.

BandwidthMeter egy másik kulcsfontosságú komponens, amely a hálózati sávszélesség méréséért felelős. Alapértelmezésben a DefaultBandwidthMeter kerül használatra, amely statisztikákat gyűjt a lejátszó összes HTTP-kéréséből. A fejlesztő kiterjesztheti azt további tényezők figyelembevételére: hálózat típusa (Wi-Fi, 4G, 5G), cellatorony jele vagy a felhasználó forgalmi költsége.

DRM és tartalomvédelem

ExoPlayer támogatja a Widevine (L1, L3), PlayReady és ClearKey DRM-eket. A licenc megszerzése a DrmSessionManager-en keresztül konfigurálható, amely kommunikál a licencszerverrel. Prémium videóhoz (4K HDR) Widevine L1 hardvertámogatás szükséges, amely chipszintű védelmet biztosít és megakadályozza a képernyőrögzítést. A DRM-rendszer kiválasztása a célplatformtól függ: a Widevine-t Androidon és Chromecaston, a PlayReady-t Xboxon és Windows-on, a FairPlay-t iOS-en és Apple TV-n használják. Az ExoPlayer automatikusan meghatározza az elérhető DRM-rendszert az MPD-fájl alapján, és alapesetben nem igényel kézi konfigurációt.

Az ExoPlayer integrálása Android-projektbe

Az ExoPlayer Android-projekthez csatlakoztatása Gradle-függőségeken keresztül történik. A 2.19-es verziótól kezdve az ExoPlayer az AndroidX Media (androidx.media3) része, ami biztosítja a kompatibilitást a Jetpack Compose-zal és más AndroidX komponensekkel. Nézzük meg a lépésről lépésre történő integrációt Kotlin-ban.

Függőségek hozzáadása

Adja hozzá az ExoPlayer modulokat a build.gradle (Module) fájlhoz. A minimális készlet tartalmazza a core-t, ui-t és a szükséges streaming protokoll modulját. DASH-tartalom lejátszásához exoplayer-dash, HLS-hez exoplayer-hls szükséges.

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

Alapintegráció Activity-ben

A lejátszó létrehozása és konfigurálása Activity-ben vagy Fragment-ben. Az ExoPlayer PlayerView-t (vagy StyledPlayerView-t testreszabáshoz) használ a videó és a beépített vezérlők megjelenítéséhez. A minimális konfiguráció magában foglalja a lejátszó létrehozását az ExoPlayer.Builder segítségével és egy MediaItem átadását a forrás URI-jával.

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

Hibák és állapotok kezelése

Production alkalmazásokhoz szükséges a lehetséges lejátszási hibák kezelése: hálózati meghibásodások, nem támogatott formátumok, DRM-licencek hibái. Az ExoPlayer a Player.Listener interfészt biztosítja az onPlayerError, onPlaybackStateChanged és onPlayWhenReadyChanged metódusokkal. Javasolt információs hibaüzenetek megjelenítése a felhasználónak ismétlési lehetőséggel.

ExoPlayer kontra MediaPlayer: összehasonlítás

A választás ExoPlayer és a beépített MediaPlayer között gyakori kérdés Android-alkalmazások fejlesztésekor. A MediaPlayer az Android SDK része az 1.0-s verzió óta, míg az ExoPlayer egy könyvtár, amely Gradle-en keresztüli csatlakoztatást igényel. Nézzük meg a különbségeket kulcskritériumok alapján.

KritériumExoPlayerMediaPlayer
ArchitektúraModuláris, teljes egészében Java/KotlinRéteg a rendszer C++ komponensei fölött
StreamingDASH, HLS, SmoothStreaming, RTSPCsak helyi fájlok és HLS (Android 9+)
TestreszabásTeljes (minden komponens cserélhető)Minimális (csak paraméterek)
FrissítésekGoogle Play-en vagy APK-n keresztül (OS-től független)Csak Android-frissítéssel (OTA)
APK méret+1-3 MB (moduloktól függően)0 (a rendszer része)
Min SDKAPI 16+ (Android 4.1)API 1+
DRMWidevine, PlayReady, ClearKeyWidevine (korlátozott)

ExoPlayer nyer azokban a forgatókönyvekben, amelyek streaminget (DASH, HLS), UI-testreszabást, DRM-támogatást és Android-verziótól való függetlenséget igényelnek. A MediaPlayer egyszerű alkalmazásokhoz alkalmas, amelyek helyi médiafájlokat játszanak le, ahol az APK mérete kritikus és nincs szükség adaptív streamingre. Modern, hálózati tartalommal rendelkező alkalmazásokhoz az ExoPlayer egyértelmű választás.

Kivétel — az API 16 alatti (Android 4.1) minimális SDK-val rendelkező alkalmazások, amelyek gyakorlatilag már nem léteznek a piacon. Minden targetSdk 33+ és minimális SDK 21+ rendelkező alkalmazáshoz az ExoPlayer nem csak ajánlott, hanem szükséges a modern formátumok, mint az AV1 és Dolby Vision támogatásához a megfelelő kiterjesztéseken keresztül.

Az ExoPlayer haladó beállítása

Production alkalmazásokhoz az ExoPlayer alapintegrációja gyakran további beállítást igényel: gyorsítótár-kezelés, pufferelés optimalizálása mobilhálózatokhoz, analitikával való integráció és audiocsatornák kiválasztásának testreszabása. Nézzük meg a haladó használati forgatókönyveket.

Tartalom gyorsítótárazása

CacheDataSourceFactory lehetővé teszi a letöltött szegmensek helyi tárolását, ami forgalmat takarít meg ismételt nézéskor és offline lejátszást biztosít. Az ExoPlayer a SimpleCache-t használja az exoplayer-cas könyvtárból — fájl alapú gyorsítótárazás LRU-kiürítési támogatással és méretkorlátozásokkal.

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

Hálózatváltás kezelése

Mobilalkalmazásokban a Wi-Fi és a mobilhálózat közötti váltás kezelése kritikus. Az ExoPlayer ConnectivityManager-t biztosít a hálózati állapot követéséhez. Kapcsolat megszakadásakor javasolt nem leállítani a lejátszót, hanem PAUSED állapotba helyezni a pozíció megtartásával. A kapcsolat helyreállítása után folytassa a lejátszást a szegmensek újratöltésével.

Integráció Jetpack Compose-zal

Az AndroidX Media3 megjelenésével a könyvtár kísérleti támogatást kapott a Jetpack Compose-hoz. Az `AndroidView` komponens becsomagolja a SurfaceView-t vagy PlayerView-t, biztosítva a kompatibilitást a Compose-hierarchiával. Mélyebb integrációhoz az `androidx.media3:media3-ui-compose` könyvtár használatos, amely Compose-kompatibilis lejátszóvezérlőket biztosít.

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

Gyakran Ismételt Kérdések

Mi a minimális Android verzió az ExoPlayerhez?

ExoPlayer támogatja az Android API 16+ (Android 4.1 Jelly Bean) verziót. Azonban DASH és HLS fMP4 szegmensekkel történő használatához API 21+ (Android 5.0 Lollipop) ajánlott. A DRM-modulok (Widevine) API 19+ igényelnek, a hardveres HEVC dekódolás pedig API 21-től érhető el.

Használható az ExoPlayer csak audio lejátszásra videó nélkül?

Igen, az ExoPlayer kiválóan alkalmas audio lejátszásra. Csak hang lejátszásához nincs szükség SurfaceView-ra vagy PlayerView-ra. Az ExoPlayer automatikusan kiválaszt egy audio renderelőt és háttérben működik. Háttérlejátszáshoz javasolt a MediaSessionService használata a rendszer vezérlőkkel való integrációhoz.

Hogyan lehet váltani az audiocsatornák között az ExoPlayerben?

TrackSelector az ExoPlayerben kezeli az audiocsatornák kiválasztását. Váltáshoz használja a player.getCurrentTracks().groups és player.setTrackSelectionParameters() metódusokat a kívánt audionyelv megadásával. Több audiocsatornával rendelkező DASH és HLS streameknél a váltás a lejátszás megszakítása nélkül történik.

Támogatja az ExoPlayer a feliratokat?

Igen, az ExoPlayer támogatja a beépített (MP4, WebM konténerben) és külső feliratokat TTML, SRT, VTT és CEA-608 formátumokban. Külső feliratokhoz SingleSampleMediaSource vagy MergingMediaSource használatos a videó streammel való egyesítéshez. A stílusos feliratok megjelenítése CaptionStyleCompat segítségével konfigurálható.

Hogyan csökkenthető a késleltetés élő streamingnél az ExoPlayerben?

Alacsony késleltetésű streaminghez konfigurálja a LoadControl-t kisebb célpuffer-értékekkel: használja a DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) beállítást HLS LL és DASH LL esetén. Állítsa be a minPlaybackSpeed = 1.02 értéket is a puffer gyorsított feltöltéséhez, ha lemarad az élő közvetítéstől.

Összefoglaló

  • ExoPlayer — nyílt forráskódú médialejátszó könyvtár a Google-tól moduláris architektúrával és teljes testreszabással.
  • Adaptív streaming — támogatja a DASH, HLS, SmoothStreaming és RTSP protokollokat moduláris kiterjesztési rendszeren keresztül.
  • DRM — Widevine, PlayReady és ClearKey az exoplayer-drm modulon keresztül integrálódik egységes API-val.
  • Gyorsítótárazás — a SimpleCache offline lejátszást és forgalommegtakarítást biztosít ismételt nézéskor.
  • Compose — az AndroidX Media3-tól kezdve az ExoPlayer az AndroidView-n keresztül integrálódik a Jetpack Compose-zal.
  • Testreszabás — minden komponens (MediaSource, TrackSelector, LoadControl, Renderer) cserélhető.
  • Ajánlott — használja az ExoPlayert minden olyan projekthez, amely streaminget, DRM-et vagy lejátszás-testreszabást igényel.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is