Commit Graph

14 Commits

Author SHA1 Message Date
Julian Vollmer 6ff2c329b0 Fix audio on Android Chrome / Mi Browser
- audioCtx.resume() explizit aufrufen (Android suspendiert AudioContext)
- ws:// vs wss:// dynamisch je nach Seitenprotokoll
- Button zeigt "Verbinde…" bis WebSocket offen ist
- onclose Handler setzt Button zurück auf "Ton an"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 18:42:08 +02:00
Julian Vollmer 28eb07bcab Fix audio device: dynamische Kartensuche statt hardcoded plughw:2,0
Nach Neustart wechselt die ALSA-Kartennummer (war 2, ist jetzt 1).
find_audio_device() sucht per /proc/asound/cards nach dem USB-Gerät.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 18:36:10 +02:00
Julian Vollmer e4b8cc55f7 Replace HTTP audio stream with WebSocket + Web Audio API
HTTP Ogg-Streaming hat zu viel Latenz durch Browser-Buffering.
Neuer Ansatz: Raw PCM S16_LE über WebSocket, Web Audio API spielt
direkt ab. Latenz ~100-200ms statt mehrere Sekunden.

- /audio-ws: WebSocket-Endpunkt, streamt arecord PCM-Chunks (512 Bytes = ~32ms)
- live.html: startAudio() öffnet WebSocket, dekodiert PCM zu Float32,
  plant Playback mit AudioContext.createBufferSource() in 40ms-Queue

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 18:23:47 +02:00
Julian Vollmer fa9888f83e Reduce audio stream latency
- fflags nobuffer + flags low_delay: ffmpeg Input-Buffer deaktiviert
- frame_duration 20ms + page_duration 20ms: kleinste Ogg-Pages
- flush_packets 1: sofortiges Schreiben nach jedem Frame
- HTTP Header no-cache + X-Accel-Buffering no: kein Proxy/Flask-Buffering

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 18:19:34 +02:00
Julian Vollmer a53eceb83a Add audio streaming via USB microphone
- Neuer Endpunkt GET /audio: ffmpeg liest von plughw:2,0 (USB-Soundkarte CM108)
  und streamt Ogg/Opus mit 16kHz Mono 24kbps
- live.html: Ton-Button (🔇/🔊) startet/stoppt Audio-Stream on demand
- setup.sh: ffmpeg installieren, pi zur audio-Gruppe hinzufügen
- pi zur audio-Gruppe hinzugefügt (war nötig für /dev/snd Zugriff)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 18:15:21 +02:00
Julian Vollmer 73faa66535 Support 3 parallel stream clients via CameraBroadcaster
Vorher: pro Client ein eigener rpicam-vid-Prozess → 2. und 3. Client schlagen fehl.
Jetzt: CameraBroadcaster startet rpicam-vid einmal in einem Hintergrund-Thread,
alle Clients lesen denselben aktuellen Frame. Flask läuft mit threaded=True.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 16:54:15 +02:00
Julian Vollmer 6f0aa41f9e Fix camera access: add pi to video group
rpicam benötigt Zugriff auf /dev/dma_heap/ (crw-rw---- root:video).
pi war nicht in der video-Gruppe → usermod -aG video pi in setup.sh ergänzt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 16:45:52 +02:00
Julian Vollmer 30180e5923 Persist AP override across reboots
/tmp/babycam-ap-override → /var/lib/babycam/ap-override
setup.sh legt /var/lib/babycam mit chown pi:pi an

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 15:58:14 +02:00
Julian Vollmer 7cfc958cf0 Add manual AP mode override via web UI
- State Machine prüft /tmp/babycam-ap-override: 'on'/'off' = manuell, fehlt = Automatik
- Neue API-Endpunkte: POST /ap/on, /ap/off, /ap/auto
- Access-Point-Karte zeigt jetzt 3 Buttons (An / Aus / Auto) + aktuellen Modus
- Manuell überschreibt die Automatik, Auto gibt Kontrolle zurück an die State Machine

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 15:54:53 +02:00
Julian Vollmer d9514e23d7 Add fullscreen live view at /live
- Schwarzer Hintergrund, Stream füllt den ganzen Bildschirm (object-fit: cover)
- Overlay mit Uhrzeit und Einstellungs-Link erscheint bei Tap/Klick, blendet sich nach 3s aus
- Vollbild-Button nutzt Fullscreen API
- Auf Handys wird automatisch Landscape angefragt
- Stream-Box auf Hauptseite ist jetzt klickbar und verlinkt auf /live

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 15:49:33 +02:00
Julian Vollmer 496215c61a babycam initial 2026-05-18 15:47:02 +02:00
Julian Vollmer ef858f9040 Add complete babycam setup: install script, Flask app, state machine, configs
- setup.sh: vollständiges Install- und Konfigurationsscript für Raspberry Pi OS Trixie
- app/main.py: Flask Webinterface mit MJPEG-Stream, WLAN-Verwaltung und Statusseite
- app/templates/index.html: Dark-Mode UI mit Live-Stream, WLAN-Scan und Verbinden
- scripts/network_state.py: State Machine für Modus A (Heimnetz) / B (Access Point)
- config/hostapd.conf: Access Point BabyCam (192.168.50.0/24)
- config/dnsmasq.conf: DHCP-Server für AP-Netzwerk
- systemd/: babycam-web und babycam-network als autostart Services
- README.md: Schnellstart-Anleitung und Projektstruktur ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 14:38:26 +02:00
Julian 476922f440 README.md aktualisiert 2026-05-18 07:02:25 +00:00
Julian Vollmer d6f3b92eeb add readme 2026-05-18 08:59:51 +02:00