usbview ist ein browserbasierter Live‑Viewer für USB‑HDMI‑Capture‑Cards unter Linux. Der Dienst stellt einen HTTP‑Stream bereit, über den das angeschlossene HDMI‑Gerät direkt im Browser betrachtet werden kann — ganz ohne zusätzliche Software.
Das Tool eignet sich besonders für Server‑Hardware ohne KVM‑Switch: Capture‑Card einstecken, Server einschalten, Browser öffnen — und schon lassen sich BIOS‑ oder UEFI‑Einstellungen bequem aus der Ferne betrachten.
MJPEG‑Livestream ohne Neukodierung
Direkter Zugriff auf den MJPEG‑Stream der Capture‑Card für minimale Latenz.Auflösung und FPS dynamisch wählbar
Dropdown‑Auswahl basierend auf den Live‑Capabilities von v4l2-ctl.Mehrere Capture‑Devices auswählbar
Praktisch für Systeme mit mehreren angeschlossenen Karten.Vollbild‑Modus
Per Button, F‑Taste oder Esc umschaltbar.Einzelner Capture‑Thread für alle Clients
Mehrere Browser‑Tabs teilen sich denselben Stream — ressourcenschonend und stabil.
- Python 3.11+
- uv
v4l2-utils(enthältv4l2-ctl)
sudo apt install v4l2-utilsv4l2-ctl --list-devicesBeispielausgabe:
USB3.0 capture: USB3.0 captur (usb-0000:04:00.4-2):
/dev/video0
/dev/video1
/dev/media0
/dev/video0ist das eigentliche Capture-Device,/dev/video1meist Metadaten,/dev/media0das Media-Controller-Interface.
v4l2-ctl --device=/dev/video0 --list-formats-extBeispielausgabe (gekürzt):
[0]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1920x1080
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
[1]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 1920x1080
Interval: Discrete 0.100s (10.000 fps)
usbview nutzt ausschließlich den MJPEG-Codec — optimale Performance bei minimaler CPU-Last.
v4l2-ctl --device=/dev/video0 --allffplay -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 /dev/video0uv sync
uv run python main.pyRequirements-Datei aktualisieren (nach Abhängigkeitsänderungen):
uv pip compile pyproject.toml -o requirements.txtImage bauen:
docker build -t usbview .Container starten:
docker run --name usbview --rm --device=/dev/video0 -p 8080:8080 usbviewBei mehreren Capture-Devices und als Daemon:
docker run --name usbview -d --device=/dev/video0 --device=/dev/video1 -p 8080:8080 usbviewDer Server lauscht auf http://0.0.0.0:8080.
Im Browser öffnen: http://localhost:8080
Da der Server auf 0.0.0.0 bindet, ist er im lokalen Netz direkt erreichbar:
http://<ip-des-rechners>:8080
usbview/
├── main.py # FastAPI-App und HTTP-Routen
├── capture.py # V4L2-Parsing, FrameBroadcaster, Stream-Generator
├── static/
│ ├── index.html # Oberfläche
│ ├── style.css # Styling
│ └── app.js # Frontend-Logik (Dropdowns, Fullscreen)
└── pyproject.toml
| Methode | Route | Beschreibung |
|---|---|---|
GET | / | HTML-Oberfläche |
GET | /devices | Liste aller /dev/video*-Devices mit Namen |
GET | /formats?device=/dev/video0 | MJPG-Auflösungen und FPS des Devices |
GET | /stream?device=...&width=...&height=...&fps=... | MJPEG-Multipart-Stream |
| Taste | Funktion |
|---|---|
F | Vollbild ein/aus |
Esc | Vollbild beenden |