Zum Inhalt

Video4Linux2

📅 Erstellt: 22.09.2026 🔄 Aktualisiert: 29.09.2026

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.

b0d198674793ecb948d72e2c2a867812.png

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. 😒

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. p6 zielt 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 von YUV422P (aus dem MJPEG-Input) zu YUV420P. 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.