import WebRtcPlayer from "./WebRTCPlayer"; import { CameraConfig } from "@/types/frigateConfig"; import AutoUpdatingCameraImage from "../camera/AutoUpdatingCameraImage"; import ActivityIndicator from "../indicators/activity-indicator"; import { useEffect, useMemo, useState } from "react"; import MSEPlayer from "./MsePlayer"; import JSMpegPlayer from "./JSMpegPlayer"; import { MdCircle } from "react-icons/md"; import useCameraActivity from "@/hooks/use-camera-activity"; import { useRecordingsState } from "@/api/ws"; import { LivePlayerMode } from "@/types/live"; import useCameraLiveMode from "@/hooks/use-camera-live-mode"; import { isDesktop } from "react-device-detect"; import CameraActivityIndicator from "../indicators/CameraActivityIndicator"; type LivePlayerProps = { className?: string; cameraConfig: CameraConfig; preferredLiveMode?: LivePlayerMode; showStillWithoutActivity?: boolean; windowVisible?: boolean; playAudio?: boolean; micEnabled?: boolean; // only webrtc supports mic onClick?: () => void; }; export default function LivePlayer({ className, cameraConfig, preferredLiveMode, showStillWithoutActivity = true, windowVisible = true, playAudio = false, micEnabled = false, onClick, }: LivePlayerProps) { // camera activity const { activeMotion, activeAudio, activeTracking } = useCameraActivity(cameraConfig); const cameraActive = useMemo( () => !showStillWithoutActivity || (windowVisible && (activeMotion || activeTracking)), [activeMotion, activeTracking, showStillWithoutActivity, windowVisible], ); // camera live state const liveMode = useCameraLiveMode(cameraConfig, preferredLiveMode); const [liveReady, setLiveReady] = useState(false); useEffect(() => { if (!liveReady) { if (cameraActive && liveMode == "jsmpeg") { setLiveReady(true); } return; } if (!cameraActive) { setLiveReady(false); } // live mode won't change // eslint-disable-next-line react-hooks/exhaustive-deps }, [cameraActive, liveReady]); const { payload: recording } = useRecordingsState(cameraConfig.name); // camera still state const stillReloadInterval = useMemo(() => { if (!windowVisible) { return -1; // no reason to update the image when the window is not visible } if (liveReady) { return 60000; } if (cameraActive) { return 200; } return 30000; }, [liveReady, cameraActive, windowVisible]); if (!cameraConfig) { return ; } let player; if (liveMode == "webrtc") { player = ( setLiveReady(true)} /> ); } else if (liveMode == "mse") { if ("MediaSource" in window || "ManagedMediaSource" in window) { player = ( setLiveReady(true)} /> ); } else { player = (
MSE is only supported on iOS 17.1+. You'll need to update if available or use jsmpeg / webRTC streams. See the docs for more info.
); } } else if (liveMode == "jsmpeg") { player = ( ); } else { player = ; } return (
{player}
{(activeMotion || (cameraConfig.audio.enabled_in_config && activeAudio)) && ( )}
{isDesktop && (
{recording == "ON" && ( )}
)}
); }