fix: restore subtitles after backward seek

Switch seek parameters from CLOSEST_SYNC to PREVIOUS_SYNC so seeks always
land at or before the requested position, preventing subtitle cues from
being skipped. On backward seek discontinuity, briefly disable and re-enable
the text track to flush TextRenderer state so the current cue is re-delivered.
This commit is contained in:
2026-02-17 21:21:47 +01:00
parent 19273d2cb9
commit f215c93608
2 changed files with 24 additions and 1 deletions

View File

@@ -94,6 +94,18 @@ class PlayerManager @Inject constructor(
refreshMetadata(mediaItem) refreshMetadata(mediaItem)
refreshQueue() refreshQueue()
} }
override fun onPositionDiscontinuity(
oldPosition: Player.PositionInfo,
newPosition: Player.PositionInfo,
reason: Int
) {
if (reason == Player.DISCONTINUITY_REASON_SEEK &&
newPosition.positionMs < oldPosition.positionMs
) {
refreshSubtitleRendererOnBackwardSeek()
}
}
} }
init { init {
@@ -270,6 +282,17 @@ class PlayerManager @Inject constructor(
} }
} }
private fun refreshSubtitleRendererOnBackwardSeek() {
val currentParams = player.trackSelectionParameters
if (C.TRACK_TYPE_TEXT in currentParams.disabledTrackTypes) return
scope.launch {
player.trackSelectionParameters = currentParams.buildUpon()
.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, true)
.build()
player.trackSelectionParameters = currentParams
}
}
fun release() { fun release() {
scope.cancel() scope.cancel()
player.removeListener(listener) player.removeListener(listener)

View File

@@ -66,7 +66,7 @@ object VideoPlayerModule {
.setTrackSelector(trackSelector) .setTrackSelector(trackSelector)
.setPauseAtEndOfMediaItems(true) .setPauseAtEndOfMediaItems(true)
.setLoadControl(loadControl) .setLoadControl(loadControl)
.setSeekParameters(SeekParameters.CLOSEST_SYNC) .setSeekParameters(SeekParameters.PREVIOUS_SYNC)
.setAudioAttributes(audioAttributes, true) .setAudioAttributes(audioAttributes, true)
.build() .build()
.apply { .apply {