diff --git a/docker-compose.yaml b/docker-compose.yaml index a1f35a0..9723118 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -30,6 +30,11 @@ configs: # NICHT #video=copy: am 2026-06-04 getestet → CPU 50% → 107% (schlechter). Verworfen. cam0: "ffmpeg:device?video=/dev/video0&input_format=mjpeg&video_size=640x480&framerate=30#video=mjpeg" cam1: "ffmpeg:device?video=/dev/video2&input_format=mjpeg&video_size=640x480&framerate=30#video=mjpeg" + # Phase-2 Hi-Res: on-demand (dormant bis erster Consumer). #video=copy auf dieser + # Kamera defekt (04_*), daher #video=mjpeg. Nur ~1-2s aktiv pro Grab. + # Rollback: diese beiden Zeilen entfernen + Redeploy. + cam0_hires: "ffmpeg:device?video=/dev/video0&input_format=mjpeg&video_size=1280x960&framerate=15#video=mjpeg" + cam1_hires: "ffmpeg:device?video=/dev/video2&input_format=mjpeg&video_size=1280x960&framerate=15#video=mjpeg" webrtc: listen: ":8555" candidates: diff --git a/public/viewer.js b/public/viewer.js index 424b28a..d2f28e6 100644 --- a/public/viewer.js +++ b/public/viewer.js @@ -26,6 +26,7 @@ const P = '[WebcamViewer]'; const log = (c, m) => console.log(`${P}[${c}] ${m}`); const warn = (c, m) => console.warn(`${P}[${c}] ⚠ ${m}`); const logErr = (c, m, e) => console.error(`${P}[${c}] ✗ ${m}`, e ?? ''); +const sleep = ms => new Promise(r => setTimeout(r, ms)); let GO2RTC_PORT = 1984; const cameras = []; // { id, box, infoEl, toggleBtn, active, startedAt, playingSince, statsLast, badTicks, autoOff } @@ -72,41 +73,35 @@ function stopStream(cam, auto = false) { if (auto) showNotice(); } -// ── Hi-Res-Test (Phase 1): Geräte-Freigabe messen ───────────────────────────── -// Ablauf (doc/05_screenShot_roadmap.md, Phase 1): -// 1. aktuellen Live-Frame auf einfrieren + „HD Image Work" einblenden -// 2. entfernen → cam verliert seinen Consumer (das „Umhängen") -// 3. GET /api/snapshot/:id/release-test → Server misst, wann das Gerät frei wird -// 4. egal wie es ausgeht: Canvas weg, wieder einsetzen (Live zurück) -// cam selbst wird nie verändert; im schlimmsten Fall nur ein Reconnect. -function showFreezeCanvas(cam) { +// ── Hi-Res Canvas-Freeze + Grab (Phase 2) ─────────────────────────────────── + +// Holt letzten 640er-Frame von /api/snapshot und zeichnet ihn auf canvas. +// Robuster als drawImage(video-stream): go2rtc MJPEG-Modus hat kein