From 9dc81ae5aa59cf1ca353a6b343dc05b37957ba4d Mon Sep 17 00:00:00 2001 From: Brandyn / Techy Date: Sat, 31 Oct 2026 16:25:08 -0500 Subject: [PATCH] README/STATUS: gap filling availability and the on/off commands Co-Authored-By: Claude Fable 5.1 --- README.md | 13 ++++++++++--- STATUS.md | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b25c062..e5c0be3 100644 --- a/README.md +++ b/README.md @@ -320,9 +320,16 @@ frame that exists is still at the right time — the timecode stays correct, and hold the last frame across the hole with audio in sync. By default the sweep does **not** re-encode a stream to fill holes (hours of CPU on this box); the sidecar lists them (`gaps.count`, `total_missing_ms`, first 50 positions). Premiere preserves timing on such files; in Resolve check the clip's frame-rate interpretation. -Opt-in filling: `Environment=FILL_GAPS_MS=1000` in `normalize-sweep.service` makes the sweep re-encode any -stream whose holes total ≥ 1 s to constant frame rate with duplicated frames (raw kept in `.src/`, timecode -carried over). Sensible once the box has a hardware encoder (SYS-3). Clips are always converted to CFR. +**Gap filling (available, off by default).** The sweep can re-encode a stream whose holes total at least +`FILL_GAPS_MS` milliseconds to constant frame rate with duplicated frames (raw kept in `.src/`, timecode carried +over). It costs ~2× the stream length in CPU on the E-2136, so it is off until the box has a hardware encoder. +Turn it on (threshold 1 s) / off, on the server: + + sudo sed -i 's|^#* *Environment=FILL_GAPS_MS=.*|Environment=FILL_GAPS_MS=1000|' /etc/systemd/system/normalize-sweep.service && sudo systemctl daemon-reload + sudo sed -i 's|^Environment=FILL_GAPS_MS=.*|# Environment=FILL_GAPS_MS=1000|' /etc/systemd/system/normalize-sweep.service && sudo systemctl daemon-reload + +Check: `systemctl show normalize-sweep -p Environment`. Takes effect on the next sweep run; already-published +files are not revisited. Clips are always converted to CFR regardless. ## Layout on the server diff --git a/STATUS.md b/STATUS.md index 1b7b86a..5b492a0 100644 --- a/STATUS.md +++ b/STATUS.md @@ -83,7 +83,7 @@ Source of truth: this repo, `techy/Media-Server-Setup` on the stack's own Gitea - Caddy runs in a container: anything it serves from disk must be a mount (`/srv/live` was missing → 404). - Go Live quality depends on the browser's encoder: Windows Chrome uses the GPU (fine); Linux Chromium on NVIDIA is software H.264 Baseline (soft at any bitrate, CPU-limited at 1440p60) and cannot be fixed by flags — Linux streamers use OBS. The stats strip shows encoder + profile. - Several videos inside one non-season folder = ONE Jellyfin episode with "versions". Streams are therefore published flat as `__<ts>.mp4` in the streamer's folder (plugin 0.1.3 parses the title from the name). Four or five helmet cams a night each get their own episode. -- Streams are never re-encoded for VFR/gaps (dropped frames are legitimate; a 3 h re-encode is hours of CPU). The timecode sidecar lists gaps instead. Clips still get CFR. +- Streams are not re-encoded for VFR/gaps by default (dropped frames are legitimate; a 3 h re-encode is hours of CPU); players hold the last frame across a gap. The timecode sidecar lists gaps. **Gap filling is available** (`FILL_GAPS_MS` in `normalize-sweep.service`, README "Timecode") — turn on when the box has a hardware encoder. Clips always get CFR. - The sweep's VFR check used a gawk-only function; Debian's mawk made it pass everything silently. Portable now. - A deploy block that is only half-run leaves old binaries in `/usr/local/bin`; `grep -c` the installed script before blaming logic. - MediaMTX hot-reloads `paths`/recording settings but NOT `authMethod`/auth settings: those need a container restart (between streams).