mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-09 23:15:28 +03:00
Compare commits
No commits in common. "3acff5212e525ee16829f88a48140c18e4f325ef" and "025018dd98fa1d6f763b1612f2c96bab9b42d0a5" have entirely different histories.
3acff5212e
...
025018dd98
@ -216,11 +216,7 @@ export default function HlsVideoPlayer({
|
|||||||
|
|
||||||
const [tallCamera, setTallCamera] = useState(false);
|
const [tallCamera, setTallCamera] = useState(false);
|
||||||
const [isPlaying, setIsPlaying] = useState(true);
|
const [isPlaying, setIsPlaying] = useState(true);
|
||||||
const [persistedMuted, setPersistedMuted] = useUserPersistence(
|
const [muted, setMuted] = useUserPersistence("hlsPlayerMuted", true);
|
||||||
"hlsPlayerMuted",
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
const [temporaryMuted, setTemporaryMuted] = useState(false);
|
|
||||||
const [volume, setVolume] = useOverlayState("playerVolume", 1.0);
|
const [volume, setVolume] = useOverlayState("playerVolume", 1.0);
|
||||||
const [defaultPlaybackRate] = useUserPersistence("playbackRate", 1);
|
const [defaultPlaybackRate] = useUserPersistence("playbackRate", 1);
|
||||||
const [playbackRate, setPlaybackRate] = useOverlayState(
|
const [playbackRate, setPlaybackRate] = useOverlayState(
|
||||||
@ -236,16 +232,6 @@ export default function HlsVideoPlayer({
|
|||||||
height: number;
|
height: number;
|
||||||
}>({ width: 0, height: 0 });
|
}>({ width: 0, height: 0 });
|
||||||
|
|
||||||
const muted = persistedMuted || temporaryMuted;
|
|
||||||
|
|
||||||
const onSetMuted = useCallback(
|
|
||||||
(muted: boolean) => {
|
|
||||||
setTemporaryMuted(false);
|
|
||||||
setPersistedMuted(muted);
|
|
||||||
},
|
|
||||||
[setPersistedMuted],
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isDesktop) {
|
if (!isDesktop) {
|
||||||
return;
|
return;
|
||||||
@ -311,7 +297,7 @@ export default function HlsVideoPlayer({
|
|||||||
fullscreen: supportsFullscreen,
|
fullscreen: supportsFullscreen,
|
||||||
}}
|
}}
|
||||||
setControlsOpen={setControlsOpen}
|
setControlsOpen={setControlsOpen}
|
||||||
setMuted={onSetMuted}
|
setMuted={(muted) => setMuted(muted)}
|
||||||
playbackRate={playbackRate ?? 1}
|
playbackRate={playbackRate ?? 1}
|
||||||
hotKeys={hotKeys}
|
hotKeys={hotKeys}
|
||||||
onPlayPause={onPlayPause}
|
onPlayPause={onPlayPause}
|
||||||
@ -418,20 +404,9 @@ export default function HlsVideoPlayer({
|
|||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
onVolumeChange={() => {
|
onVolumeChange={() => {
|
||||||
if (!videoRef.current) {
|
setVolume(videoRef.current?.volume ?? 1.0, true);
|
||||||
return;
|
if (!frigateControls) {
|
||||||
}
|
setMuted(videoRef.current?.muted);
|
||||||
|
|
||||||
setVolume(videoRef.current.volume ?? 1.0, true);
|
|
||||||
|
|
||||||
if (frigateControls) {
|
|
||||||
if (videoRef.current.muted && !persistedMuted) {
|
|
||||||
setTemporaryMuted(true);
|
|
||||||
} else if (!videoRef.current.muted && temporaryMuted) {
|
|
||||||
setTemporaryMuted(false);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setPersistedMuted(videoRef.current.muted);
|
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
onPlay={() => {
|
onPlay={() => {
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import {
|
|||||||
calculateInpointOffset,
|
calculateInpointOffset,
|
||||||
calculateSeekPosition,
|
calculateSeekPosition,
|
||||||
} from "@/utils/videoUtil";
|
} from "@/utils/videoUtil";
|
||||||
import { playWithTemporaryMuteFallback } from "@/utils/videoUtil.ts";
|
|
||||||
|
|
||||||
type PlayerMode = "playback" | "scrubbing";
|
type PlayerMode = "playback" | "scrubbing";
|
||||||
|
|
||||||
@ -108,7 +107,7 @@ export class DynamicVideoController {
|
|||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const onSeekedHandler = () => {
|
const onSeekedHandler = () => {
|
||||||
this.playerController.removeEventListener("seeked", onSeekedHandler);
|
this.playerController.removeEventListener("seeked", onSeekedHandler);
|
||||||
playWithTemporaryMuteFallback(this.playerController);
|
this.playerController.play();
|
||||||
resolve(undefined);
|
resolve(undefined);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -78,20 +78,3 @@ export function calculateSeekPosition(
|
|||||||
|
|
||||||
return seekSeconds >= 0 ? seekSeconds : undefined;
|
return seekSeconds >= 0 ? seekSeconds : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Attempts to play the video, and if it fails due to a NotAllowedError (often caused by browser autoplay restrictions),
|
|
||||||
* it temporarily mutes the video and tries to play again.
|
|
||||||
* @param video - The HTMLVideoElement to play
|
|
||||||
*/
|
|
||||||
export function playWithTemporaryMuteFallback(video: HTMLVideoElement) {
|
|
||||||
return video.play().catch((error: { name?: string }) => {
|
|
||||||
if (error.name === "NotAllowedError" && !video.muted) {
|
|
||||||
video.muted = true;
|
|
||||||
|
|
||||||
return video.play().catch(() => undefined);
|
|
||||||
}
|
|
||||||
|
|
||||||
throw error;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user