mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-10-02 21:06:52 +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);
|
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={() => {
|
onWaiting={() => {
|
||||||
if (onError != undefined) {
|
if (onError != undefined) {
|
||||||
if (videoRef.current?.paused) {
|
if (videoRef.current?.paused) {
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ import { playWithTemporaryMuteFallback } from "@/utils/videoUtil.ts";
|
|||||||
|
|
||||||
type PlayerMode = "playback" | "scrubbing";
|
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 {
|
export class DynamicVideoController {
|
||||||
// main state
|
// main state
|
||||||
public camera = "";
|
public camera = "";
|
||||||
@@ -106,7 +110,10 @@ export class DynamicVideoController {
|
|||||||
|
|
||||||
waitAndPlay() {
|
waitAndPlay() {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
|
let fallback: NodeJS.Timeout | undefined;
|
||||||
|
|
||||||
const onSeekedHandler = () => {
|
const onSeekedHandler = () => {
|
||||||
|
clearTimeout(fallback);
|
||||||
this.playerController.removeEventListener("seeked", onSeekedHandler);
|
this.playerController.removeEventListener("seeked", onSeekedHandler);
|
||||||
playWithTemporaryMuteFallback(this.playerController);
|
playWithTemporaryMuteFallback(this.playerController);
|
||||||
resolve(undefined);
|
resolve(undefined);
|
||||||
@@ -115,6 +122,12 @@ export class DynamicVideoController {
|
|||||||
this.playerController.addEventListener("seeked", onSeekedHandler, {
|
this.playerController.addEventListener("seeked", onSeekedHandler, {
|
||||||
once: true,
|
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