mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-09 12:45:25 +03:00
Smooth current hour as well
This commit is contained in:
parent
11b7b90b2b
commit
a351bea869
@ -35,6 +35,8 @@ export default function PreviewPlayer({
|
|||||||
onControllerReady,
|
onControllerReady,
|
||||||
onClick,
|
onClick,
|
||||||
}: PreviewPlayerProps) {
|
}: PreviewPlayerProps) {
|
||||||
|
const [currentHourFrame, setCurrentHourFrame] = useState<string>();
|
||||||
|
|
||||||
if (isCurrentHour(timeRange.end)) {
|
if (isCurrentHour(timeRange.end)) {
|
||||||
return (
|
return (
|
||||||
<PreviewFramesPlayer
|
<PreviewFramesPlayer
|
||||||
@ -44,6 +46,7 @@ export default function PreviewPlayer({
|
|||||||
startTime={startTime}
|
startTime={startTime}
|
||||||
onControllerReady={onControllerReady}
|
onControllerReady={onControllerReady}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
|
setCurrentHourFrame={setCurrentHourFrame}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -56,8 +59,10 @@ export default function PreviewPlayer({
|
|||||||
cameraPreviews={cameraPreviews}
|
cameraPreviews={cameraPreviews}
|
||||||
startTime={startTime}
|
startTime={startTime}
|
||||||
isScrubbing={isScrubbing}
|
isScrubbing={isScrubbing}
|
||||||
|
currentHourFrame={currentHourFrame}
|
||||||
onControllerReady={onControllerReady}
|
onControllerReady={onControllerReady}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
|
setCurrentHourFrame={setCurrentHourFrame}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -83,8 +88,10 @@ type PreviewVideoPlayerProps = {
|
|||||||
cameraPreviews: Preview[];
|
cameraPreviews: Preview[];
|
||||||
startTime?: number;
|
startTime?: number;
|
||||||
isScrubbing: boolean;
|
isScrubbing: boolean;
|
||||||
|
currentHourFrame?: string;
|
||||||
onControllerReady: (controller: PreviewVideoController) => void;
|
onControllerReady: (controller: PreviewVideoController) => void;
|
||||||
onClick?: () => void;
|
onClick?: () => void;
|
||||||
|
setCurrentHourFrame: (src: string | undefined) => void;
|
||||||
};
|
};
|
||||||
function PreviewVideoPlayer({
|
function PreviewVideoPlayer({
|
||||||
className,
|
className,
|
||||||
@ -93,8 +100,10 @@ function PreviewVideoPlayer({
|
|||||||
cameraPreviews,
|
cameraPreviews,
|
||||||
startTime,
|
startTime,
|
||||||
isScrubbing,
|
isScrubbing,
|
||||||
|
currentHourFrame,
|
||||||
onControllerReady,
|
onControllerReady,
|
||||||
onClick,
|
onClick,
|
||||||
|
setCurrentHourFrame,
|
||||||
}: PreviewVideoPlayerProps) {
|
}: PreviewVideoPlayerProps) {
|
||||||
const { data: config } = useSWR<FrigateConfig>("config");
|
const { data: config } = useSWR<FrigateConfig>("config");
|
||||||
|
|
||||||
@ -224,6 +233,12 @@ function PreviewVideoPlayer({
|
|||||||
className={`relative w-full rounded-2xl overflow-hidden ${className ?? ""} ${onClick ? "cursor-pointer" : ""}`}
|
className={`relative w-full rounded-2xl overflow-hidden ${className ?? ""} ${onClick ? "cursor-pointer" : ""}`}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
>
|
>
|
||||||
|
{currentHourFrame && (
|
||||||
|
<img
|
||||||
|
className="absolute size-full object-contain"
|
||||||
|
src={currentHourFrame}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<canvas
|
<canvas
|
||||||
ref={canvasRef}
|
ref={canvasRef}
|
||||||
width={videoWidth}
|
width={videoWidth}
|
||||||
@ -240,6 +255,7 @@ function PreviewVideoPlayer({
|
|||||||
disableRemotePlayback
|
disableRemotePlayback
|
||||||
onSeeked={onPreviewSeeked}
|
onSeeked={onPreviewSeeked}
|
||||||
onLoadedData={() => {
|
onLoadedData={() => {
|
||||||
|
setCurrentHourFrame(undefined);
|
||||||
setLoaded(true);
|
setLoaded(true);
|
||||||
|
|
||||||
if (controller) {
|
if (controller) {
|
||||||
@ -257,7 +273,9 @@ function PreviewVideoPlayer({
|
|||||||
<source src={currentPreview.src} type={currentPreview.type} />
|
<source src={currentPreview.src} type={currentPreview.type} />
|
||||||
)}
|
)}
|
||||||
</video>
|
</video>
|
||||||
{!loaded && !hasCanvas && <Skeleton className="absolute inset-0" />}
|
{!loaded && !hasCanvas && !currentHourFrame && (
|
||||||
|
<Skeleton className="absolute inset-0" />
|
||||||
|
)}
|
||||||
{cameraPreviews && !currentPreview && (
|
{cameraPreviews && !currentPreview && (
|
||||||
<div className="absolute inset-0 bg-black text-white rounded-2xl flex justify-center items-center">
|
<div className="absolute inset-0 bg-black text-white rounded-2xl flex justify-center items-center">
|
||||||
No Preview Found
|
No Preview Found
|
||||||
@ -359,12 +377,14 @@ type PreviewFramesPlayerProps = {
|
|||||||
startTime?: number;
|
startTime?: number;
|
||||||
onControllerReady: (controller: PreviewController) => void;
|
onControllerReady: (controller: PreviewController) => void;
|
||||||
onClick?: () => void;
|
onClick?: () => void;
|
||||||
|
setCurrentHourFrame: (src: string) => void;
|
||||||
};
|
};
|
||||||
function PreviewFramesPlayer({
|
function PreviewFramesPlayer({
|
||||||
className,
|
className,
|
||||||
camera,
|
camera,
|
||||||
timeRange,
|
timeRange,
|
||||||
startTime,
|
startTime,
|
||||||
|
setCurrentHourFrame,
|
||||||
onControllerReady,
|
onControllerReady,
|
||||||
onClick,
|
onClick,
|
||||||
}: PreviewFramesPlayerProps) {
|
}: PreviewFramesPlayerProps) {
|
||||||
@ -395,7 +415,12 @@ function PreviewFramesPlayer({
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new PreviewFramesController(camera, imgRef, frameTimes);
|
return new PreviewFramesController(
|
||||||
|
camera,
|
||||||
|
imgRef,
|
||||||
|
frameTimes,
|
||||||
|
setCurrentHourFrame,
|
||||||
|
);
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [imgRef, frameTimes, imgRef.current]);
|
}, [imgRef, frameTimes, imgRef.current]);
|
||||||
|
|
||||||
@ -460,15 +485,18 @@ class PreviewFramesController extends PreviewController {
|
|||||||
frameTimes: number[];
|
frameTimes: number[];
|
||||||
seeking: boolean = false;
|
seeking: boolean = false;
|
||||||
private timeToSeek: number | undefined = undefined;
|
private timeToSeek: number | undefined = undefined;
|
||||||
|
private setCurrentFrame: (src: string) => void;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
camera: string,
|
camera: string,
|
||||||
imgController: MutableRefObject<HTMLImageElement | null>,
|
imgController: MutableRefObject<HTMLImageElement | null>,
|
||||||
frameTimes: number[],
|
frameTimes: number[],
|
||||||
|
setCurrentFrame: (src: string) => void,
|
||||||
) {
|
) {
|
||||||
super(camera);
|
super(camera);
|
||||||
this.imgController = imgController;
|
this.imgController = imgController;
|
||||||
this.frameTimes = frameTimes;
|
this.frameTimes = frameTimes;
|
||||||
|
this.setCurrentFrame = setCurrentFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
override scrubToTimestamp(time: number): boolean {
|
override scrubToTimestamp(time: number): boolean {
|
||||||
@ -508,6 +536,7 @@ class PreviewFramesController extends PreviewController {
|
|||||||
|
|
||||||
if (this.imgController.current.src != newSrc) {
|
if (this.imgController.current.src != newSrc) {
|
||||||
this.imgController.current.src = newSrc;
|
this.imgController.current.src = newSrc;
|
||||||
|
this.setCurrentFrame(newSrc);
|
||||||
} else {
|
} else {
|
||||||
this.timeToSeek = undefined;
|
this.timeToSeek = undefined;
|
||||||
this.seeking = false;
|
this.seeking = false;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user