{"id":50683045,"url":"https://github.com/wlanboy/usbview","last_synced_at":"2026-06-08T20:30:42.842Z","repository":{"id":360162814,"uuid":"1248958292","full_name":"wlanboy/usbview","owner":"wlanboy","description":"Python opencv based webserver for streaming usb capture card streams","archived":false,"fork":false,"pushed_at":"2026-05-25T08:48:01.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T10:17:52.645Z","etag":null,"topics":["http-stream","mirror","opencv","python","usb-capture"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wlanboy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-25T07:59:22.000Z","updated_at":"2026-05-25T08:48:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wlanboy/usbview","commit_stats":null,"previous_names":["wlanboy/usbview"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/wlanboy/usbview","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlanboy%2Fusbview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlanboy%2Fusbview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlanboy%2Fusbview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlanboy%2Fusbview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wlanboy","download_url":"https://codeload.github.com/wlanboy/usbview/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlanboy%2Fusbview/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34080025,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["http-stream","mirror","opencv","python","usb-capture"],"created_at":"2026-06-08T20:30:42.192Z","updated_at":"2026-06-08T20:30:42.835Z","avatar_url":"https://github.com/wlanboy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# usbview – Browser‑basierter Live‑Viewer für USB‑HDMI‑Capture‑Cards\n\nusbview ist ein browserbasierter Live‑Viewer für USB‑HDMI‑Capture‑Cards unter Linux.\nDer Dienst stellt einen HTTP‑Stream bereit, über den das angeschlossene HDMI‑Gerät direkt im Browser betrachtet werden kann — ganz ohne zusätzliche Software.\n\nDas Tool eignet sich besonders für Server‑Hardware ohne KVM‑Switch:\nCapture‑Card einstecken, Server einschalten, Browser öffnen — und schon lassen sich BIOS‑ oder UEFI‑Einstellungen bequem aus der Ferne betrachten.\n\n## Features\n- MJPEG‑Livestream ohne Neukodierung  \nDirekter Zugriff auf den MJPEG‑Stream der Capture‑Card für minimale Latenz.\n\n- Auflösung und FPS dynamisch wählbar  \nDropdown‑Auswahl basierend auf den Live‑Capabilities von v4l2-ctl.\n\n- Mehrere Capture‑Devices auswählbar  \nPraktisch für Systeme mit mehreren angeschlossenen Karten.\n\n- Vollbild‑Modus  \nPer Button, F‑Taste oder Esc umschaltbar.\n\n- Einzelner Capture‑Thread für alle Clients  \nMehrere Browser‑Tabs teilen sich denselben Stream — ressourcenschonend und stabil.\n\n## Voraussetzungen\n\n- Python 3.11+\n- [uv](https://github.com/astral-sh/uv)\n- `v4l2-utils` (enthält `v4l2-ctl`)\n\n```bash\nsudo apt install v4l2-utils\n```\n\n---\n\n## Capture Card prüfen\n\n### Angeschlossene Devices auflisten\n\n```bash\nv4l2-ctl --list-devices\n```\n\nBeispielausgabe:\n\n```\nUSB3.0 capture: USB3.0 captur (usb-0000:04:00.4-2):\n        /dev/video0\n        /dev/video1\n        /dev/media0\n```\n\n\u003e `/dev/video0` ist das eigentliche Capture-Device, `/dev/video1` meist Metadaten, `/dev/media0` das Media-Controller-Interface.\n\n### Unterstützte Formate und Auflösungen\n\n```bash\nv4l2-ctl --device=/dev/video0 --list-formats-ext\n```\n\nBeispielausgabe (gekürzt):\n\n```\n[0]: 'MJPG' (Motion-JPEG, compressed)\n    Size: Discrete 1920x1080\n        Interval: Discrete 0.017s (60.000 fps)\n        Interval: Discrete 0.033s (30.000 fps)\n    Size: Discrete 1280x720\n        Interval: Discrete 0.017s (60.000 fps)\n        Interval: Discrete 0.033s (30.000 fps)\n        Interval: Discrete 0.050s (20.000 fps)\n[1]: 'YUYV' (YUYV 4:2:2)\n    Size: Discrete 1920x1080\n        Interval: Discrete 0.100s (10.000 fps)\n```\n\n\u003e usbview nutzt ausschließlich den MJPEG-Codec — optimale Performance bei minimaler CPU-Last.\n\n### Aktuelle Einstellungen eines Devices abfragen\n\n```bash\nv4l2-ctl --device=/dev/video0 --all\n```\n\n### Kamerabild testweise mit ffplay anzeigen\n\n```bash\nffplay -f v4l2 -input_format mjpeg -video_size 1280x720 -framerate 30 /dev/video0\n```\n\n---\n\n## Installation \u0026 Start\n\n### Lokal (mit uv)\n\n```bash\nuv sync\nuv run python main.py\n```\n\n### Docker\n\nRequirements-Datei aktualisieren (nach Abhängigkeitsänderungen):\n\n```bash\nuv pip compile pyproject.toml -o requirements.txt\n```\n\nImage bauen:\n\n```bash\ndocker build -t usbview .\n```\n\nContainer starten:\n\n```bash\ndocker run --name usbview --rm --device=/dev/video0 -p 8080:8080 usbview\n```\n\nBei mehreren Capture-Devices und als Daemon:\n\n```bash\ndocker run --name usbview -d --device=/dev/video0 --device=/dev/video1 -p 8080:8080 usbview\n```\n\nDer Server lauscht auf `http://0.0.0.0:8080`.  \nIm Browser öffnen: **http://localhost:8080**\n\n### Aus dem Netzwerk erreichbar\n\nDa der Server auf `0.0.0.0` bindet, ist er im lokalen Netz direkt erreichbar:\n\n```\nhttp://\u003cip-des-rechners\u003e:8080\n```\n\n---\n\n## Projektstruktur\n\n```\nusbview/\n├── main.py          # FastAPI-App und HTTP-Routen\n├── capture.py       # V4L2-Parsing, FrameBroadcaster, Stream-Generator\n├── static/\n│   ├── index.html   # Oberfläche\n│   ├── style.css    # Styling\n│   └── app.js       # Frontend-Logik (Dropdowns, Fullscreen)\n└── pyproject.toml\n```\n\n## API\n\n| Methode | Route | Beschreibung |\n|---------|-------|--------------|\n| `GET` | `/` | HTML-Oberfläche |\n| `GET` | `/devices` | Liste aller `/dev/video*`-Devices mit Namen |\n| `GET` | `/formats?device=/dev/video0` | MJPG-Auflösungen und FPS des Devices |\n| `GET` | `/stream?device=...\u0026width=...\u0026height=...\u0026fps=...` | MJPEG-Multipart-Stream |\n\n## Tastenkürzel\n\n| Taste | Funktion |\n|-------|----------|\n| `F` | Vollbild ein/aus |\n| `Esc` | Vollbild beenden |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwlanboy%2Fusbview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwlanboy%2Fusbview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwlanboy%2Fusbview/lists"}