mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
Web & ffmpeg bug fixes (#9525)
* Fix scaling for long timeline lists * Better handle taller video in player * Fix birdseye options * Fix ffmpeg auto detect
This commit is contained in:
parent
af3f6dadcb
commit
c5819478d3
@ -1124,6 +1124,9 @@ class FrigateConfig(FrigateBaseModel):
|
|||||||
{"name": name, **merged_config}
|
{"name": name, **merged_config}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if camera_config.ffmpeg.hwaccel_args == "auto":
|
||||||
|
camera_config.ffmpeg.hwaccel_args = config.ffmpeg.hwaccel_args
|
||||||
|
|
||||||
if (
|
if (
|
||||||
camera_config.detect.height is None
|
camera_config.detect.height is None
|
||||||
or camera_config.detect.width is None
|
or camera_config.detect.width is None
|
||||||
|
@ -47,7 +47,7 @@ export default function TimelineItemCard({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
className="relative m-2 flex w-full h-20 xl:h-24 3xl:h-28 4xl:h-36 cursor-pointer"
|
className="relative mx-2 mb-2 flex w-full h-20 xl:h-24 3xl:h-28 4xl:h-36 cursor-pointer"
|
||||||
onClick={onSelect}
|
onClick={onSelect}
|
||||||
>
|
>
|
||||||
<div className="w-32 xl:w-40 3xl:w-44 4xl:w-60 p-2">
|
<div className="w-32 xl:w-40 3xl:w-44 4xl:w-60 p-2">
|
||||||
|
@ -40,6 +40,19 @@ export default function DynamicVideoPlayer({
|
|||||||
[config]
|
[config]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// playback behavior
|
||||||
|
const tallVideo = useMemo(() => {
|
||||||
|
if (!config) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
config.cameras[camera].detect.width /
|
||||||
|
config.cameras[camera].detect.height <
|
||||||
|
1.7
|
||||||
|
);
|
||||||
|
}, [config]);
|
||||||
|
|
||||||
// controlling playback
|
// controlling playback
|
||||||
|
|
||||||
const playerRef = useRef<Player | undefined>(undefined);
|
const playerRef = useRef<Player | undefined>(undefined);
|
||||||
@ -64,6 +77,7 @@ export default function DynamicVideoPlayer({
|
|||||||
}, [config]);
|
}, [config]);
|
||||||
|
|
||||||
// keyboard control
|
// keyboard control
|
||||||
|
|
||||||
const onKeyboardShortcut = useCallback(
|
const onKeyboardShortcut = useCallback(
|
||||||
(key: string, down: boolean, repeat: boolean) => {
|
(key: string, down: boolean, repeat: boolean) => {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
@ -185,6 +199,8 @@ export default function DynamicVideoPlayer({
|
|||||||
return <ActivityIndicator />;
|
return <ActivityIndicator />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//console.log(`${config.detect.width / config.detect.height < 1.7 ? "16:9" : undefined}`)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={className}>
|
<div className={className}>
|
||||||
<div
|
<div
|
||||||
@ -197,6 +213,7 @@ export default function DynamicVideoPlayer({
|
|||||||
preload: "auto",
|
preload: "auto",
|
||||||
autoplay: true,
|
autoplay: true,
|
||||||
sources: [initialPlaybackSource],
|
sources: [initialPlaybackSource],
|
||||||
|
aspectRatio: tallVideo ? "16:9" : undefined,
|
||||||
controlBar: {
|
controlBar: {
|
||||||
remainingTimeDisplay: false,
|
remainingTimeDisplay: false,
|
||||||
progressControl: {
|
progressControl: {
|
||||||
@ -239,6 +256,7 @@ export default function DynamicVideoPlayer({
|
|||||||
muted: true,
|
muted: true,
|
||||||
loadingSpinner: false,
|
loadingSpinner: false,
|
||||||
sources: hasPreview ? initialPreviewSource : null,
|
sources: hasPreview ? initialPreviewSource : null,
|
||||||
|
aspectRatio: tallVideo ? "16:9" : undefined,
|
||||||
}}
|
}}
|
||||||
seekOptions={{}}
|
seekOptions={{}}
|
||||||
onReady={(player) => {
|
onReady={(player) => {
|
||||||
|
@ -37,8 +37,15 @@ function Live() {
|
|||||||
);
|
);
|
||||||
}, [config]);
|
}, [config]);
|
||||||
const restreamEnabled = useMemo(() => {
|
const restreamEnabled = useMemo(() => {
|
||||||
|
if (!config) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (camera == "birdseye") {
|
||||||
|
return config.birdseye.restream;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
config &&
|
|
||||||
cameraConfig &&
|
cameraConfig &&
|
||||||
Object.keys(config.go2rtc.streams || {}).includes(
|
Object.keys(config.go2rtc.streams || {}).includes(
|
||||||
cameraConfig.live.stream_name
|
cameraConfig.live.stream_name
|
||||||
|
@ -109,7 +109,7 @@ export default function DesktopTimelineView({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full flex flex-col">
|
<div className="w-full flex flex-col">
|
||||||
<div className="flex max-h-[60%]">
|
<div className="flex mt-2 max-h-[60%]">
|
||||||
<DynamicVideoPlayer
|
<DynamicVideoPlayer
|
||||||
className="w-2/3 bg-black flex justify-center items-center"
|
className="w-2/3 bg-black flex justify-center items-center"
|
||||||
camera={initialPlayback.camera}
|
camera={initialPlayback.camera}
|
||||||
@ -129,22 +129,24 @@ export default function DesktopTimelineView({
|
|||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<div className="px-2 h-full w-1/3 overflow-y-auto overflow-x-hidden">
|
<div className="relative h-full w-1/3">
|
||||||
{selectedPlayback.timelineItems.map((timeline) => {
|
<div className="absolute px-2 left-0 top-0 right-0 bottom-0 overflow-y-auto overflow-x-hidden">
|
||||||
return (
|
{selectedPlayback.timelineItems.map((timeline) => {
|
||||||
<TimelineItemCard
|
return (
|
||||||
key={timeline.timestamp}
|
<TimelineItemCard
|
||||||
timeline={timeline}
|
key={timeline.timestamp}
|
||||||
relevantPreview={selectedPlayback.relevantPreview}
|
timeline={timeline}
|
||||||
onSelect={() => {
|
relevantPreview={selectedPlayback.relevantPreview}
|
||||||
controllerRef.current?.seekToTimelineItem(timeline);
|
onSelect={() => {
|
||||||
}}
|
controllerRef.current?.seekToTimelineItem(timeline);
|
||||||
/>
|
}}
|
||||||
);
|
/>
|
||||||
})}
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-4 w-full h-full relative">
|
<div className="relative mt-4 w-full h-full">
|
||||||
<div className="absolute left-0 top-0 right-0 bottom-0 overflow-auto">
|
<div className="absolute left-0 top-0 right-0 bottom-0 overflow-auto">
|
||||||
{timelineStack.playbackItems.map((timeline) => {
|
{timelineStack.playbackItems.map((timeline) => {
|
||||||
const isInitiallySelected =
|
const isInitiallySelected =
|
||||||
|
Loading…
Reference in New Issue
Block a user