jetpack compose ExoPlayer播放网络视频的示例代码
时间: 2024-09-07 14:03:58 浏览: 31
Jetpack Compose 和 ExoPlayer 结合可以创建流畅的视频播放体验。以下是一个简单的 Jetpack Compose 示例代码片段,演示了如何使用 ExoPlayer 在 Android 上播放网络视频:
```kotlin
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.ImagePainter
import androidx.compose.ui.unit.dp
import com.google.exoplayer2.DefaultLoadControl
import com.google.exoplayer2.DefaultRenderersFactory
import com.google.exoplayer2.ExoPlayer
import com.google.exoplayer2.Player
import com.google.exoplayer2.SimpleExoPlayer
import com.google.exoplayer2.source.MediaSource
import com.google.exoplayer2.upstream.HttpDataSource.Factory
import com.google.android.exoplayer2.ext.mediasession.MediaSessionProvider
@Composable
fun VideoPlayer(playerState: PlayerState) {
val exoPlayer = SimpleExoPlayer.Builder(context)
.setMediaSource(MediaSource.Factory { /* 创建你的 MediaSource 实例 */ })
.setAudioAttributes(/* 设置音频属性 */)
.setVideoSurfaceProvider { Surface(SurfaceConfig()) }
.build()
// 初始化并设置播放状态
exoPlayer.setPlayWhenReady(playerState.isPlaying)
exoPlayer.seekTo(playerState.positionMs)
LaunchedEffect(playerState) {
// 更新播放进度
playerState.progressTracker?.let { progress ->
playerState.player.addPeriodicCallback(progress::onProgressUpdate, 1000L)
}
// 处理播放完成、错误等事件
val listeners = mutableListOf<Player.EventListener>()
listeners.add(PlayerEventListener { event ->
when (event) {
is Player.StateChange -> handleStateChanged(event.state)
is Player.LoadError -> handleLoadError(event.error)
// 其他事件...
}
})
playerState.player.addListener(listeners.toComposite())
// 播放控制
playerState.player.playWhenReady = playerState.isPlaying
playerState.player.pauseWhenNotPlaying()
}
// 当播放暂停时显示暂停图标,播放时显示播放图标
Box(
modifier = Modifier
.align(Alignment.CenterVertically)
.fillMaxSize()
.clickable { if (!exoPlayer.isPlaying) exoPlayer.play() else exoPlayer.pause() },
painter = ImagePainter(
painter = if (exoPlayer.isPlaying) PlayerView.PausedImagePainter else PlayerView.PlayingImagePainter,
contentDescription = "Play/Pause button"
)
)
}
// 假设有一个 PlayerState 类来管理播放状态
data class PlayerState(
var positionMs: Long = 0,
var isPlaying: Boolean = false,
val player: ExoPlayer,
// 添加其他需要的状态和监听器
)
// ... 在合适的地方初始化 PlayerState,并将其传入 VideoPlayer 函数
```
请注意,这只是一个基础示例,实际应用中你还需要处理更多的细节,如错误处理、加载进度更新、媒体源的构建、以及用户交互等。同时,`MediaSource.Factory` 需要你自己提供一个具体的工厂来创建 `MediaSource`,这里省略了。