Live Camera Setup
Take a USB or built-in webcam live 24/7 for free, and watch it from the Live Camera page — the cost-effective ffmpeg → YouTube Live runbook plus HLS and Cloudflare alternatives.
---
How the Live Camera page works
The [Live Camera](/camera) page renders whatever you point CONFIG_STREAM_URL at — a YouTube Live URL or an HLS (.m3u8) playlist — as the public 24/7 feed. Delivery is free (the platform/CDN bears the bandwidth) and needs no extra backend. With no URL set, the page falls back to a local webcam monitor (getUserMedia) that only ever runs in your own browser.
```bash
.env
CONFIG_STREAM_URL=https://www.youtube.com/watch?v=YOUR_LIVE_VIDEO_ID ```
.. toc::
Go live for free — webcam → YouTube Live
This is the cheapest robust 24/7 path: YouTube hosts and delivers the stream at no cost, and the page embeds it.
1. In YouTube Studio → Go Live → Stream, create a stream and copy the Stream URL (rtmp://a.rtmp.youtube.com/live2) and Stream key. 2. Push your webcam to it with a single always-on ffmpeg process:
```bash
macOS (AVFoundation). List devices first: ffmpeg -f avfoundation -list_devices true -i ""
ffmpeg -f avfoundation -framerate 30 -i "0:0" \ -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k \ -pix_fmt yuv420p -g 60 \ -c:a aac -b:a 128k -ar 44100 \ -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR-STREAM-KEY" ```
```bash
Linux (V4L2 webcam at /dev/video0)
ffmpeg -f v4l2 -framerate 30 -i /dev/video0 -f alsa -i default \ -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k \ -pix_fmt yuv420p -g 60 -c:a aac -b:a 128k -ar 44100 \ -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR-STREAM-KEY" ```
3. Set CONFIG_STREAM_URL to the broadcast's watch URL and reload the page. 4. Keep it alive. Run the ffmpeg line as a service so it restarts on failure — e.g. a systemd unit with Restart=always, a launchd agent on macOS, or a small while true; do ffmpeg ...; sleep 2; done supervisor.
Trade-offs: free delivery and minimal plumbing, but ~10–30 s latency, platform
branding/ads, and YouTube's unattended-stream quirks. Best as the cost-effective
default; swap in a route below if you need lower latency or full product control.
Alternative — self-host (lowest cost, more control)
Run [MediaMTX](https://github.com/bluenviron/mediamtx) on a small VPS; push the webcam in with ffmpeg and serve HLS or sub-second WHEP:
```yaml
mediamtx.yml — pull an RTSP camera, or accept an ffmpeg/RTMP publish
paths: cam: source: publisher # ffmpeg publishes to rtmp://<host>:1935/cam ```
Then point CONFIG_STREAM_URL at the HLS playlist (http://<host>:8888/cam/index.m3u8); the page attaches hls.js automatically. You own the 24/7 process, TLS, and restarts.
Alternative — managed (lowest ops)
Cloudflare Stream Live: create a Live Input (RTMP/SRT ingest), push the webcam to it with ffmpeg, and set CONFIG_STREAM_URL to the HLS playback URL. Managed, robust, signed URLs, near-zero maintenance — billed by usage.
What's deferred
WHIP browser-publish, a /whip-token mint, Cloudflare /cf-webhook + a viewer-count websocket, and recording/DVR all belong to the later streaming control-plane phase (which moves the app to the FastAPI backend). v1 keeps the camera free, embeddable, and backend-light.
---
*Source: /live-camera*
Note for AI agents: This is the static, prerendered view of an interactive Dash application served because we detected a non-JS user agent. Full prose docs:
- /live-camera/llms.txt — LLM-friendly documentation
- /sitemap.xml
- /robots.txt