Проблемы
- При изменении ориентации ExoPlayer перезапускается видео, но предыдущее воспроизведение все еще существует и воспроизводится в фоновом режиме. Например, если я дважды поверну телефон, будут воспроизводиться три звуковые дорожки, причем последнее видео будет на переднем плане
- exoPlayer.duration всегда имеет значение TIME_UNSET (Long.MIN_VALUE + 1), даже когда PlaybackState меняется на Player.STATE_READY -> Это было исправлено с помощью exoPlayerState.exoPlayer.duration .
Версия Jetpack Compose: 1.0.4 (последняя на данный момент)Версия ExoPlayer: 2.15.1 (последняя на данный момент)
Код
Вот мой составной проигрыватель и его реализация
class ExoPlayerState(context: Context) {
val exoPlayer = SimpleExoPlayer.Builder(context).build()
val duration by mutableStateOf(exoPlayer.duration)
val bufferedPosition by mutableStateOf(exoPlayer.bufferedPosition)
var position by mutableStateOf(exoPlayer.currentPosition)
}
@Composable
fun Player(
modifier: Modifier = Modifier,
sourceUrl: String
) {
val context = LocalContext.current
val exoPlayerState by remember(context) { mutableStateOf(ExoPlayerState(context)) } // {
Log.d("Player", "STATE_READY- duration: ${exoPlayerState.duration}") // {}
Player.STATE_BUFFERING, Player.STATE_IDLE -> {}
}
}
})
val mediaSource = generateMediaSource(context, sourceUrl)
exoPlayerState.exoPlayer.setMediaSource(mediaSource)
exoPlayerState.exoPlayer.prepare()
}
AndroidView(factory = {
PlayerView(it).apply {
player = exoPlayerState.exoPlayer
useController = false
(player as SimpleExoPlayer).playWhenReady = true
}
})
// my custom player controller composable
PlayerOverlay(
exoPlayerState = exoPlayerState,
onValueChangeFinished = {
exoPlayerState.exoPlayer.seekTo(exoPlayerState.position)
},
modifier = modifier
)
}
private fun generateMediaSource(context: Context, videoUrl: String): MediaSource {
val mediaItem = MediaItem.Builder()
.setUri(Uri.parse(videoUrl))
.setDrmSessionForClearPeriods(true)
.build()
return DefaultMediaSourceFactory(buildDataSourceFactory(context)).createMediaSource(mediaItem)
}
private fun buildDataSourceFactory(context: Context): DataSource.Factory {
return DefaultDataSourceFactory(
context,
getDefaultHttpDataSourceFactory(context)
)
}
private fun getDefaultHttpDataSourceFactory(context: Context): HttpDataSource.Factory {
return DefaultHttpDataSource.Factory()
.setUserAgent(Util.getUserAgent(context, context.packageName))
}
Мое предположение
Я предполагаю, что теперь я правильно сохраняю состояния exoplayer и обновляю его?
Я думал создать ExoPlayerState< /code> и запоминание его в составном элементе могло бы правильно справиться с этим, но, видимо, этого было недостаточно.
Кстати, моя пользовательская логика панели поиска работает нормально. Он правильно ищет видео в сохраненной позиции.
onValueChangeFinished = {
exoPlayerState.exoPlayer.seekTo(exoPlayerState.position)
}
Подробнее здесь: https://stackoverflow.com/questions/698 ... arts-video