对于 Jetpack Compose 中的 ExoPlayer,播放器在暂停和恢复非循环视频应用程序后显示黑屏

问题描述 投票:0回答:1

我的屏幕上有一个播放器,其中的视频可以播放一次(因此不会循环播放)。视频播放完毕后,播放器一直显示最后一帧,这就是我想要的。但是,如果视频播放完毕并且我关闭然后打开屏幕,则播放器会显示黑屏。我想要的是播放器不断显示最后一帧。这可能吗?如果非循环视频尚未播放完毕,此问题也会持续存在。

需要注意的是,循环视频不存在此问题。

有很多关于常规 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
            }
        }
    )
}
android-jetpack-compose exoplayer
1个回答
0
投票

我在视频开始时遇到了相同的黑屏,我通过在使用之前在我的

ExoPlayer
中创建
viewModel
并传递到使用它的可组合函数并在使用
exoPlayer?.release()
后释放
exoPlayer
来解决它。

在我的例子中,我需要显示一些简短的循环教程,所以我不想一直创建一个

ExoPlayer
,所以当用户按下教程按钮时 - 创建一个播放器,然后传递给可组合函数来播放它。当用户关闭教程时 - 玩家会在
viewModel
中被释放。

所以主要想法是将

ExoPlayer
从使用它的功能中移出,以便为玩家提供更多时间准备工作

© www.soinside.com 2019 - 2024. All rights reserved.