在Jetpack Compose中使用ExoPlayer,非循环视频在暂停并恢复应用程序后,播放器显示黑屏。

3
我有一个屏幕,上面有一个播放一次的视频播放器(因此不会循环播放)。当视频播放完毕后,播放器会继续显示最后一帧,这正是我想要的。然而,如果视频播放完毕后我关闭并重新打开屏幕,则播放器会显示黑屏。我想让播放器继续显示最后一帧,请问是否可能实现?如果非循环视频尚未播放完毕,此问题也将持续存在。
需要注意的是,循环视频不存在此问题。
对于常规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
            }
        }
    )
}

你找到解决办法了吗?在我的情况下,所有的视频都会在开始时出现0.3秒的黑屏。 - undefined
@AlexeySimchenko 很遗憾,还没有解决方案。但我在GitHub上找到了这个使用rememberSaveable和自定义Saver的Exoplayer Compose实现。这可能会解决问题,但我还没有尝试过。https://github.com/mdpearce/vermilion/blob/f0e229af70ddcd9b10985dfe46c18c35a54708a4/ui/src/main/java/com/neaniesoft/vermilion/ui/videos/exoplayer/ExoPlayer.kt#L58 - undefined
我找到了解决方案,并想在这里发布,但我的项目已经结束,我正在忙于寻找新的工作。但我会看看我是如何解决这个问题的,并很快发布出来。 - undefined
1个回答

0
我在视频开始时遇到了同样的黑屏问题,通过在使用和传递到使用它的可组合函数之前,在我的viewModel中创建了ExoPlayer,并在使用ExoPlayer后释放了exoPlayer?.release()来解决了这个问题。
在我的情况下,我需要显示一些循环播放的短教程,所以我不想一直创建一个ExoPlayer,所以当用户按下教程按钮时,会创建一个播放器,然后将其传递给可组合函数进行播放。当用户关闭教程时,在viewModel中释放播放器。
所以主要的想法是将ExoPlayer从使用它的函数中移出,以给播放器更多的准备工作时间。

一开始的黑屏是其他问题吗?我添加了一个监听器来检查视频是否正在缓冲,如果正在缓冲,我会显示一个加载指示器。 对于评论中的格式不好,我很抱歉...val isBuffering = remember { mutableStateOf(true) }addListener(object : Player.Listener { override fun onPlaybackStateChanged(playbackState: Int) { super.onPlaybackStateChanged(playbackState) isBuffering.value = playbackState == Player.STATE_BUFFERING }})if (isBuffering.value) { Loading() } - undefined
@latsson 我只有0.5秒的黑屏,所以不需要显示加载指示器。在我的情况下,我需要立即显示一个循环视频 - 没有黑屏、加载指示器或其他任何东西。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接