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-utils
v4l2-ctl --list-devices
Beispielausgabe:
USB3.0 capture: USB3.0 captur (usb-.&checktime(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-ext
Beispielausgabe (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 --all
ffplay -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 /dev/video0
uv sync uv run python main.py
Requirements-Datei aktualisieren (nach Abhängigkeitsänderungen):
uv pip compile pyproject.toml -o requirements.txt
Image bauen:
docker build -t usbview .Container starten:
docker run --name usbview --rm --device=/dev/video0 -p 8080:8080 usbview
Bei mehreren Capture-Devices und als Daemon:
docker run --name usbview -d --device=/dev/video0 --device=/dev/video1 -p 8080:8080 usbview
Der 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
├── v4l2.py # V4L2-Geräte-/Format-Parsing
├── stream.py # 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 |