Jetpack Compose-视频播放器ExoPlayer

前言

ExoPlayer 是一个由 Google 开发的用于 Android 平台的开源媒体播放库。

ExoPlayer 旨在提供比 Android 系统自带的 MediaPlayer 更强大、更灵活的媒体播放功能。它可以播放本地和网络上的各种音频和视频文件,并且支持多种常见的媒体格式和协议。

支持常见的音频格式如 MP3、AAC、FLAC 等,视频格式如 MP4、MKV、WebM 等。此外,还支持 DASH(Dynamic Adaptive Streaming over HTTP)、HLS(HTTP Live Streaming)等自适应流媒体格式,能够根据网络状况自动调整播放质量。

支持 HTTP、HTTPS、RTSP 等多种网络协议,方便从不同的网络源获取媒体资源。

添加依赖

1
2
3
4
5
6
dependencies {
// 核心 ExoPlayer 库
implementation('androidx.media3:media3-exoplayer:1.8.0')
// HLS 支持
implementation('androidx.media3:media3-exoplayer-hls:1.8.0')
}

封装组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.net.toUri
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView


@Composable
fun ZExoplayerComp(resourceUrl: String) {
val context = LocalContext.current

val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply {
val mediaItem = MediaItem.fromUri(resourceUrl.toUri())
setMediaItem(mediaItem)
prepare()
playWhenReady = true

}
}

DisposableEffect(Unit) {
onDispose {
exoPlayer.release()
}
}

AndroidView(factory = { ctx ->
PlayerView(ctx).apply {
player = exoPlayer
setBackgroundColor(android.graphics.Color.TRANSPARENT)
}
}, modifier = Modifier.fillMaxSize())
}

报错

java.lang.IllegalStateException: java.lang.ClassNotFoundException: androidx.media3.exoplayer.hls.HlsMediaSource$Factory

添加依赖

1
implementation('androidx.media3:media3-exoplayer-hls:1.8.0')