diff --git a/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run b/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run index 2754c0d09..0d237f432 100755 --- a/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run +++ b/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run @@ -8,6 +8,19 @@ set -o errexit -o nounset -o pipefail echo "[INFO] Starting NGINX..." +function set_worker_processes() { + # Capture number of assigned CPUs to calculate worker processes + local proc_count + + if proc_count=$(nproc --all) && [[ $proc_count -gt 4 ]]; then + proc_count=4; + fi + + sed -i "s/worker_processes auto;/worker_processes ${proc_count};/" /usr/local/nginx/conf/nginx.conf +} + +set_worker_processes + # Replace the bash process with the NGINX process, redirecting stderr to stdout exec 2>&1 exec nginx diff --git a/frigate/events/audio.py b/frigate/events/audio.py index fc8f38dad..074b44735 100644 --- a/frigate/events/audio.py +++ b/frigate/events/audio.py @@ -50,11 +50,13 @@ def get_ffmpeg_command(ffmpeg: FfmpegConfig) -> list[str]: or get_ffmpeg_arg_list(ffmpeg.input_args) ) return ( - ["ffmpeg", "-vn"] + ["ffmpeg", "-vn", "-threads", "1"] + input_args + ["-i"] + [ffmpeg_input.path] + [ + "-threads", + "1", "-f", f"{AUDIO_FORMAT}", "-ar", diff --git a/frigate/output/birdseye.py b/frigate/output/birdseye.py index 809ded174..2b17a4cf1 100644 --- a/frigate/output/birdseye.py +++ b/frigate/output/birdseye.py @@ -134,6 +134,8 @@ class FFMpegConverter(threading.Thread): ffmpeg_cmd = [ "ffmpeg", + "-threads", + "1", "-f", "rawvideo", "-pix_fmt", @@ -142,6 +144,8 @@ class FFMpegConverter(threading.Thread): f"{in_width}x{in_height}", "-i", "pipe:", + "-threads", + "1", "-f", "mpegts", "-s", diff --git a/frigate/output/camera.py b/frigate/output/camera.py index b63e0983a..b9c607375 100644 --- a/frigate/output/camera.py +++ b/frigate/output/camera.py @@ -31,6 +31,8 @@ class FFMpegConverter(threading.Thread): ffmpeg_cmd = [ "ffmpeg", + "-threads", + "1", "-f", "rawvideo", "-pix_fmt", @@ -39,6 +41,8 @@ class FFMpegConverter(threading.Thread): f"{in_width}x{in_height}", "-i", "pipe:", + "-threads", + "1", "-f", "mpegts", "-s", diff --git a/web/src/components/player/VideoControls.tsx b/web/src/components/player/VideoControls.tsx index 168f04fee..7e0259b63 100644 --- a/web/src/components/player/VideoControls.tsx +++ b/web/src/components/player/VideoControls.tsx @@ -139,6 +139,11 @@ export default function VideoControls({ const onKeyboardShortcut = useCallback( (key: string, down: boolean, repeat: boolean) => { switch (key) { + case "ArrowDown": + if (down) { + onSeek(-1); + } + break; case "ArrowLeft": if (down) { onSeek(-10); @@ -149,6 +154,11 @@ export default function VideoControls({ onSeek(10); } break; + case "ArrowUp": + if (down) { + onSeek(1); + } + break; case "f": if (setFullscreen && down && !repeat) { setFullscreen(!fullscreen); @@ -171,7 +181,9 @@ export default function VideoControls({ [video, isPlaying, fullscreen, setFullscreen, onSeek], ); useKeyboardListener( - hotKeys ? ["ArrowLeft", "ArrowRight", "f", "m", " "] : [], + hotKeys + ? ["ArrowDown", "ArrowLeft", "ArrowRight", "ArrowUp", "f", "m", " "] + : [], onKeyboardShortcut, );