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 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 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.
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ás | Modul |
|---|---|---|
| DASH | Adaptív streaming MPEG szabvány szerint | exoplayer-dash |
| HLS | HTTP Live Streaming az Apple-től | exoplayer-hls |
| SmoothStreaming | Adaptív streaming a Microsoft-tól | exoplayer-smoothstreaming |
| RTSP | Real-Time Streaming Protocol élő adáshoz | exoplayer-rtsp |
| Widevine | DRM tartalomvédelem | exoplayer-drm |
| Concatenation | Több médiafájl összefűzése | exoplayer-core |
| Ads | IMA SDK integráció reklámokhoz | exoplayer-ima |
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.
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 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.
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.
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"
}
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.
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()
}
}
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.
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érium | ExoPlayer | MediaPlayer |
|---|---|---|
| Architektúra | Moduláris, teljes egészében Java/Kotlin | Réteg a rendszer C++ komponensei fölött |
| Streaming | DASH, HLS, SmoothStreaming, RTSP | Csak helyi fájlok és HLS (Android 9+) |
| Testreszabás | Teljes (minden komponens cserélhető) | Minimális (csak paraméterek) |
| Frissítések | Google 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 SDK | API 16+ (Android 4.1) | API 1+ |
| DRM | Widevine, PlayReady, ClearKey | Widevine (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.
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.
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.
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()
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.
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.
@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
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.
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.
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.
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ó.
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ó
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.
Olvassa el is