diff --git a/web/src/components/camera/AutoUpdatingCameraImage.tsx b/web/src/components/camera/AutoUpdatingCameraImage.tsx index 61faffdaf..e8edcf936 100644 --- a/web/src/components/camera/AutoUpdatingCameraImage.tsx +++ b/web/src/components/camera/AutoUpdatingCameraImage.tsx @@ -6,6 +6,8 @@ type AutoUpdatingCameraImageProps = { searchParams?: {}; showFps?: boolean; className?: string; + reloadInterval?: number; + fitAspect?: number; }; const MIN_LOAD_TIMEOUT_MS = 200; @@ -15,6 +17,8 @@ export default function AutoUpdatingCameraImage({ searchParams = "", showFps = true, className, + reloadInterval = MIN_LOAD_TIMEOUT_MS, + fitAspect, }: AutoUpdatingCameraImageProps) { const [key, setKey] = useState(Date.now()); const [fps, setFps] = useState("0"); @@ -23,14 +27,14 @@ export default function AutoUpdatingCameraImage({ const loadTime = Date.now() - key; if (showFps) { - setFps((1000 / Math.max(loadTime, MIN_LOAD_TIMEOUT_MS)).toFixed(1)); + setFps((1000 / Math.max(loadTime, reloadInterval)).toFixed(1)); } setTimeout( () => { setKey(Date.now()); }, - loadTime > MIN_LOAD_TIMEOUT_MS ? 1 : MIN_LOAD_TIMEOUT_MS + loadTime > reloadInterval ? 1 : reloadInterval ); }, [key, setFps]); @@ -39,6 +43,7 @@ export default function AutoUpdatingCameraImage({ {showFps ? Displaying at {fps}fps : null} diff --git a/web/src/components/camera/CameraImage.tsx b/web/src/components/camera/CameraImage.tsx index 853c2da09..04751f6d4 100644 --- a/web/src/components/camera/CameraImage.tsx +++ b/web/src/components/camera/CameraImage.tsx @@ -5,6 +5,7 @@ import ActivityIndicator from "../ui/activity-indicator"; import { useResizeObserver } from "@/hooks/resize-observer"; type CameraImageProps = { + className?: string; camera: string; onload?: (event: Event) => void; searchParams?: {}; @@ -13,6 +14,7 @@ type CameraImageProps = { }; export default function CameraImage({ + className, camera, onload, searchParams = "", @@ -88,11 +90,12 @@ export default function CameraImage({
{enabled ? ( { + if (!liveReady) { + return; + } + + if (!activeMotion && !activeTracking) { + setLiveReady(false); + } + }, [activeMotion, activeTracking, liveReady]); + // debug view settings const [showSettings, setShowSettings] = useState(false); @@ -80,7 +96,13 @@ export default function LivePlayer({ ); } else if (liveMode == "mse") { if ("MediaSource" in window || "ManagedMediaSource" in window) { - player = ; + player = ( + setLiveReady(true)} + /> + ); } else { player = (
@@ -131,31 +153,57 @@ export default function LivePlayer({ return (
- {player} -
- - + 2 || + cameraConfig.detect.width / cameraConfig.detect.height < 1 + ? undefined + : 16 / 9 + } + searchParams={`cache=${123}`} /> -
Motion
-
- {cameraConfig.audio.enabled_in_config && ( +
+ )} + + {liveChips && ( +
- -
Sound
+
Motion
- )} - - -
Tracking
-
-
+ {cameraConfig.audio.enabled_in_config && ( + + +
Sound
+
+ )} + + +
Tracking
+
+
+ )}
diff --git a/web/src/components/player/MsePlayer.tsx b/web/src/components/player/MsePlayer.tsx index c0fa8ae30..14ac3363a 100644 --- a/web/src/components/player/MsePlayer.tsx +++ b/web/src/components/player/MsePlayer.tsx @@ -4,9 +4,10 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; type MSEPlayerProps = { camera: string; className?: string; + onPlaying?: () => void; }; -function MSEPlayer({ camera, className }: MSEPlayerProps) { +function MSEPlayer({ camera, className, onPlaying }: MSEPlayerProps) { let connectTS: number = 0; const RECONNECT_TIMEOUT: number = 30000; @@ -250,6 +251,7 @@ function MSEPlayer({ camera, className }: MSEPlayerProps) { className={className} playsInline preload="auto" + onLoadedData={onPlaying} muted /> );