Код: Выделить всё
@PluginMethod
fun seekForward(call: PluginCall) {
val amount: Int = call.getInt("value", 0) ?: 0
Handler(Looper.getMainLooper()).post {
playerNotificationService.seekForward(amount * 1000L) // convert to ms
call.resolve()
}
}
fun seekForward(amount: Long) {
seekPlayer(getCurrentTime() + amount)
}
fun seekPlayer(time: Long) {
var timeToSeek = time
Log.d(tag, "seekPlayer mediaCount = ${currentPlayer.mediaItemCount} | $timeToSeek")
if (timeToSeek < 0) {
Log.w(tag, "seekPlayer invalid time $timeToSeek - setting to 0")
timeToSeek = 0L
} else if (timeToSeek > getDuration()) {
Log.w(tag, "seekPlayer invalid time $timeToSeek - setting to MAX - 2000")
timeToSeek = getDuration() - 2000L
}
if (currentPlayer.mediaItemCount > 1) {
currentPlaybackSession?.currentTime = timeToSeek / 1000.0
val newWindowIndex = currentPlaybackSession?.getCurrentTrackIndex() ?: 0
val newTimeOffset = currentPlaybackSession?.getCurrentTrackTimeMs() ?: 0
Log.d(tag, "seekPlayer seekTo $newWindowIndex | $newTimeOffset")
currentPlayer.seekTo(newWindowIndex, newTimeOffset)
} else {
currentPlayer.seekTo(timeToSeek) // Single file seek
}
}
< /code>
Обработчик разрыва положения < /h6>
override fun onPositionDiscontinuity(
oldPosition: Player.PositionInfo,
newPosition: Player.PositionInfo,
reason: Int
) {
if (reason == Player.DISCONTINUITY_REASON_SEEK) {
Log.d(tag, "onPositionDiscontinuity: oldPosition=${oldPosition.positionMs}/${oldPosition.mediaItemIndex}, newPosition=${newPosition.positionMs}/${newPosition.mediaItemIndex}, isPlaying=${playerNotificationService.currentPlayer.isPlaying} reason=SEEK")
playerNotificationService.mediaProgressSyncer.seek()
lastPauseTime = 0
} else {
Log.d(tag, "onPositionDiscontinuity: oldPosition=${oldPosition.positionMs}/${oldPosition.mediaItemIndex}, newPosition=${newPosition.positionMs}/${newPosition.mediaItemIndex}, isPlaying=${playerNotificationService.currentPlayer.isPlaying}, reason=$reason")
}
}
< /code>
соответствующие журналы, показывающие проблему (не уверен, что это точные проблемы ??) < /h4>
14:31:04.380 seekForward methodData: {"value":10}
14:31:04.381 seekPlayer mediaCount = 1 | 52314
14:31:04.382 onPositionDiscontinuity: oldPosition=42314/0, newPosition=52314/0, isPlaying=false reason=SEEK
14:31:04.382 seek: Jivan Ke Dwar Ki Kunji, currentTime=52.314
14:31:04.405 STATE_BUFFERING : 52314
14:31:04.408 onPositionDiscontinuity: oldPosition=52314/0, newPosition=0/0, isPlaying=false, reason=2
14:31:04.408 EVENT_IS_LOADING_CHANGED : true
14:31:04.420 onMetadata {"duration":7024.620396,"currentTime":52.314,"playerState":"BUFFERING"}
14:31:04.638 STATE_READY : -9223372036854775807
14:31:04.648 onMetadata {"duration":7024.620396,"currentTime":0,"playerState":"READY"}
. назад, и возобновить с последней играющей позиции. Однако, с большими файлами (обычно более 1 часа продолжительностью и 80–90 МБ+), возникает проблема. < /P>
Что может возникнуть? Может ли быть настройки на CloudFlare или на сервере, которые могли бы помешать exoplayer сбросить позицию на 0 после поиска?
Подробнее здесь: https://stackoverflow.com/questions/797 ... are-tunnel
Мобильная версия