У меня видео 10 секунд. Я хочу l oop отрезок от 2 до 6 секунд. Начать проигрыватель в нужное время очень просто:
player?.seekTo(2000)
Я не думаю, что в библиотеке ExoPlayer2 есть функциональность для определения конечной позиции. Поэтому я попытался добавить подпрограмму задержки. С помощью метода seekToPositionAndStartCounter
. Это работает в отдельном проекте. Но используемый в реальном проекте, onPlayerStateChanged
запускается много раз внезапно.
var elapsedTime = 0L // just for testing
private fun showVideoWhenDoneLoading() {
videoView?.player?.addListener(object : Player.EventListener {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
super.onPlayerStateChanged(playWhenReady, playbackState)
if (playbackState == Player.STATE_READY) {
if (playWhenReady) {
seekToPositionAndStartCounter()
} else {
cancelCounter()
}
}
}
})
}
private fun seekToPositionAndStartCounter() {
elapsedTime = System.currentTimeMillis()
cancelCounter()
job = GlobalScope.launch(Dispatchers.IO) {
Timber.d("starting Thread name = ${Thread.currentThread().name}")
player?.seekTo(startPosition)
if (duration != 0L) {
runBlocking {
delay(duration)
}
GlobalScope.launch(Dispatchers.Main) {
Timber.d("duration = $duration elapsedTime = ${System.currentTimeMillis()-elapsedTime} Thread name = ${Thread.currentThread().name}")
seekToPositionAndStartCounter()
}
}
}
}
private fun cancelCounter() {
job?.cancel()
job = null
}