Sweep: crop the timecode band off published streams (re-encode after decode); vgdeband.sh catch-up
The published recording is the game picture + audio + tmcd track, nothing else. Streams without the band are still remuxed losslessly. vgstrip plan exports TC_BAND and marks the sidecar band_removed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
15
README.md
15
README.md
@@ -386,7 +386,7 @@ restarts only copyparty.
|
||||
## Timecode for multicam editing (frame accurate)
|
||||
|
||||
Every published stream carries a QuickTime **timecode track** (`tmcd`, time of day in Eastern, at the file's
|
||||
frame rate) and a UTC `creation_time`, written by the sweep during the lossless remux, plus a sidecar
|
||||
frame rate) and a UTC `creation_time`, written by the sweep when it publishes the file, plus a sidecar
|
||||
`<Title>__<ts>.json` with the exact capture time (the Jellyfin plugin reads it). Resolve and Premiere read the
|
||||
track natively: drop clips from several streamers on a multicam timeline, sync by timecode.
|
||||
|
||||
@@ -394,14 +394,19 @@ Where the time comes from, best first:
|
||||
1. **Overscan band** — a thin strip of extra rows below the picture carrying the *server* clock, encoded
|
||||
(black/white cells, format in `bin/vgstrip.py`) plus a small readable clock. The server decodes it
|
||||
(`bin/vgstrip.py`) at the start, middle and end of each recording → the timecode is frame-accurate at the
|
||||
start and the sidecar records drift over the file. Game image untouched. OBS: dock → *Timecode band* →
|
||||
start and the sidecar records drift over the file. **Then the band is cropped off**: the sweep re-encodes the
|
||||
stream (libx264 CRF 18, frame timing preserved, audio copied) so the published file is the game image + audio +
|
||||
the `tmcd` track and nothing else; the raw with the band is deleted (`KEEP_RAW_STREAMS=1` keeps it in `.src/`).
|
||||
Streams without the band are remuxed losslessly. Cost: a 3 h 1440p60 night is a few hours of CPU on the
|
||||
E-2136; the sweep is niced. OBS: dock → *Timecode band* →
|
||||
"Add band + clock source" (canvas grows by W/160 rows, a locked browser source `Vanguard Clock` →
|
||||
`https://live.BASE/dock/clock/` sits in the band; only while not streaming). Go Live: the "Timecode band" checkbox (default on).
|
||||
2. **Server arrival time** (no band) — microseconds in the recording filename. Within ~0.1–0.3 s per streamer
|
||||
(encoder + network delay); coarse but always available.
|
||||
|
||||
Viewing: the live portal crops the band; Jellyfin shows it as a thin strip at the bottom (VHS-style);
|
||||
**editors export at the game resolution (e.g. 2560×1440) which drops the band** — finals carry nothing.
|
||||
Viewing: the live portal crops the band on the live picture (the only place it still exists); recordings in
|
||||
Jellyfin, copyparty and the editors' timelines are already at game resolution. Recordings published before
|
||||
the crop existed: `sudo vgdeband.sh [FILE…]` re-encodes them the same way and marks the sidecar.
|
||||
Cross-check when it matters: everyone is in the same voice chat, so audio-waveform sync is sample-accurate.
|
||||
Why continuous and not a start burst: a PC clock drifts vs the server (10 ppm ≈ 4 frames over 2 h).
|
||||
|
||||
@@ -528,7 +533,7 @@ upscaled; aspect kept).
|
||||
| input | action |
|
||||
|-------|--------|
|
||||
| already compliant | nothing |
|
||||
| MediaMTX recording in `<Title>/.live/` (fragmented MP4) | once idle 3 min: decode the timecode band (or use arrival time), lossless remux to `<user>/<Title>__<ts>.mp4` with a `tmcd` track + `creation_time`, write the `.json` sidecar, remove `.live` and the empty title folder |
|
||||
| MediaMTX recording in `<Title>/.live/` (fragmented MP4) | once idle 3 min: decode the timecode band (or use arrival time), then publish to `<user>/<Title>__<ts>.mp4` with a `tmcd` track + `creation_time` — band present: re-encode with the band cropped off; no band: lossless remux — write the `.json` sidecar, remove `.live` and the empty title folder |
|
||||
| in a Syncthing folder (`.stfolder` marker) | compliant / index-only: untouched; otherwise convert → `name.mp4`, add raw to `.stlocal`, delete raw (one copy) |
|
||||
| HEVC / 10-bit / VFR / MKV / >1440p / >60fps / non-AAC | full-res re-encode (x264 veryfast CRF 18) → `name.mp4`; source kept in `.src/` |
|
||||
| ffmpeg fails or duration mismatch | `name.normalize-failed.log` written, file skipped until that log is deleted |
|
||||
|
||||
Reference in New Issue
Block a user