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 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.
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.
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.
| Functie | Beschrijving | Module |
|---|---|---|
| DASH | Adaptieve streaming volgens MPEG-standaard | exoplayer-dash |
| HLS | HTTP Live Streaming van Apple | exoplayer-hls |
| SmoothStreaming | Adaptieve streaming van Microsoft | exoplayer-smoothstreaming |
| RTSP | Real-Time Streaming Protocol voor live | exoplayer-rtsp |
| Widevine | DRM-bescherming van inhoud | exoplayer-drm |
| Concatenation | Samenvoegen van meerdere mediabestanden | exoplayer-core |
| Ads | IMA SDK-integratie voor advertenties | exoplayer-ima |
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.
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.
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.
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.
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"
}
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.
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()
}
}
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.
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.
| Criterium | ExoPlayer | MediaPlayer |
|---|---|---|
| Architectuur | Modulair, volledig in Java/Kotlin | Laag over systeem C++-componenten |
| Streaming | DASH, HLS, SmoothStreaming, RTSP | Alleen lokale bestanden en HLS (Android 9+) |
| Aanpassing | Volledig (elk component vervangbaar) | Minimaal (alleen parameters) |
| Updates | Via 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 SDK | API 16+ (Android 4.1) | API 1+ |
| DRM | Widevine, PlayReady, ClearKey | Widevine (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.
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.
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.
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()
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.
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.
@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
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.
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.
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.
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.
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
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.
Lees ook