mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-09-26 13:08:57 +03:00
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
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:
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user