我的屏幕上有一个播放器,其中的视频可以播放一次(因此不会循环播放)。视频播放完毕后,播放器一直显示最后一帧,这就是我想要的。但是,如果视频播放完毕并且我关闭然后打开屏幕,则播放器会显示黑屏。我想要的是播放器不断显示最后一帧。这可能吗?如果非循环视频尚未播放完毕,此问题也会持续存在。
需要注意的是,循环视频不存在此问题。
有很多关于常规 Android 中播放器生命周期的文档,但没有关于 Compose 的文档。我只能在网上找到有关 Compose 版本的文章,该播放器是在
onDispose
中发布的。
我有一个使用 AndroidView 的 ExoPlayer 的 Jetpack Compose 实现(因为还没有本机支持)。这是:
@Composable
fun VideoLayout(@RawRes rawResource: Int) {
val context = LocalContext.current
val uri = RawResourceDataSource.buildRawResourceUri(rawResource)
val mediaItem = MediaItem.fromUri(uri)
val exoPlayer = remember(context, mediaItem) {
ExoPlayer.Builder(context).build().apply {
addMediaItem(mediaItem)
prepare()
play()
repeatMode = REPEAT_MODE_OFF
}
}
DisposableEffect(exoPlayer) { onDispose { exoPlayer.release() } }
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = {
StyledPlayerView(it).apply {
player = exoPlayer
resizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM
useController = false
}
}
)
}
我在视频开始时遇到了相同的黑屏,我通过在使用之前在我的
ExoPlayer
中创建viewModel
并传递到使用它的可组合函数并在使用exoPlayer?.release()
后释放exoPlayer
来解决它。
在我的例子中,我需要显示一些简短的循环教程,所以我不想一直创建一个
ExoPlayer
,所以当用户按下教程按钮时 - 创建一个播放器,然后传递给可组合函数来播放它。当用户关闭教程时 - 玩家会在 viewModel
中被释放。
所以主要想法是将
ExoPlayer
从使用它的功能中移出,以便为玩家提供更多时间准备工作