ExoPlayer с Jetpack Compose — изменение ориентации перезапускает видеоAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 ExoPlayer с Jetpack Compose — изменение ориентации перезапускает видео

Сообщение Anonymous »

Я пытаюсь использовать Jetpack Compose с ExoPlayer
Проблемы
  • При изменении ориентации 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»