ExoPlayer: wat is het, mogelijkheden en configuratie

Auteur: IT Sectr Gepubliceerd: 2026-05-23 Leestijd: 8 min

ExoPlayer is een open-source mediaspelerbibliotheek voor Android, ontwikkeld door Google als alternatief voor de ingebouwde MediaPlayer. ExoPlayer biedt audio- en videoweergave in verschillende formaten, waaronder DASH, HLS, SmoothStreaming en gewone mediabestanden, via een uniforme API met ondersteuning voor adaptieve streaming. Volgens Google I/O (2024) wordt ExoPlayer gebruikt in meer dan 60.000 Android-apps, waaronder YouTube, Google TV en Netflix.

Belangrijkste punten

  • ExoPlayer is een open-source mediaspelerbibliotheek voor Android van Google.
  • Cross-platform formaten — ExoPlayer ondersteunt DASH, HLS, SmoothStreaming en RTSP via een modulair extensiesysteem.
  • Aanpassing — elk component van de speler (renderer, gegevensbron, DRM) kan worden vervangen door een eigen implementatie.
  • Canvas en Compose — ExoPlayer integreert zowel met de traditionele View-benadering (SurfaceView) als met Jetpack Compose.
  • DRM — ondersteuning voor Widevine, PlayReady en ClearKey via een modulair DRM-systeem.

Wat is ExoPlayer?

ExoPlayer is een bibliotheek voor multimediaweergave op Android met open-source code (Apache 2.0), waarvan de eerste versie in 2014 door Google werd uitgebracht. In tegenstelling tot de ingebouwde MediaPlayer, die een dunne laag rond de systeemmediacodec (MediaCodec) is, is ExoPlayer volledig op Java/Kotlin-niveau geïmplementeerd, waardoor ontwikkelaars volledige controle hebben over elke fase van de weergave.

Architectonisch is ExoPlayer gebouwd op het modulaire principe: elk aspect van weergave wordt geïmplementeerd door een afzonderlijk component. De hoofdmodule (exoplayer-core) bevat de speler, renderers, trackselectors en bufferbeheer. Extra modules (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) voegen ondersteuning toe voor de respectievelijke streamingprotocollen. Deze architectuur stelt apps in staat alleen de benodigde componenten aan te sluiten, waardoor de APK-grootte wordt geminimaliseerd.

ExoPlayer 2 (de huidige hoofdversie) werd uitgebracht in 2018 en bracht een ingrijpende herziening van de API: introductie van Player Interface, ondersteuning voor Compose via AndroidX Media3, verbeterde foutafhandeling en adaptieve algoritmen voor trackselectie. Vanaf versie 2.19 (2024) maakt ExoPlayer deel uit van de AndroidX Media-bibliotheek, wat integratie en updates via de standaard Android-afhankelijkheidsmanager vereenvoudigt.

Architectuur van ExoPlayer

De kern van ExoPlayer is het component ExoPlayerImpl, dat de levenscyclus van de weergave beheert. Het bevat MediaSource (mediabron), TrackSelector (trackselectie), LoadControl (bufferbeheer) en een lijst met Renderer (renderers voor video, audio, ondertiteling en metadata). Elk component kan worden vervangen door een eigen implementatie via Builder of fabrieksmethoden.

Voor videorendering gebruikt ExoPlayer SurfaceView, TextureView of SphericalSurfaceView (voor 360-graden video). De aanbevolen optie is SurfaceView, omdat het hardwareversnelling en minimaal energieverbruik biedt. Voor Jetpack Compose biedt de AndroidX Media3-bibliotheek het component `AndroidView`, dat SurfaceView omhult, en experimentele `Media3Compose` met native Compose-integratie.

Mogelijkheden van ExoPlayer

ExoPlayer biedt een breed scala aan functies die verder gaan dan een gewone mediaspeler. De belangrijkste mogelijkheden omvatten ondersteuning voor alle populaire streamingprotocollen, een flexibel DRM-systeem, adaptieve bitrate-switching (ABR) en analysehulpmiddelen voor weergave.

FunctieBeschrijvingModule
DASHAdaptieve streaming volgens MPEG-standaardexoplayer-dash
HLSHTTP Live Streaming van Appleexoplayer-hls
SmoothStreamingAdaptieve streaming van Microsoftexoplayer-smoothstreaming
RTSPReal-Time Streaming Protocol voor liveexoplayer-rtsp
WidevineDRM-bescherming van inhoudexoplayer-drm
ConcatenationSamenvoegen van meerdere mediabestandenexoplayer-core
AdsIMA SDK-integratie voor advertentiesexoplayer-ima

Adaptieve bitrate-switching

ABR (Adaptive Bitrate) in ExoPlayer is geïmplementeerd via de interface AdaptiveTrackSelection. Standaard wordt AdaptiveTrackSelectionFactory gebruikt, die DefaultAdaptiveTrackSelection creëert — een gebalanceerd algoritme dat rekening houdt met netwerkbandbreedte en buffergrootte. Voor specifieke scenario's kunnen alternatieve implementaties worden aangesloten: BOLA (minimalisatie van switches), RandomAdaptiveTrackSelection (testen) of een eigen implementatie via de interface TrackSelection.

BandwidthMeter is een ander belangrijk component dat verantwoordelijk is voor het meten van de netwerkbandbreedte. Standaard wordt DefaultBandwidthMeter gebruikt, die statistieken verzamelt van alle HTTP-verzoeken van de speler. De ontwikkelaar kan het uitbreiden om rekening te houden met extra factoren: netwerktype (Wi-Fi, 4G, 5G), signaal van de mobiele zendmast of verkeerskosten voor de gebruiker.

DRM en inhoudsbescherming

ExoPlayer ondersteunt Widevine (L1, L3), PlayReady en ClearKey DRM. Het verkrijgen van een licentie wordt geconfigureerd via DrmSessionManager, die communiceert met de licentieserver. Voor premium video (4K HDR) is hardwareondersteuning voor Widevine L1 vereist, die bescherming op chpniveau biedt en schermopname voorkomt. De keuze van het DRM-systeem hangt af van het doelplatform: Widevine wordt gebruikt op Android en Chromecast, PlayReady op Xbox en Windows, FairPlay op iOS en Apple TV. ExoPlayer bepaalt automatisch het beschikbare DRM-systeem op basis van het MPD-bestand en vereist geen handmatige configuratie voor basisscenario's.

ExoPlayer integreren in een Android-project

Het aansluiten van ExoPlayer op een Android-project gebeurt via Gradle-afhankelijkheden. Vanaf versie 2.19 maakt ExoPlayer deel uit van AndroidX Media (androidx.media3), wat compatibiliteit met Jetpack Compose en andere AndroidX-componenten garandeert. Laten we de stapsgewijze integratie in Kotlin bekijken.

Afhankelijkheden toevoegen

Voeg de ExoPlayer-modules toe aan het build.gradle-bestand (Module). De minimale set omvat core, ui en de module voor het vereiste streamingprotocol. Voor het afspelen van DASH-inhoud is exoplayer-dash nodig, voor 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"
}

Basisintegratie in Activity

Het maken en configureren van de speler in Activity of Fragment. ExoPlayer gebruikt PlayerView (of StyledPlayerView voor aanpassing) voor het weergeven van video en ingebouwde bedieningselementen. De minimale configuratie omvat het maken van de speler via ExoPlayer.Builder en het doorgeven van een MediaItem met de bron-URI.

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

Fout- en statusafhandeling

Voor productie-apps is afhandeling van mogelijke weergavefouten noodzakelijk: netwerkstoringen, niet-ondersteunde formaten, DRM-licentiefouten. ExoPlayer biedt de interface Player.Listener met methoden onPlayerError, onPlaybackStateChanged en onPlayWhenReadyChanged. Het wordt aanbevolen om informatieve foutmeldingen aan de gebruiker te tonen met de mogelijkheid om het opnieuw te proberen.

ExoPlayer versus MediaPlayer: vergelijking

De keuze tussen ExoPlayer en de ingebouwde MediaPlayer is een veelgestelde vraag bij het ontwikkelen van Android-apps. MediaPlayer maakt sinds versie 1.0 deel uit van de Android SDK, terwijl ExoPlayer een bibliotheek is die via Gradle moet worden aangesloten. Laten we de verschillen op basis van belangrijke criteria bekijken.

CriteriumExoPlayerMediaPlayer
ArchitectuurModulair, volledig in Java/KotlinLaag over systeem C++-componenten
StreamingDASH, HLS, SmoothStreaming, RTSPAlleen lokale bestanden en HLS (Android 9+)
AanpassingVolledig (elk component vervangbaar)Minimaal (alleen parameters)
UpdatesVia Google Play of APK (onafhankelijk van OS)Alleen via Android-update (OTA)
APK-grootte+1-3 MB (afhankelijk van modules)0 (deel van het systeem)
Min SDKAPI 16+ (Android 4.1)API 1+
DRMWidevine, PlayReady, ClearKeyWidevine (beperkt)

ExoPlayer wint in scenario's die streaming (DASH, HLS), UI-aanpassing, DRM-ondersteuning en onafhankelijkheid van de Android-versie vereisen. MediaPlayer is geschikt voor eenvoudige apps die lokale mediabestanden afspelen, waar de APK-grootte kritiek is en er geen vereisten zijn voor adaptieve streaming. Voor moderne apps met inhoud uit het netwerk is ExoPlayer de duidelijke keuze.

Uitzondering — apps met een minimale SDK lager dan API 16 (Android 4.1), die praktisch niet meer bestaan op de markt. Voor alle apps met targetSdk 33+ en minimale SDK 21+ is ExoPlayer niet alleen de voorkeur, maar ook noodzakelijk voor ondersteuning van moderne formaten zoals AV1 en Dolby Vision via de juiste extensies.

Geavanceerde configuratie van ExoPlayer

Voor productie-apps vereist de basisintegratie van ExoPlayer vaak extra configuratie: cachebeheer, optimalisatie van buffering voor mobiele netwerken, integratie met analyse en aanpassing van audioselectie. Laten we geavanceerde gebruiksscenario's bekijken.

Inhoud cachen

CacheDataSourceFactory maakt het mogelijk gedownloade segmenten in lokale opslag te cachen, wat verkeer bespaart bij herhaald bekijken en offline weergave mogelijk maakt. ExoPlayer gebruikt SimpleCache uit de bibliotheek exoplayer-cas — bestandscaching met ondersteuning voor LRU-evacuatie en groottelimieten.

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

Netwerkschakeling afhandelen

In mobiele apps is afhandeling van schakeling tussen Wi-Fi en mobiel netwerk cruciaal. ExoPlayer biedt ConnectivityManager voor het volgen van de netwerkstatus. Bij verlies van verbinding wordt aanbevolen de speler niet te stoppen, maar naar de status PAUSED te schakelen met behoud van positie. Na herstel van de verbinding de weergave hervatten met herladen van segmenten.

Integratie met Jetpack Compose

Met de release van AndroidX Media3 heeft de bibliotheek experimentele ondersteuning gekregen voor Jetpack Compose. Het component `AndroidView` omhult SurfaceView of PlayerView en zorgt voor compatibiliteit met de Compose-hiërarchie. Voor diepere integratie wordt de bibliotheek `androidx.media3:media3-ui-compose` gebruikt, die Compose-compatibele bedieningselementen voor de speler biedt.

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

Veelgestelde vragen

Wat is de minimale Android-versie voor ExoPlayer?

ExoPlayer ondersteunt Android API 16+ (Android 4.1 Jelly Bean). Voor DASH en HLS met fMP4-segmenten wordt echter API 21+ (Android 5.0 Lollipop) aanbevolen. DRM-modules (Widevine) vereisen API 19+, en hardwarematige HEVC-decodering is beschikbaar vanaf API 21.

Kan ik ExoPlayer gebruiken voor audio zonder video?

Ja, ExoPlayer is uitstekend geschikt voor audio. Voor het afspelen van alleen geluid is geen SurfaceView of PlayerView nodig. ExoPlayer selecteert automatisch een audio-renderer en werkt op de achtergrond. Voor achtergrondweergave wordt aanbevolen MediaSessionService te gebruiken voor integratie met systeembediening.

Hoe schakel ik tussen audiosporen in ExoPlayer?

TrackSelector in ExoPlayer beheert de selectie van audiosporen. Gebruik player.getCurrentTracks().groups en player.setTrackSelectionParameters() met opgave van de gewenste audiotaal om te schakelen. Voor DASH- en HLS-streams met meerdere audiosporen gebeurt schakelen zonder onderbreking van de weergave.

Ondersteunt ExoPlayer ondertiteling?

Ja, ExoPlayer ondersteunt ingebouwde (in MP4-, WebM-container) en externe ondertiteling in de formaten TTML, SRT, VTT en CEA-608. Voor externe ondertiteling wordt SingleSampleMediaSource of MergingMediaSource gebruikt om te combineren met de videostream. Weergave van gestileerde ondertiteling wordt geconfigureerd via CaptionStyleCompat.

Hoe verminder ik de latentie bij livestreaming in ExoPlayer?

Configureer voor Low-Latency streaming LoadControl met kleinere buffervisierwaarden: gebruik DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) voor HLS LL en DASH LL. Stel ook minPlaybackSpeed = 1.02 in voor versneld vullen van de buffer bij achterlopen op de live-uitzending.

Samenvatting

  • ExoPlayer — open-source mediaspelerbibliotheek van Google met modulaire architectuur en volledige aanpassing.
  • Adaptieve streaming — ondersteunt DASH, HLS, SmoothStreaming en RTSP via een modulair extensiesysteem.
  • DRM — Widevine, PlayReady en ClearKey worden geïntegreerd via de module exoplayer-drm met een uniforme API.
  • Caching — SimpleCache zorgt voor offline weergave en verkeersbesparing bij herhaald kijken.
  • Compose — vanaf AndroidX Media3 integreert ExoPlayer met Jetpack Compose via AndroidView.
  • Aanpassing — elk component (MediaSource, TrackSelector, LoadControl, Renderer) kan worden vervangen.
  • Aanbevolen — gebruik ExoPlayer voor alle projecten die streaming, DRM of aanpassing van weergave vereisen.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook