Video4Linux2
Vorab:
Ich sollte hier noch etwas auf den verwendeten Framegrabber / die Capturekarte eingehen und Linux UVC näher beschreiben. Mehr dazu später™.
QV4L2¶
Um mit Video for Linux 2 zu arbeiten kann ich das qv4l2-Tool empfehlen, das ist zwar recht technisch, man findet aber in kurzer Zeit heraus welche Funktionen was bewirken.
Testkonfiguration¶
Kurz gesagt sind die Videobeispiele hier mit einem 25€ Hardware-Setup entstanden. Dafür ist die Qualität ordentlich. Allerdings sind 70 Hz DOS-Textmodus aufnahmen NICHT möglich, da der Grabber das mit einem "No Signal" quittiert. 😒
- FOINNEX VGA auf HDMI Adapter (aktiv) mit Audio - Amazon (kein Reflink!) - Kaufpreis 10,99€
- UGREEN Video Capture Card, 4k Eingang und 1080p Capture, HDMI auf USB A/C - Amazon (kein Reflink!) - Kaufpreis 13,77€
Capture und Encoding mit ffmpeg¶
Ein Beispie mit ALSA Capture auf hw:0,0:
ffmpeg -thread_queue_size 512 -f v4l2 -input_format mjpeg -video_size 1600x1200 -framerate 60 -i /dev/video0 -thread_queue_size 512 -f alsa -i hw:0,0 -c:v hevc_nvenc -preset p6 -rc vbr -cq 16 -pix_fmt yuv420p -c:a aac -b:a 192k -ac 2 output.mp4
Parametererklärung:
Hier ist die detaillierte Aufschlüsselung des aktuell verwendeten Befehls:
-thread_queue_size 512: Vergrößert den Puffer für eingehende Datenpakete auf 512. Verhindert Framedrops, "Queue blocking"-Fehler und asynchrones Audio/Video bei Live-Aufnahmen. Muss jeweils separat vor der Video- und Audioquelle deklariert werden.-f v4l2: Legt Video4Linux2 als Schnittstelle für das Video-Eingabegerät fest.-input_format mjpeg: Fordert das komprimierte MJPEG-Format von der Hardware an. Erforderlich, da unkomprimierte Formate bei 1600x1200@60fps oft die Bandbreite von USB-Schnittstellen übersteigen.-video_size 1600x1200: Zwingt die Eingabequelle auf die Zielauflösung.-framerate 60: Fordert 60 Bilder pro Sekunde vom Eingabegerät an.-i /dev/video0: Definiert den Pfad zum physischen Video-Eingabegerät.-f alsa: Legt Advanced Linux Sound Architecture als Framework für die Audioeingabe fest.-i hw:0,0: Definiert die Audioquelle als ALSA-Hardware-Gerät 0, Sub-Gerät 0.-c:v hevc_nvenc: Aktiviert den H.265/HEVC-Hardware-Encoder der verbauten NVIDIA-Grafikkarte.-preset p6: Bestimmt das Verhältnis aus Codiergeschwindigkeit und Bildqualität.p6zielt auf eine sehr hohe Qualität ab, die minimal langsamer berechnet wird als der Standardwert.-rc vbr: Aktiviert die Variable Bitrate. Dies ist beim NVENC-Encoder zwingend erforderlich, um den Constant Quality Modus (CQ) nutzen zu können.-cq 16: Aktiviert den Constant Quality Modus mit einem Zielwert von 16. Die Bitrate schwankt je nach Komplexität des Bildes, um eine konstante visuelle Qualität zu halten (niedrigerer Wert = höhere Qualität, 16 ist visuell nah am Original).-pix_fmt yuv420p: Konvertiert das Farbraum-Format vonYUV422P(aus dem MJPEG-Input) zuYUV420P. Der NVIDIA-Encoder benötigt dieses Standardformat zwingend für die Komprimierung.-c:a aac: Bestimmt Advanced Audio Coding (AAC) als Audio-Codec.-b:a 192k: Limitiert die Audio-Bitrate auf 192 Kilobit pro Sekunde.-ac 2: Erzwingt eine Ausgabe in zwei Audiokanälen (Stereo).output.mp4: Definiert den Namen und das Containerformat (.mp4) der fertigen Videodatei.
Beispielvideos¶
Nachdem die Verarbeitung - grober Schnitt und Audio-Normalisierung - mit Avidemux abgeschlossen wurde, hier ein Beispielvideo:
HEVC
H264
Je nach Betriebssystem und Browser kann es sein, dass HEVC* nicht abspielbar ist. Gibt es ja auch "erst" seit 2013/2014. Willkommen in 2026! 🥳
*Naja ganz so einfach ist es nicht, da es hier um Lizenzkosten geht...
Welche Auflösungen und Bildraten werden unterstützt?¶
Alle angeschlossenen Capturegeräte anzeigen:
❯ v4l2-ctl --list-devices
UGREEN 25854: UGREEN 25854 (usb-0000:00:14.0-1.1.1):
/dev/video0
/dev/video1
/dev/media0
Alle unterstützten Auflösungen & Bildraten (FPS) abfragen:
❯ v4l2-ctl --list-formats-ext -d /dev/video0
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1920x1080
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1600x1200
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1360x768
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x1024
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1024x768
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 800x600
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
[1]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 1920x1080
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1600x1200
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1360x768
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x1024
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x960
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 1024x768
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 800x600
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Size: Discrete 640x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Tabelle¶
| Auflösung MJPG/YUYV | MJPG FPS | YUYV FPS |
|---|---|---|
| 1920x1080 | 60,50,30,20,10 | 10,5 |
| 1600x1200 | 60,50,30,20,10 | 10,5 |
| 1280x1024 | 60,50,30,20,10 | 15,10 |
| 1280x960 | 60,50,30,20,10 | 15,10 |
| 1360x768 | 60,50,30,20,10 | 20,10 |
| 1280x720 | 60,50,30,20,10 | 25,10 |
| 1024x768 | 60,50,30,20,10 | 25,10 |
| 800x600 | 60,50,30,20,10 | 30,20,10 |
| 720x576 | 60,50,30,20,10 | 50,30,20,10 |
| 720x480 | 60,50,30,20,10 | 60,30,20,10 |
| 640x480 | 60,50,30,20,10 | 60,30,20,10 |
Welche Steuerelemente können verändert werden?¶
Alle v4l2-Treiberinformationen im Überblick:
❯ v4l2-ctl -d /dev/video0 --all
Driver Info:
Driver name : uvcvideo
Card type : UGREEN 25854: UGREEN 25854
Bus info : usb-0000:00:14.0-1.1.1
Driver version : 7.2.8
Capabilities : 0x84a00001
Video Capture
Metadata Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
Media Driver Info:
Driver name : uvcvideo
Model : UGREEN 25854: UGREEN 25854
Serial :
Bus info : usb-0000:00:14.0-1.1.1
Media version : 7.2.8
Hardware revision: 0x00002100 (8448)
Driver version : 7.2.8
Interface Info:
ID : 0x03000002
Type : V4L Video
Entity Info:
ID : 0x00000001 (1)
Name : UGREEN 25854: UGREEN 25854
Function : V4L2 I/O
Flags : default
Pad 0x01000007 : 0: Sink
Link 0x0200000d: from remote pad 0x100000a of entity 'Processing 2' (Video Pixel Formatter): Data, Enabled, Immutable
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height : 1920/1080
Pixel Format : 'MJPG' (Motion-JPEG)
Field : None
Bytes per Line : 0
Size Image : 4147200
Colorspace : sRGB
Transfer Function : Rec. 709
YCbCr/HSV Encoding: ITU-R 601
Quantization : Default (maps to Full Range)
Flags :
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 1920, Height 1080
Default : Left 0, Top 0, Width 1920, Height 1080
Pixel Aspect: 1/1
Selection Video Capture: crop_default, Left 0, Top 0, Width 1920, Height 1080, Flags:
Selection Video Capture: crop_bounds, Left 0, Top 0, Width 1920, Height 1080, Flags:
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 30.000 (30/1)
Read buffers : 0
User Controls
brightness 0x00980900 (int) : min=-128 max=127 step=1 default=-11 value=-11 flags=has-min-max
contrast 0x00980901 (int) : min=0 max=255 step=1 default=148 value=148 flags=has-min-max
saturation 0x00980902 (int) : min=0 max=255 step=1 default=180 value=164 flags=has-min-max
hue 0x00980903 (int) : min=-128 max=127 step=1 default=0 value=0 flags=has-min-max
Steuerelemente:
❯ v4l2-ctl -d /dev/video0 --list-ctrls
User Controls
brightness 0x00980900 (int) : min=-128 max=127 step=1 default=-11 value=-11 flags=has-min-max
contrast 0x00980901 (int) : min=0 max=255 step=1 default=148 value=148 flags=has-min-max
saturation 0x00980902 (int) : min=0 max=255 step=1 default=180 value=164 flags=has-min-max
hue 0x00980903 (int) : min=-128 max=127 step=1 default=0 value=0 flags=has-min-max
Aktuelle Werte abfragen:
❯ v4l2-ctl -d /dev/video0 --get-ctrl=brightness
brightness: -11
Steuerelemente verändern¶
Werte verändern:
# Helligkeit ändern
v4l2-ctl -d /dev/video0 --set-ctrl=brightness=10
# Kontrast ändern
v4l2-ctl -d /dev/video0 --set-ctrl=contrast=45
# Mehrere Werte gleichzeitig in einem Befehl setzen
v4l2-ctl -d /dev/video0 --set-ctrl=brightness=10,contrast=45,saturation=70
Wenn parallel ffplay /dev/video0 oder OBS Studio offen ist, sieht man die Bildänderung beim Abschicken des Befehls sofort in Echtzeit!
Format, Auflösung und FPS setzen/verändern/abfragen¶
Format, Auflösung und FPS ändern:
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=MJPG --set-parm=60
Abfrage der eingestellten Werte:
❯ v4l2-ctl -d /dev/video0 --get-fmt-video
Format Video Capture:
Width/Height : 1920/1080
Pixel Format : 'MJPG' (Motion-JPEG)
Field : None
Bytes per Line : 0
Size Image : 4147200
Colorspace : sRGB
Transfer Function : Rec. 709
YCbCr/HSV Encoding: ITU-R 601
Quantization : Default (maps to Full Range)
Flags :
❯ v4l2-ctl -d /dev/video0 --get-parm
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 60.000 (60/1)
Read buffers : 0
Startech USB3HDCAP¶
GitHub: Link
Momentan funktionieren:
- Composite: 240p, 288p, 480i, 576i
- S-Video: 240p, 288p, 480i, 576i
- Component: 240p, 288p, 480i, 480p, 576i, 576p, 720p, 1080i
- HDMI: 1080p60
Kein VGA, kein DVI!
Kernelmodul bauen:
git clone https://github.com/mlaux/usb3hdcap.git
cd usb3hdcap
make LLVM=1
Modul laden inkl. Abhängigkeiten:
# 1. Abhängigkeiten laden
sudo modprobe -a videodev videobuf2-v4l2 videobuf2-vmalloc snd-pcm
# 2. Treiber-Modul einfügen
sudo insmod usb3hdcap.ko
Eingänge auflisten:
❯ v4l2-ctl -d /dev/video0 --list-inputs
ioctl: VIDIOC_ENUMINPUT
Input : 0
Name : Composite
Type : 0x00000002 (Camera)
Audioset : 0x00000000
Tuner : 0x00000000
Standard : 0x000000000000B0FF (PAL-B/B1/G/H/I/D/D1/K NTSC-M/M-JP/M-KR)
Status : 0x00000000 (ok)
Capabilities: 0x00000004 (SDTV standards)
Input : 1
Name : S-Video
Type : 0x00000002 (Camera)
Audioset : 0x00000000
Tuner : 0x00000000
Standard : 0x000000000000B0FF (PAL-B/B1/G/H/I/D/D1/K NTSC-M/M-JP/M-KR)
Status : 0x00000000 (ok)
Capabilities: 0x00000004 (SDTV standards)
Input : 2
Name : Component
Type : 0x00000002 (Camera)
Audioset : 0x00000000
Tuner : 0x00000000
Standard : 0x0000000000000000 ()
Status : 0x00000000 (ok)
Capabilities: 0x00000002 (DV timings)
Input : 3
Name : HDMI
Type : 0x00000002 (Camera)
Audioset : 0x00000000
Tuner : 0x00000000
Standard : 0x0000000000000000 ()
Status : 0x00000000 (ok)
Capabilities: 0x00000002 (DV timings)
Eingang HDMI (3) setzen:
v4l2-ctl -d /dev/video0 --set-input 3
Leider funktionieren hier 720x400@70 auch nicht... 🤔
Avermedia Live Gamer Ultra (GC553v2)¶
Auch dieses Gerät kann zwar UVC, mit Hindernissen, aber auch keine 70 Hz.
