PlayerView имеет черный экранAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 PlayerView имеет черный экран

Сообщение Anonymous »

Я создаю видеоплеер с помощью ExoPlayer. Иногда PlayerView показывает черный экран, когда я завершаю действие и снова открываю его. Если я нажму кнопку воспроизведения/паузы, PlayerView останется черным, но если я нажму кнопку поиска к следующему/предыдущему 5s, видео будет воспроизведено. Но я хочу воспроизвести видео, когда оно будет готово, и скрыть контроллер.
Вот мои действия:

Код: Выделить всё

class PreviewActivity : BaseActivity() {
override fun getViewBinding(): ActivityPreviewBinding =
ActivityPreviewBinding.inflate(layoutInflater)

override fun getViewModelClass(): Class =
ActivityPreviewViewModel::class.java

@OptIn(UnstableApi::class)
override fun setupListener() {
binding.apply {
vv.player?.addListener(object : Player.Listener {
override fun onIsPlayingChanged(isPlaying: Boolean) {
Log.d(TAG, "[onIsPlayingChanged] IsPlaying: $isPlaying")
if (!isPlaying) {
vv.player?.play()
}
}

override fun onPlayerError(error: PlaybackException) {
super.onPlayerError(error)
Log.e(TAG, "[onPlayerError] Error: ${error.message}", error)
}

override fun onPlaybackStateChanged(playbackState: Int) {
super.onPlaybackStateChanged(playbackState)
Log.d(TAG, "[onPlaybackStateChanged] PlaybackState: $playbackState")
}
})
}
}

override fun setupViews() {
val bundle = intent.extras
val videoPath = bundle?.getString(BUNDLE_VIDEO_PATH)
setupVideo(videoPath)
}

@OptIn(UnstableApi::class)
private fun setupVideo(videoPath: String?) {
try {
binding.vv.apply {
val uri = Uri.parse(videoPath)
val mediaItem = MediaItem.fromUri(uri)
val exoPlayer = ExoPlayer.Builder(this@PreviewActivity).build()
exoPlayer.repeatMode = ExoPlayer.REPEAT_MODE_ONE
exoPlayer.playWhenReady = true
exoPlayer.addMediaItem(mediaItem)
exoPlayer.prepare()
exoPlayer.addAnalyticsListener(EventLogger())
useController = false
resizeMode = RESIZE_MODE_ZOOM
player = exoPlayer
}
} catch (e: Exception) {
e.printStackTrace()
}
}

override fun onDestroy() {
super.onDestroy()
binding.vv.player?.clearMediaItems()
binding.vv.player?.clearVideoSurface()
binding.vv.player?.release()
}

companion object {
const val BUNDLE_VIDEO_PATH = "videoPath"
private const val ONE_SECOND = 1000L
private const val TAG = "PreviewActivity"
}
}
Оба setupListener() и setupViews() вызываются в функции onCreate().
Когда я пытался записать состояния проигрывателя, я понял, что при воспроизведении видео воспроизведениеState изменяется на 3, что соответствует STATE_READY и isPlaying == true . Но если экран черный, playState изменяется на 2, что соответствует STATE_BUFFERING после STATE_READY и isPlaying == false без каких-либо исключений.

Код: Выделить всё

2024-10-11 15:46:30.799 PreviewActivity         D  [onPlaybackStateChanged] PlaybackState: 3
2024-10-11 15:46:30.800 PreviewActivity         D  [onIsPlayingChanged] IsPlaying: true
2024-10-11 15:46:30.817 ViewRootIm...wActivity] I  MSG_WINDOW_FOCUS_CHANGED 1 1
2024-10-11 15:46:35.707 PreviewActivity         D  [onPlaybackStateChanged] PlaybackState: 2
2024-10-11 15:46:35.708 PreviewActivity         D  [onIsPlayingChanged] IsPlaying: false
Поэтому я пытаюсь использовать vv.player?.play(), когда isPlaying == false, но это не работает 🤣.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ack-screen
Ответить

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

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

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

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

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