95 lines
3.8 KiB
Markdown
95 lines
3.8 KiB
Markdown
# 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 (YUYV und NV12)
|
||
- ALSA-Audio direkt vom Grabber-Gerät
|
||
- Gerät-Auswahl beim Start, **Audio-Gerät wird gespeichert**
|
||
- **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 zeigt tatsächliche Auflösung und FPS
|
||
- Colorspace-Konvertierung im ThreadPool (kein Ruckeln)
|
||
- FPS explizit auf 60fps gesetzt (was Grabber liefert wird in Statusbar angezeigt)
|
||
- **Bildglättung** (standardmäßig an): GPU-Shader trennt Luma/Chroma und
|
||
behandelt sie getrennt – Chroma wird stärker weichgezeichnet (killt
|
||
Dot-Crawl/Farbrauschen billiger Composite→HDMI-Scaler wie Lioncast Mini
|
||
AV2HDMI o.ä.), 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. Taste **S** zum Umschalten.
|
||
- **Retro-Optik** (standardmäßig aus): 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. Taste **C**.
|
||
- **Helligkeit** (Tasten **,** dunkler / **.** heller): Gamma-Anpassung, live
|
||
und persistiert. Sinnvoll als Feinjustierung, falls Farbraum-Erkennung
|
||
(siehe unten) allein nicht perfekt zum eigenen Bildschirm passt.
|
||
- **Hardware-Helligkeit**: Beim Öffnen des Geräts wird (falls vom Chip
|
||
unterstützt) der V4L2-Brightness-Regler direkt am Grabber moderat
|
||
angehoben (+20 % des Wertebereichs ab Werkseinstellung) – das wirkt
|
||
bereits VOR der JPEG-Kompression und kann so tatsächlich verlorene
|
||
Schattendetails retten, statt nur nachträglich zu strecken, was von der
|
||
Kompression übrig blieb. Diagnose-Ausgabe der verfügbaren Regler landet
|
||
beim Start im Terminal.
|
||
- **Studio-/Full-Range-Korrektur**: Das fertig dekodierte Bild wird von einem
|
||
komprimierten Kontrastumfang (Schwarzpunkt niedrig angesetzt, Weißpunkt
|
||
≈235/255) auf den vollen 0–255-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.
|
||
|
||
## Abhängigkeiten (Arch Linux)
|
||
|
||
```bash
|
||
sudo pacman -S qt6-base cmake alsa-lib linux-headers base-devel
|
||
```
|
||
|
||
`qt6-base` bringt auf Arch bereits die benötigten `Qt6OpenGL`- und
|
||
`Qt6OpenGLWidgets`-Module mit.
|
||
|
||
## 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 |
|
||
| , / . | Dunkler / Heller (Helligkeit, gespeichert) |
|
||
| Esc | Vollbild verlassen ODER zurück zum Dialog |
|
||
|
||
## 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)
|