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:
Nicolas Mowen 2024-02-01 05:44:10 -07:00 committed by GitHub
parent af3f6dadcb
commit c5819478d3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 47 additions and 17 deletions

View File

@ -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

View File

@ -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">

View File

@ -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) => {

View File

@ -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

View File

@ -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 =