From 98d77e669712fb6d7cda572d26a57c39264ac898 Mon Sep 17 00:00:00 2001 From: chk <79915315+ChKendel@users.noreply.github.com> Date: Wed, 3 Jun 2026 20:56:11 +0200 Subject: [PATCH] Claude: Fix --- doc/02_Measurements.md | 0 docker-compose.yaml | 8 +++-- public/viewer.js | 77 ++++++++++++++++++++++++++++++++++++------ server.js | 4 ++- 4 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 doc/02_Measurements.md 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