ExoPlayer: vad är det, funktioner och konfiguration

Författare: IT Sectr Publicerad: 2026-05-23 Lästid: 8 min

ExoPlayer är ett bibliotek med öppen källkod för mediaspelare på Android, utvecklat av Google som ett alternativ till den inbyggda MediaPlayer. ExoPlayer erbjuder uppspelning av ljud och video i olika format, inklusive DASH, HLS, SmoothStreaming och vanliga mediafiler, via ett enhetligt API med stöd för adaptiv streaming. Enligt Google I/O (2024) används ExoPlayer i över 60 000 Android-appar, inklusive YouTube, Google TV och Netflix.

Huvudpunkter

  • ExoPlayer är ett bibliotek med öppen källkod för mediaspelare på Android från Google.
  • Plattformsoberoende format — ExoPlayer stöder DASH, HLS, SmoothStreaming och RTSP via ett modulärt extensionssystem.
  • Anpassning — varje komponent i spelaren (renderare, datakälla, DRM) kan ersättas med en egen implementering.
  • Canvas och Compose — ExoPlayer integreras både med traditionell View-metod (SurfaceView) och med Jetpack Compose.
  • DRM — stöd för Widevine, PlayReady och ClearKey via ett modulärt DRM-system.

Vad är ExoPlayer?

ExoPlayer är ett bibliotek för multimediauppspelning på Android med öppen källkod (Apache 2.0), vars första version släpptes av Google 2014. Till skillnad från den inbyggda MediaPlayer, som är ett tunt lager ovanför systemets mediacodec (MediaCodec), är ExoPlayer helt implementerad på Java/Kotlin-nivå, vilket ger utvecklare full kontroll över varje steg i uppspelningen.

Arkitekturmässigt är ExoPlayer byggd på modulär princip: varje aspekt av uppspelningen implementeras av en separat komponent. Huvudmodulen (exoplayer-core) innehåller spelaren, renderare, spårväljare och buffert hantering. Ytterligare moduler (exoplayer-dash, exoplayer-hls, exoplayer-rtsp, exoplayer-smoothstreaming) lägger till stöd för respektive streamingprotokoll. Denna arkitektur gör att appar endast kan ansluta nödvändiga komponenter, vilket minimerar APK-storleken.

ExoPlayer 2 (nuvarande huvudversion) släpptes 2018 och medförde en genomgripande omarbetning av API:et: introduktion av Player Interface, stöd för Compose via AndroidX Media3, förbättrad felhantering och adaptiva algoritmer för spårval. Från och med version 2.19 (2024) blev ExoPlayer en del av AndroidX Media-biblioteket, vilket förenklade integration och uppdatering via den standardiserade Android-beroendehanteraren.

ExoPlayers arkitektur

I hjärtat av ExoPlayer finns komponenten ExoPlayerImpl, som hanterar uppspelningens livscykel. Den innehåller MediaSource (mediakälla), TrackSelector (spårval), LoadControl (buffert hantering) och en lista med Renderer (renderare för video, ljud, undertexter och metadata). Varje komponent kan ersättas med en egen implementering via Builder eller fabriksmetoder.

För videorendering använder ExoPlayer SurfaceView, TextureView eller SphericalSurfaceView (för 360-gradersvideo). Det rekommenderade alternativet är SurfaceView eftersom det ger hårdvaruacceleration och minimal energiförbrukning. För Jetpack Compose tillhandahåller AndroidX Media3-biblioteket komponenten `AndroidView`, som omsluter SurfaceView, och experimentella `Media3Compose` med inbyggd Compose-integration.

ExoPlayers funktioner

ExoPlayer erbjuder en bred uppsättning funktioner som går utöver en vanlig mediaspelare. Huvudfunktionerna inkluderar stöd för alla populära streamingprotokoll, ett flexibelt DRM-system, adaptiv bitrate-växling (ABR) och analysverktyg för uppspelning.

FunktionBeskrivningModul
DASHAdaptiv streaming enligt MPEG-standardexoplayer-dash
HLSHTTP Live Streaming från Appleexoplayer-hls
SmoothStreamingAdaptiv streaming från Microsoftexoplayer-smoothstreaming
RTSPReal-Time Streaming Protocol för liveexoplayer-rtsp
WidevineDRM-skydd av innehållexoplayer-drm
ConcatenationSammanslagning av flera mediafilerexoplayer-core
AdsIMA SDK-integration för annonserexoplayer-ima

Adaptiv bitrate-växling

ABR (Adaptive Bitrate) i ExoPlayer är implementerad via gränssnittet AdaptiveTrackSelection. Som standard används AdaptiveTrackSelectionFactory, som skapar DefaultAdaptiveTrackSelection — en balanserad algoritm som tar hänsyn till nätverksbandbredd och buffertstorlek. För specifika scenarier kan alternativa implementeringar anslutas: BOLA (minimering av växlingar), RandomAdaptiveTrackSelection (testning) eller en egen implementering via gränssnittet TrackSelection.

BandwidthMeter är en annan nyckelkomponent som ansvarar för att mäta nätverksbandbredd. Som standard används DefaultBandwidthMeter, som samlar in statistik från alla HTTP-förfrågningar från spelaren. Utvecklaren kan utöka den för att ta hänsyn till ytterligare faktorer: nätverkstyp (Wi-Fi, 4G, 5G), signal från mobiltorn eller trafikkostnad för användaren.

DRM och innehållsskydd

ExoPlayer stöder Widevine (L1, L3), PlayReady och ClearKey DRM. Licensanskaffning konfigureras via DrmSessionManager, som interagerar med licensservern. För premiumvideo (4K HDR) krävs hårdvarustöd för Widevine L1, vilket ger skydd på chipt nivå och förhindrar skärminsamling. Valet av DRM-system beror på målplattformen: Widevine används på Android och Chromecast, PlayReady på Xbox och Windows, FairPlay på iOS och Apple TV. ExoPlayer bestämmer automatiskt tillgängligt DRM-system baserat på MPD-filen och kräver ingen manuell konfiguration för grundläggande scenarier.

Hur man integrerar ExoPlayer i ett Android-projekt

Anslutning av ExoPlayer till ett Android-projekt görs via Gradle-beroenden. Från och med version 2.19 är ExoPlayer en del av AndroidX Media (androidx.media3), vilket säkerställer kompatibilitet med Jetpack Compose och andra AndroidX-komponenter. Låt oss titta på steg-för-steg-integration i Kotlin.

Lägga till beroenden

Lägg till ExoPlayer-moduler i filen build.gradle (Module). Minimisatsen inkluderar core, ui och modulen för det erforderliga streamingprotokollet. För uppspelning av DASH-innehåll krävs exoplayer-dash, för 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"
}

Grundläggande integration i Activity

Skapa och konfigurera spelaren i Activity eller Fragment. ExoPlayer använder PlayerView (eller StyledPlayerView för anpassning) för att visa video och inbyggda kontroller. Minimikonfigurationen inkluderar att skapa spelaren via ExoPlayer.Builder och skicka en MediaItem med källans 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()
    }
}

Fel- och tillståndshantering

För produktionsappar är hantering av möjliga uppspelningsfel nödvändig: nätverksfel, ej stödda format, DRM-licensfel. ExoPlayer tillhandahåller gränssnittet Player.Listener med metoderna onPlayerError, onPlaybackStateChanged och onPlayWhenReadyChanged. Det rekommenderas att visa informativa felmeddelanden med möjlighet att försöka igen.

ExoPlayer vs MediaPlayer: jämförelse

Valet mellan ExoPlayer och den inbyggda MediaPlayer är en vanlig fråga vid utveckling av Android-appar. MediaPlayer har varit en del av Android SDK sedan version 1.0, medan ExoPlayer är ett bibliotek som kräver anslutning via Gradle. Låt oss titta på deras skillnader baserat på viktiga kriterier.

KriteriumExoPlayerMediaPlayer
ArkitekturModulär, helt i Java/KotlinLager ovanför systemets C++-komponenter
StreamingDASH, HLS, SmoothStreaming, RTSPEndast lokala filer och HLS (Android 9+)
AnpassningFullständig (varje komponent utbytbar)Minimal (endast parametrar)
UppdateringarVia Google Play eller APK (oberoende av OS)Endast via Android-uppdatering (OTA)
APK-storlek+1-3 MB (beroende på moduler)0 (del av systemet)
Min SDKAPI 16+ (Android 4.1)API 1+
DRMWidevine, PlayReady, ClearKeyWidevine (begränsat)

ExoPlayer vinner i scenarier som kräver streaming (DASH, HLS), UI-anpassning, DRM-stöd och oberoende av Android-version. MediaPlayer är lämplig för enkla appar som spelar upp lokala mediafiler, där APK-storleken är kritisk och det inte finns några krav på adaptiv streaming. För moderna appar med innehåll från nätet är ExoPlayer det självklara valet.

Undantag — appar med minimal SDK lägre än API 16 (Android 4.1), som praktiskt taget inte längre finns på marknaden. För alla appar med targetSdk 33+ och minimal SDK 21+ är ExoPlayer inte bara att föredra, utan nödvändig för stöd av moderna format som AV1 och Dolby Vision via lämpliga tillägg.

Avancerad konfiguration av ExoPlayer

För produktionsappar kräver grundintegrationen av ExoPlayer ofta ytterligare konfiguration: cachehantering, optimering av buffring för mobila nätverk, integration med analysverktyg och anpassning av ljudspårsval. Låt oss titta på avancerade användningsscenarier.

Cache av innehåll

CacheDataSourceFactory gör det möjligt att cachelagra nedladdade segment i lokal lagring, vilket sparar trafik vid upprepad visning och möjliggör offlineuppspelning. ExoPlayer använder SimpleCache från biblioteket exoplayer-cas — filcachelagring med stöd för LRU-utrymning och storleksbegränsningar.

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

Hantering av nätverksväxling

I mobila appar är hantering av växling mellan Wi-Fi och mobilnät avgörande. ExoPlayer tillhandahåller ConnectivityManager för att övervaka nätverksstatus. Vid förlust av anslutning rekommenderas att inte stoppa spelaren, utan att övergå till PAUSED-tillstånd med bibehållen position. Efter återställning av anslutningen, återuppta uppspelningen med omladdning av segment.

Integration med Jetpack Compose

Med lanseringen av AndroidX Media3 fick biblioteket experimentellt stöd för Jetpack Compose. Komponenten `AndroidView` omsluter SurfaceView eller PlayerView och säkerställer kompatibilitet med Compose-hierarkin. För djupare integration används biblioteket `androidx.media3:media3-ui-compose`, som tillhandahåller Compose-kompatibla spelarkontroller.

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

Vanliga frågor

Vilken är den lägsta Android-versionen för ExoPlayer?

ExoPlayer stöder Android API 16+ (Android 4.1 Jelly Bean). För DASH och HLS med fMP4-segment rekommenderas dock API 21+ (Android 5.0 Lollipop). DRM-moduler (Widevine) kräver API 19+, och hårdvaruavkodning av HEVC är tillgänglig från och med API 21.

Kan jag använda ExoPlayer för endast ljud utan video?

Ja, ExoPlayer är utmärkt för ljud. För uppspelning av endast ljud krävs ingen SurfaceView eller PlayerView. ExoPlayer väljer automatiskt en ljudrenderare och fungerar i bakgrunden. För bakgrundsuppspelning rekommenderas att använda MediaSessionService för integration med systemkontroller.

Hur växlar jag mellan ljudspår i ExoPlayer?

TrackSelector i ExoPlayer hanterar val av ljudspår. För att växla, använd player.getCurrentTracks().groups och player.setTrackSelectionParameters() med angivelse av önskat ljudspråk. För DASH- och HLS-strömmar med flera ljudspår sker växling utan avbrott i uppspelningen.

Stöder ExoPlayer undertexter?

Ja, ExoPlayer stöder inbyggda (i MP4-, WebM-container) och externa undertexter i formaten TTML, SRT, VTT och CEA-608. För externa undertexter används SingleSampleMediaSource eller MergingMediaSource för att kombinera med videoströmmen. Visning av stiliserade undertexter konfigureras via CaptionStyleCompat.

Hur minskar jag latens vid livestreaming i ExoPlayer?

För låglatens streaming, konfigurera LoadControl med mindre målvärden för buffert: använd DefaultLoadControl.Builder().setTargetBufferBytes(1024 * 512).setBufferDurationsMs(500, 2000, 500, 1000) för HLS LL och DASH LL. Ställ även in minPlaybackSpeed = 1.02 för accelererad buffertfyllning vid eftersläpning från livesändningen.

Sammanfattning

  • ExoPlayer — mediaspelarbibliotek med öppen källkod från Google med modulär arkitektur och full anpassning.
  • Adaptiv streaming — stöder DASH, HLS, SmoothStreaming och RTSP via ett modulärt extensionssystem.
  • DRM — Widevine, PlayReady och ClearKey integreras via modulen exoplayer-drm med ett enhetligt API.
  • Cache — SimpleCache möjliggör offlineuppspelning och trafikbesparing vid upprepad visning.
  • Compose — från AndroidX Media3 integreras ExoPlayer med Jetpack Compose via AndroidView.
  • Anpassning — varje komponent (MediaSource, TrackSelector, LoadControl, Renderer) kan ersättas.
  • Rekommenderas — använd ExoPlayer för alla projekt som kräver streaming, DRM eller anpassning av uppspelning.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också