Fixed HLS starting from the earliest segment

This commit is contained in:
Alex Kim
2024-11-22 01:58:59 +11:00
parent 73acca6c21
commit a3f8087ccc

View File

@@ -11,6 +11,9 @@ class VlcPlayerView: ExpoView {
private var lastReportedState: VLCMediaPlayerState? private var lastReportedState: VLCMediaPlayerState?
private var lastReportedIsPlaying: Bool? private var lastReportedIsPlaying: Bool?
private var customSubtitles: [(internalName: String, originalName: String)] = [] private var customSubtitles: [(internalName: String, originalName: String)] = []
private var startPosition: Int32 = 0
private var isTranscodedStream: Bool = false
private var isMediaReady: Bool = false
// MARK: - Initialization // MARK: - Initialization
@@ -103,10 +106,14 @@ class VlcPlayerView: ExpoView {
let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:] let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:]
var initOptions = source["initOptions"] as? [Any] ?? [] var initOptions = source["initOptions"] as? [Any] ?? []
let startPosition = source["startPosition"] as? Int32 ?? 0 startPosition = source["startPosition"] as? Int32 ?? 0
initOptions.append("--start-time=\(startPosition)") initOptions.append("--start-time=\(startPosition)")
let uri = source["uri"] as? String let uri = source["uri"] as? String
if let uri = uri, uri.contains("m3u8") {
self.isTranscodedStream = true
}
let autoplay = source["autoplay"] as? Bool ?? false let autoplay = source["autoplay"] as? Bool ?? false
let isNetwork = source["isNetwork"] as? Bool ?? false let isNetwork = source["isNetwork"] as? Bool ?? false
@@ -557,7 +564,8 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
"error": false, "error": false,
] ]
if player.isPlaying { // Fix HLS issue.
if player.isPlaying && (!self.isTranscodedStream || self.isMediaReady) {
stateInfo["isPlaying"] = true stateInfo["isPlaying"] = true
stateInfo["isBuffering"] = false stateInfo["isBuffering"] = false
stateInfo["state"] = "Playing" stateInfo["state"] = "Playing"
@@ -578,12 +586,6 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
stateInfo["state"] = "Opening" stateInfo["state"] = "Opening"
} }
// Dermine if the media has finished loading
// if player.isPlaying && !self.isMediaReady {
// self.isMediaReady = true
// self.onVideoLoadEnd?(stateInfo)
// }
if self.lastReportedState != currentState if self.lastReportedState != currentState
|| self.lastReportedIsPlaying != player.isPlaying || self.lastReportedIsPlaying != player.isPlaying
{ {
@@ -621,10 +623,16 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
guard let player = self.mediaPlayer else { return } guard let player = self.mediaPlayer else { return }
let currentTimeMs = player.time.intValue let currentTimeMs = player.time.intValue
let remainingTimeMs = player.remainingTime
let durationMs = player.media?.length.intValue ?? 0 let durationMs = player.media?.length.intValue ?? 0
if currentTimeMs >= 0 && currentTimeMs < durationMs { if currentTimeMs >= 0 && currentTimeMs < durationMs {
// Handle when VLC starts at cloest earliest segment skip to the start time.
if player.isPlaying && !self.isMediaReady {
self.isMediaReady = true
if self.isTranscodedStream {
self.seekTo(self.startPosition * 1000)
}
}
self.onVideoProgress?([ self.onVideoProgress?([
"currentTime": currentTimeMs, "currentTime": currentTimeMs,
"duration": durationMs, "duration": durationMs,