Fixed HLS starting from the earliest segment for android

This commit is contained in:
Alex Kim
2024-11-22 04:51:11 +11:00
parent a3f8087ccc
commit 2a52499a75

View File

@@ -21,16 +21,17 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
private var mediaPlayer: MediaPlayer? = null private var mediaPlayer: MediaPlayer? = null
private lateinit var videoLayout: VLCVideoLayout private lateinit var videoLayout: VLCVideoLayout
private var isPaused: Boolean = false private var isPaused: Boolean = false
private var isMediaReady: Boolean = false
private var lastReportedState: Int? = null private var lastReportedState: Int? = null
private var lastReportedIsPlaying: Boolean? = null private var lastReportedIsPlaying: Boolean? = null
private var startPosition: Int? = null
private var media : Media? = null private var media : Media? = null
private val onVideoProgress by EventDispatcher() private val onVideoProgress by EventDispatcher()
private val onVideoStateChange by EventDispatcher() private val onVideoStateChange by EventDispatcher()
private val onVideoLoadEnd by EventDispatcher() private val onVideoLoadEnd by EventDispatcher()
private var startPosition: Int? = 0
private var isTranscodedStream: Boolean = false
private var isMediaReady: Boolean = false
init { init {
setupView() setupView()
} }
@@ -47,13 +48,19 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
fun setSource(source: Map<String, Any>) { fun setSource(source: Map<String, Any>) {
val mediaOptions = source["mediaOptions"] as? Map<String, Any> ?: emptyMap() val mediaOptions = source["mediaOptions"] as? Map<String, Any> ?: emptyMap()
val initOptions = source["initOptions"] as? List<String> ?: emptyList()
val uri = source["uri"] as? String
val autoplay = source["autoplay"] as? Boolean ?: false val autoplay = source["autoplay"] as? Boolean ?: false
val isNetwork = source["isNetwork"] as? Boolean ?: false val isNetwork = source["isNetwork"] as? Boolean ?: false
startPosition = (source["startPosition"] as? Double)?.toInt() ?: 0 startPosition = (source["startPosition"] as? Double)?.toInt() ?: 0
println("startPosition $startPosition") val initOptions = source["initOptions"] as? MutableList<String> ?: mutableListOf()
initOptions.add("--start-time=$startPosition")
val uri = source["uri"] as? String
if (uri != null && uri.contains("m3u8")) {
isTranscodedStream = true
}
// Handle video load start event // Handle video load start event
// onVideoLoadStart?.invoke(mapOf("target" to reactTag ?: "null")) // onVideoLoadStart?.invoke(mapOf("target" to reactTag ?: "null"))
@@ -209,12 +216,6 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
} }
} }
// Determine if the media has finished loading
if (player.isPlaying && !isMediaReady) {
isMediaReady = true
onVideoLoadEnd(stateInfo)
seekToStartTime()
}
if (lastReportedState != currentState || lastReportedIsPlaying != player.isPlaying) { if (lastReportedState != currentState || lastReportedIsPlaying != player.isPlaying) {
lastReportedState = currentState lastReportedState = currentState
@@ -223,22 +224,6 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
} }
} }
private fun seekToStartTime() {
val player = mediaPlayer ?: return
val startPosition = startPosition ?: return
println("seekToStartTime $startPosition")
if (startPosition > 0) {
Log.d("VlcPlayerView", "Debug: Seeking to start position: $startPosition")
player.time = startPosition.toLong()
// Ensure the player continues playing after seeking
if (!player.isPlaying) {
player.play()
}
}
}
private fun updateVideoProgress() { private fun updateVideoProgress() {
val player = mediaPlayer ?: return val player = mediaPlayer ?: return
@@ -246,9 +231,14 @@ class VlcPlayerView(context: Context, appContext: AppContext) : ExpoView(context
val currentTimeMs = player.time.toInt() val currentTimeMs = player.time.toInt()
val durationMs = player.media?.duration?.toInt() ?: 0 val durationMs = player.media?.duration?.toInt() ?: 0
println("currentTimeMs $currentTimeMs")
if (currentTimeMs >= 0 && currentTimeMs < durationMs) { if (currentTimeMs >= 0 && currentTimeMs < durationMs) {
// Determine if the media has finished loading
if (player.isPlaying && !isMediaReady) {
isMediaReady = true
if (isTranscodedStream) {
seekTo((startPosition ?: 0) * 1000)
}
}
onVideoProgress(mapOf( onVideoProgress(mapOf(
"currentTime" to currentTimeMs, "currentTime" to currentTimeMs,
"duration" to durationMs "duration" to durationMs