ExoPlayer: co to je, možnosti a nastavení

Autor: IT Sectr Publikováno: 2026-05-23 Doba čtení: 8 min

ExoPlayer je otevřená knihovna multimediálního přehrávače pro Android, vyvinutá společností Google jako alternativa k vestavěnému MediaPlayer. ExoPlayer zajišťuje přehrávání audia a videa v různých formátech, včetně DASH, HLS, SmoothStreaming a běžných multimediálních souborů, prostřednictvím jednotného API s podporou adaptivního streamování. Podle Google I/O (2024) je ExoPlayer používán ve více než 60 000 aplikacích pro Android, včetně YouTube, Google TV a Netflix.

Hlavní body

  • ExoPlayer je knihovna multimediálního přehrávače s otevřeným zdrojovým kódem pro Android od Googlu.
  • Multiplatformní formáty — ExoPlayer podporuje DASH, HLS, SmoothStreaming a RTSP prostřednictvím modulárního systému rozšíření.
  • Přizpůsobení — každá komponenta přehrávače (renderer, zdroj dat, DRM) může být nahrazena vlastní implementací.
  • Canvas a Compose — ExoPlayer se integruje jak s tradičním přístupem View (SurfaceView), tak s Jetpack Compose.
  • DRM — podpora Widevine, PlayReady a ClearKey prostřednictvím modulárního DRM systému.

Co je ExoPlayer?

ExoPlayer je knihovna pro přehrávání multimédií na Androidu s otevřeným zdrojovým kódem (Apache 2.0), jejíž první verze byla vydána společností Google v roce 2014. Na rozdíl od vestavěného MediaPlayer, který je tenkou vrstvou nad systémovým multimediálním kodekem (MediaCodec), je ExoPlayer implementován zcela na úrovni Java/Kotlin, což dává vývojářům plnou kontrolu nad každou fází přehrávání.

Architektonicky je ExoPlayer postaven na modulárním principu: každý aspekt přehrávání je implementován samostatnou komponentou. Hlavní modul (exoplayer-core) obsahuje přehrávač, renderery, selektory stop a správu vyrovnávací paměti. Další moduly (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) přidávají podporu pro příslušné streamovací protokoly. Tato architektura umožňuje aplikacím připojit pouze potřebné komponenty, čímž se minimalizuje velikost APK.

ExoPlayer 2 (aktuální hlavní verze) byl vydán v roce 2018 a přinesl zásadní přepracování API: zavedení Player Interface, podporu Compose přes AndroidX Media3, vylepšené zpracování chyb a adaptivní algoritmy výběru stop. Od verze 2.19 (2024) se ExoPlayer stal součástí knihovny AndroidX Media, což zjednodušilo integraci a aktualizaci prostřednictvím standardního správce závislostí Android.

Architektura ExoPlayer

Základem ExoPlayer je komponenta ExoPlayerImpl, která spravuje životní cyklus přehrávání. Obsahuje MediaSource (zdroj médií), TrackSelector (výběr stop), LoadControl (správa bufferování) a seznam Renderer (renderery pro video, audio, titulky a metadata). Každá komponenta může být nahrazena vlastní implementací pomocí Builder nebo továrních metod.

Pro vykreslování videa používá ExoPlayer SurfaceView, TextureView nebo SphericalSurfaceView (pro 360° video). Doporučenou variantou je SurfaceView, protože poskytuje hardwarovou akceleraci a minimální spotřebu energie. Pro Jetpack Compose poskytuje knihovna AndroidX Media3 komponentu `AndroidView`, která obaluje SurfaceView, a experimentální `Media3Compose` s nativní integrací Compose.

Možnosti ExoPlayer

ExoPlayer nabízí širokou škálu funkcí, které přesahují běžný multimediální přehrávač. Hlavní možnosti zahrnují podporu všech populárních streamovacích protokolů, flexibilní DRM systém, adaptivní přepínání bitrate (ABR) a nástroje pro analýzu přehrávání.

FunkcePopisModul
DASHAdaptivní streamování dle standardu MPEGexoplayer-dash
HLSHTTP Live Streaming od Appleexoplayer-hls
SmoothStreamingAdaptivní streamování od Microsoftexoplayer-smoothstreaming
RTSPReal-Time Streaming Protocol pro živé vysíláníexoplayer-rtsp
WidevineOchrana obsahu DRMexoplayer-drm
ConcatenationSpojení několika multimediálních souborůexoplayer-core
AdsIntegrace IMA SDK pro reklamyexoplayer-ima

Adaptivní přepínání bitrate

ABR (Adaptive Bitrate) v ExoPlayer je implementován prostřednictvím rozhraní AdaptiveTrackSelection. Ve výchozím nastavení se používá AdaptiveTrackSelectionFactory, která vytváří DefaultAdaptiveTrackSelection — vyvážený algoritmus zohledňující šířku pásma sítě a velikost vyrovnávací paměti. Pro specifické scénáře lze připojit alternativní implementace: BOLA (minimalizace přepínání), RandomAdaptiveTrackSelection (testování) nebo vlastní implementace prostřednictvím rozhraní TrackSelection.

BandwidthMeter je další klíčová komponenta odpovědná za měření šířky pásma sítě. Ve výchozím nastavení se používá DefaultBandwidthMeter, který shromažďuje statistiky ze všech HTTP požadavků přehrávače. Vývojář jej může rozšířit, aby zohlednil další faktory: typ sítě (Wi-Fi, 4G, 5G), signál mobilní věže nebo náklady na provoz pro uživatele.

DRM a ochrana obsahu

ExoPlayer podporuje Widevine (L1, L3), PlayReady a ClearKey DRM. Získání licence se konfiguruje prostřednictvím DrmSessionManager, který komunikuje s licenčním serverem. Pro prémiové video (4K HDR) je vyžadována hardwarová podpora Widevine L1, která poskytuje ochranu na úrovni čipu a zabraňuje snímání obrazovky. Výběr DRM systému závisí na cílové platformě: Widevine se používá na Android a Chromecast, PlayReady na Xbox a Windows, FairPlay na iOS a Apple TV. ExoPlayer automaticky určuje dostupný DRM systém na základě souboru MPD a nevyžaduje ruční konfiguraci pro základní scénáře.

Jak integrovat ExoPlayer do Android projektu

Připojení ExoPlayer k Android projektu se provádí pomocí závislostí Gradle. Od verze 2.19 je ExoPlayer součástí AndroidX Media (androidx.media3), což zajišťuje kompatibilitu s Jetpack Compose a dalšími komponentami AndroidX. Podívejme se na integraci krok za krokem v Kotlin.

Přidání závislostí

Přidejte moduly ExoPlayer do souboru build.gradle (Module). Minimální sada zahrnuje core, ui a modul pro požadovaný streamovací protokol. Pro přehrávání obsahu DASH je vyžadován exoplayer-dash, pro HLS — exoplayer-hls.

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

Základní integrace v Activity

Vytvoření a konfigurace přehrávače v Activity nebo Fragment. ExoPlayer používá PlayerView (nebo StyledPlayerView pro přizpůsobení) k zobrazení videa a vestavěných ovládacích prvků. Minimální konfigurace zahrnuje vytvoření přehrávače pomocí ExoPlayer.Builder a předání MediaItem s URI zdroje.

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

Zpracování chyb a stavů

Pro produkční aplikace je nezbytné zpracování možných chyb přehrávání: síťové výpadky, nepodporované formáty, chyby DRM licencování. ExoPlayer poskytuje rozhraní Player.Listener s metodami onPlayerError, onPlaybackStateChanged a onPlayWhenReadyChanged. Doporučuje se zobrazovat uživateli informativní chybové zprávy s možností opakování.

ExoPlayer vs MediaPlayer: srovnání

Volba mezi ExoPlayer a vestavěným MediaPlayer je častá otázka při vývoji Android aplikací. MediaPlayer je součástí Android SDK od verze 1.0, zatímco ExoPlayer je knihovna vyžadující připojení přes Gradle. Podívejme se na jejich rozdíly podle klíčových kritérií.

KritériumExoPlayerMediaPlayer
ArchitekturaModulární, zcela v Java/KotlinVrstva nad systémovými C++ komponentami
StreamováníDASH, HLS, SmoothStreaming, RTSPPouze lokální soubory a HLS (Android 9+)
PřizpůsobeníPlné (každá komponenta zaměnitelná)Minimální (pouze parametry)
AktualizacePřes Google Play nebo APK (nezávisle na OS)Pouze přes aktualizaci Android (OTA)
Velikost APK+1-3 MB (v závislosti na modulech)0 (součást systému)
Min SDKAPI 16+ (Android 4.1)API 1+
DRMWidevine, PlayReady, ClearKeyWidevine (omezeně)

ExoPlayer vítězí ve scénářích vyžadujících streamování (DASH, HLS), přizpůsobení UI, podporu DRM a nezávislost na verzi Android. MediaPlayer je vhodný pro jednoduché aplikace přehrávající lokální multimediální soubory, kde je velikost APK kritická a nejsou požadavky na adaptivní streamování. Pro moderní aplikace s obsahem ze sítě je ExoPlayer jasnou volbou.

Výjimka — aplikace s minimální SDK nižší než API 16 (Android 4.1), které na trhu prakticky neexistují. Pro všechny aplikace s targetSdk 33+ a minimální SDK 21+ je ExoPlayer nejen preferovaný, ale také nezbytný pro podporu moderních formátů, jako jsou AV1 a Dolby Vision prostřednictvím příslušných rozšíření.

Pokročilé nastavení ExoPlayer

Pro produkční aplikace vyžaduje základní integrace ExoPlayer často další nastavení: správu cache, optimalizaci bufferování pro mobilní sítě, integraci s analytikou a přizpůsobení výběru audio stop. Podívejme se na pokročilé scénáře použití.

Cache obsahu

CacheDataSourceFactory umožňuje ukládat stažené segmenty do místního úložiště, což šetří provoz při opakovaném sledování a zajišťuje offline přehrávání. ExoPlayer používá SimpleCache z knihovny exoplayer-cas — ukládání do mezipaměti s podporou LRU vyřazování a omezení velikosti.

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

Zpracování přepínání sítě

V mobilních aplikacích je zpracování přepínání mezi Wi-Fi a mobilní sítí klíčové. ExoPlayer poskytuje ConnectivityManager pro sledování stavu sítě. Při ztrátě připojení se doporučuje nezastavovat přehrávač, ale přepnout jej do stavu PAUSED s uchováním pozice. Po obnovení připojení pokračujte v přehrávání s opětovným načtením segmentů.

Integrace s Jetpack Compose

Po vydání AndroidX Media3 získala knihovna experimentální podporu Jetpack Compose. Komponenta `AndroidView` obaluje SurfaceView nebo PlayerView a zajišťuje kompatibilitu s hierarchií Compose. Pro hlubší integraci se používá knihovna `androidx.media3:media3-ui-compose`, která poskytuje ovládací prvky přehrávače kompatibilní s Compose.

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

Často kladené otázky

Jaká je minimální verze Androidu pro ExoPlayer?

ExoPlayer podporuje Android API 16+ (Android 4.1 Jelly Bean). Pro DASH a HLS se segmenty fMP4 se však doporučuje API 21+ (Android 5.0 Lollipop). DRM moduly (Widevine) vyžadují API 19+ a hardwarové dekódování HEVC je dostupné od API 21.

Lze ExoPlayer použít pouze pro audio bez videa?

Ano, ExoPlayer je skvělý pro audio. Pro přehrávání pouze zvuku není vyžadován SurfaceView ani PlayerView. ExoPlayer automaticky vybere audio renderer a bude pracovat na pozadí. Pro přehrávání na pozadí se doporučuje použít MediaSessionService pro integraci s ovládacími prvky systému.

Jak přepínat mezi audio stopami v ExoPlayer?

TrackSelector v ExoPlayer spravuje výběr audio stop. Pro přepnutí použijte player.getCurrentTracks().groups a player.setTrackSelectionParameters() s uvedením preferovaného jazyka audia. Pro streamy DASH a HLS s několika audio stopami probíhá přepínání bez přerušení přehrávání.

Podporuje ExoPlayer titulky?

Ano, ExoPlayer podporuje vestavěné (v kontejneru MP4, WebM) i externí titulky ve formátech TTML, SRT, VTT a CEA-608. Pro externí titulky se používá SingleSampleMediaSource nebo MergingMediaSource pro spojení s videostreamem. Zobrazení stylizovaných titulků se konfiguruje pomocí CaptionStyleCompat.

Jak snížit latenci při živém streamování v ExoPlayer?

Pro Low-Latency streamování nakonfigurujte LoadControl s menšími cílovými hodnotami vyrovnávací paměti: použijte DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) pro HLS LL a DASH LL. Také nastavte minPlaybackSpeed = 1.02 pro zrychlené plnění vyrovnávací paměti při zpoždění za živým vysíláním.

Shrnutí

  • ExoPlayer — otevřená knihovna multimediálního přehrávače od Googlu s modulární architekturou a plným přizpůsobením.
  • Adaptivní streamování — podporuje DASH, HLS, SmoothStreaming a RTSP prostřednictvím modulárního systému rozšíření.
  • DRM — Widevine, PlayReady a ClearKey se integrují prostřednictvím modulu exoplayer-drm s jednotným API.
  • Cache — SimpleCache zajišťuje offline přehrávání a úsporu provozu při opakovaném sledování.
  • Compose — od AndroidX Media3 se ExoPlayer integruje s Jetpack Compose prostřednictvím AndroidView.
  • Přizpůsobení — každou komponentu (MediaSource, TrackSelector, LoadControl, Renderer) lze nahradit.
  • Doporučeno — používejte ExoPlayer pro všechny projekty vyžadující streamování, DRM nebo přizpůsobení přehrávání.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také