diff --git a/doc/02_Measurements.md b/doc/02_Measurements.md new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yaml b/docker-compose.yaml index e08fa09..89ae9db 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -25,8 +25,12 @@ configs: # Komplette go2rtc-Config eingebettet – keine separate Datei nötig. content: | streams: - cam0: "ffmpeg:device?video=/dev/video0&video_size=640x480#video=h264#video=mjpeg" - cam1: "ffmpeg:device?video=/dev/video2&video_size=640x480#video=h264#video=mjpeg" + # Einfache Form: von go2rtc bestätigt funktionsfähig für beide Kameras. + # device? wurde verworfen (generiert FFmpeg ohne -input_format mjpeg → Timeout). + # #video=h264 → für WebRTC (transcodiert) + # #video=mjpeg → für MJPEG-Fallback + /api/frame.jpeg (Snapshot) + cam0: "ffmpeg:/dev/video0#video=h264#video=mjpeg" + cam1: "ffmpeg:/dev/video2#video=h264#video=mjpeg" webrtc: listen: ":8555" candidates: diff --git a/public/viewer.js b/public/viewer.js index 7c15a3c..ea43023 100644 --- a/public/viewer.js +++ b/public/viewer.js @@ -1,18 +1,39 @@ 'use strict'; -// go2rtc-Player-Modi in Fallback-Reihenfolge. -// webrtc zuerst (niedrigste Latenz), dann MSE, dann MJPEG – das verhindert -// schwarze Seiten: schlägt WebRTC fehl, springt der Player automatisch weiter. +// go2rtc Player-Modi – Fallback-Reihenfolge: WebRTC → MSE → MJPEG +// Schlägt WebRTC fehl, springt der go2rtc-Player automatisch weiter → kein schwarzes Bild. const MODE = 'webrtc,mse,mjpeg'; +// ── Logging-Hilfe (sichtbar in Browser DevTools → Console) ────────────────── +const LOG_PREFIX = '[AppRobotWebcam]'; +function log(cam, msg) { console.log(`${LOG_PREFIX}[${cam}] ${msg}`); } +function warn(cam, msg) { console.warn(`${LOG_PREFIX}[${cam}] ⚠ ${msg}`); } +function logErr(cam, msg, e) { console.error(`${LOG_PREFIX}[${cam}] ✗ ${msg}`, e ?? ''); } + +// ── Kamera-View aufbauen ───────────────────────────────────────────────────── function buildCamera(camId, container) { + const wsUrl = `/api/ws?src=${encodeURIComponent(camId)}`; + log(camId, `View erstellt mode=${MODE} ws=${wsUrl}`); + const box = document.createElement('div'); box.className = 'cam-box'; - // go2rtc Web-Component – verbindet sich relativ auf /api/ws (→ Node-Proxy) + // go2rtc Web-Component: verbindet sich via WebSocket zu /api/ws (→ Node-Proxy → go2rtc) const stream = document.createElement('video-stream'); - stream.mode = MODE; - stream.src = `/api/ws?src=${encodeURIComponent(camId)}`; + stream.mode = MODE; + + // Events vom inneren