Files
hdmiviewer/README.md
2026-09-05 23:00:30 +02:00

134 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HDMI Viewer
Ein schlanker Qt6/C++ HDMI-Viewer für Arch Linux mit V4L2 (Video) und ALSA (Audio).
Gedacht als Companion zu OBS Studio: **Anzeigen ohne Aufnehmen**.
## Features
- Live-Vorschau vom HDMI-Grabber via V4L2, mit automatischer Formatpriorität
MJPEG → YUYV → NV12 (MJPEG braucht deutlich weniger USB-Bandbreite und
erlaubt so höhere Auflösungen/Framerates)
- ALSA-Audio direkt vom Grabber-Gerät (Capture → Wiedergabe, per Thread)
- Gerät-Auswahl beim Start (Video, Audio, Ziel-Framerate), alle Einstellungen
werden gespeichert und beim nächsten Start vorausgewählt
- **F** → Vollbild / **F** oder **Esc** im Vollbild → Fenstermodus
- **Esc** im Fenstermodus → zurück zur Gerät-Auswahl (Device wird sauber freigegeben)
- Seitenverhältnis immer bewahrt (Letterbox/Pillarbox)
- Titelleiste und Statusleiste zeigen tatsächliche Auflösung, FPS und Pixelformat
- GPU-Rendering per OpenGL 3.3 (kein Ruckeln durch CPU-seitiges Skalieren)
- **Bildglättung** (standardmäßig an, Taste **S**): GPU-Shader trennt Luma/Chroma
und behandelt sie getrennt Chroma wird stärker weichgezeichnet (killt
Dot-Crawl/Farbrauschen billiger Composite→HDMI-Scaler), Luma wird leicht
geglättet und dezent gegengeschärft (nimmt harte Scaler-Kanten raus, ohne
matschig zu wirken). Keine Optik-Spielerei, sondern eine echte Bildverbesserung.
- **Retro-Optik** (standardmäßig aus, Taste **C**): separater Nostalgie-Look
Scanlines, Phosphor-/Aperture-Grille-Maske, leichte Wölbung wie bei einem
alten Röhrenfernseher. Lässt sich mit der Bildglättung kombinieren.
- **Nachschärfen** (Unsharp Mask, Taste **X** zum Umschalten, **+**/**-** zum
Fein-Justieren): unabhängig von der Bildglättung, live einstellbar und
persistiert.
- **Hardware-Helligkeit/-Kontrast/-Sättigung** (Tasten **,**/**.**, **1**/**2**,
**3**/**4**): steuert die entsprechenden V4L2-Regler *direkt am
Grabber-Chip*, also VOR der JPEG-Kompression das rettet tatsächlich
Schattendetails, statt nur nachträglich am fertig komprimierten Bild zu
strecken (was sichtbare Artefakte/Banding erzeugt). Beim Start wird der
jeweilige Ausgangswert des Chips ausgelesen und gemerkt; beim Beenden wird
er exakt wiederhergestellt, sodass der Grabber für andere Programme
unverändert bleibt. Im Startdialog lassen sich für alle drei Regler feste
Zielwerte vorgeben (`unverändert` = Regler beim Start gar nicht anfassen).
- **Studio-/Full-Range-Korrektur**: Das fertig dekodierte Bild wird von einem
komprimierten Kontrastumfang (Schwarzpunkt niedrig angesetzt, Weißpunkt
≈235/255) auf den vollen 0255-Kontrastumfang gedehnt. Ohne diese Korrektur
wirkt das Bild dumpf, kontrastarm und zu dunkel viele billige HDMI-Grabber
liefern (oder kodieren, auch bei MJPEG) genau in diesem komprimierten
Bereich. Greift direkt im GPU-Shader auf dem fertigen RGB-Bild, also
unabhängig vom Pixelformat.
- **Roh-Modus** (Taste **R**): Diagnose-Umschalter, der sämtliche Verarbeitung
(Bildglättung, Retro-Optik, Studio-Range-Korrektur, Kontrast-/
Sättigungs-Punch, Gamma) umgeht und das Bild 1:1 anzeigt.
- **Live-Vergleich** (Taste **V**): zeigt links das rohe und rechts das
bearbeitete Bild nebeneinander praktisch zum Fein-Tunen der Hardware-Regler.
- **Screenshot** (Taste **P**): speichert das aktuell angezeigte (bearbeitete)
Frame als PNG im Home-Verzeichnis.
- **Frame-Dump** (Taste **D**, nur bei MJPEG): speichert das nächste rohe,
unveränderte MJPEG-Frame direkt vom Chip als JPEG nützlich, um zu prüfen,
ob Abweichungen schon in den Rohdaten liegen oder erst bei der eigenen
Verarbeitung entstehen.
## Abhängigkeiten (Arch Linux)
```bash
sudo pacman -S qt6-base cmake alsa-lib base-devel
```
`qt6-base` bringt auf Arch bereits die benötigten `Qt6OpenGL`- und
`Qt6OpenGLWidgets`-Module mit. `linux/videodev2.h` ist Teil von
`linux-api-headers`, das über die `base`-Gruppe ohnehin installiert ist.
## Installation über AUR
```bash
yay -S hdmi-viewer
# oder mit einem anderen AUR-Helper, bzw. manuell:
git clone https://aur.archlinux.org/hdmi-viewer.git
cd hdmi-viewer
makepkg -si
```
## Quellcode
```bash
git clone https://git.projekt-hirnfrei.de/diabolus/hdmiviewer.git
```
## Manuell bauen
```bash
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
```
## Starten
```bash
./hdmi-viewer
```
## Tastenkürzel
| Taste | Funktion |
|---------|--------------------------------------------------------|
| F | Vollbild ein/aus |
| S | Bildglättung ein/aus |
| C | Retro-Optik (Scanlines/Maske) ein/aus |
| X | Nachschärfen ein/aus (letzter Wert ↔ aus) |
| + / - | Nachschärfen stärker / schwächer |
| , / . | Hardware-Helligkeit dunkler / heller |
| 1 / 2 | Hardware-Kontrast runter / hoch |
| 3 / 4 | Hardware-Sättigung runter / hoch |
| R | Roh-Modus (Diagnose, alle Effekte umgangen) ein/aus |
| V | Live-Vergleich (links roh, rechts bearbeitet) ein/aus |
| P | Screenshot speichern (PNG) |
| D | Rohes MJPEG-Frame dumpen (Diagnose) |
| Esc | Vollbild verlassen ODER zurück zum Gerätedialog |
## Einstellungen
Werden gespeichert in: `~/.config/hdmi-viewer/HDMIViewer.conf`
(Standard XDG-Pfad, kein manuelles Anlegen nötig)
## Audio-Gerät finden
```bash
# Alle ALSA-Capture-Geräte auflisten
arecord -l
# Testen (hw:X,Y aus arecord -l, z.B. hw:2,0)
arecord -D hw:2,0 -f S16_LE -r 48000 -c 2 /tmp/test.wav
aplay /tmp/test.wav
```
Das Gerät dann im Dialog so eingeben: z.B. `hw:2,0` oder `plughw:2,0`
(plughw macht automatische Sample-Rate-Konvertierung, falls nötig)