Я отлаживаю приложение для Audiobookfelf-App Android. Аудио потоки правильно проходят через туннель CloudFlare, но в поисках вперед воспроизведение приводит к сбросу в позицию 0 вместо предполагаемого положения. Эта проблема возникает только на настольных браузерах Android , PWA и мобильных веб-приложениях работает правильно с той же настройкой CloudFlare.
@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"}
После успешного поиска до 52314 мс, есть второе событие onpositiondiscontinuity с разумом = 2 , которое сразу же сбрасывает позицию в 0. Текущее время переходит от 52,314 обратно до 0s.
. Обратно, и возобновить из последней играющей позиции. Может ли быть настройки на CloudFlare или на сервере, которые могли бы помешать exoplayer сбросить позицию на 0 после поиска?
Я отлаживаю приложение для Audiobookfelf-App Android. Аудио потоки правильно проходят через туннель CloudFlare, но в поисках вперед воспроизведение приводит к сбросу в позицию 0 вместо предполагаемого положения. Эта проблема [b] возникает только на настольных браузерах Android [/b], PWA и мобильных веб-приложениях работает правильно с той же настройкой CloudFlare.[code]@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"} [/code] После успешного поиска до 52314 мс, есть второе событие onpositiondiscontinuity с разумом = 2 , которое сразу же сбрасывает позицию в 0. Текущее время переходит от 52,314 обратно до 0s. . Обратно, и возобновить из последней играющей позиции. Может ли быть настройки на CloudFlare или на сервере, которые могли бы помешать exoplayer сбросить позицию на 0 после поиска?