Backport 0.19 iOS HLS fixes (#24147)
CI / AMD64 Build (push) Canceled after 0s
CI / ARM Build (push) Canceled after 0s
CI / Jetson Jetpack 6 (push) Canceled after 0s
CI / AMD64 Extra Build (push) Canceled after 0s
CI / ARM Extra Build (push) Canceled after 0s
CI / Synaptics Build (push) Canceled after 0s
CI / Assemble and push default build (push) Canceled after 0s

This commit is contained in:
Nicolas Mowen
2026-08-31 12:17:56 -05:00
committed by GitHub
parent d37dff1b49
commit c1b56b51b0
2 changed files with 19 additions and 0 deletions
@@ -490,6 +490,12 @@ export default function HlsVideoPlayer({
clearTimeout(mobileCtrlTimeout);
}
}}
onSeeking={() => {
// iOS ManagedMediaSource gates hls.js fragment loading off
// while paused and never resumes it on seek, so a seek
// into unbuffered media would never complete
hlsRef.current?.resumeBuffering();
}}
onWaiting={() => {
if (onError != undefined) {
if (videoRef.current?.paused) {
@@ -10,6 +10,10 @@ import { playWithTemporaryMuteFallback } from "@/utils/videoUtil.ts";
type PlayerMode = "playback" | "scrubbing";
// how long a seek may wait for its `seeked` event before playback starts
// anyway; long enough that a normally completing seek always wins
const SEEK_PLAY_FALLBACK_MS = 1000;
export class DynamicVideoController {
// main state
public camera = "";
@@ -106,7 +110,10 @@ export class DynamicVideoController {
waitAndPlay() {
return new Promise((resolve) => {
let fallback: NodeJS.Timeout | undefined;
const onSeekedHandler = () => {
clearTimeout(fallback);
this.playerController.removeEventListener("seeked", onSeekedHandler);
playWithTemporaryMuteFallback(this.playerController);
resolve(undefined);
@@ -115,6 +122,12 @@ export class DynamicVideoController {
this.playerController.addEventListener("seeked", onSeekedHandler, {
once: true,
});
// iOS ManagedMediaSource pauses hls.js buffering, so `seeked` may
// never fire; playing is what prompts WebKit to resume streaming
if ("ManagedMediaSource" in window) {
fallback = setTimeout(onSeekedHandler, SEEK_PLAY_FALLBACK_MS);
}
});
}