Stream Setup
Streamen mit 2 PCs, diverse Konsolen/Geräten mit HDMI von 720p bis 4K Auflösung und diversen Upscalern
Technisches Geplänkel¶
Abriss vorhandener Hardware und technischer Details
PC Specs¶
Morphose¶
| Komponente | Bezeichnung |
|---|---|
| Name | Morphose |
| CPU | i7-10700K @ 4,9 GHz all cores |
| RAM | 32 GB DDR4 |
| Storage | 1+2 TB NVMe, 3+6 GB HDD, 1 TB SSD |
| Video | nvidia 4080 Super |
| OS | Windows 11 Pro, CachyOS Linux |
| Capture | UVC compat. Avermedia GC553 USB3.x |
Framemeister¶
| Komponente | Bezeichnung |
|---|---|
| Name | Framemeister |
| CPU | i7-7700 stock |
| RAM | 16 GB DDR4 |
| Storage | 512 GB NVMe, Optical DVD-Burner |
| Video | nvidia 1650 Super |
| OS | Windows 11 Pro currently only |
| Capture | Not directly Linux compat. Avermedia GC573 PCIe |
Monitor I/O¶
| Name | HDMI | HDMI | DP | mDP | Spkr |
|---|---|---|---|---|---|
| LG Ultragear 21:9 | x | x | x | - | - |
| BenQ 16:9 | x | x | x | x | x |
HDMI Matrix 4x2¶
Momentaner Anschlussplan:
| Gerät | HDMI_1 | HDMI_2 | HDMI_3 | HDMI_4 |
|---|---|---|---|---|
| MiSTer FPGA | - | - | - | x |
| Scaler | - | - | - | x |
| HD Konsole | - | - | - | - |
| UHD Konsole | - | - | - | - |
Die Ausgänge HDMI_A und HDMI_B gehen zum LG Monitor, Eingang HDMI-1 und zur Capturekarte.
Optischer und Line-Ausgang gehen in die Soundkarte von Morphose.
V4L2 Gerät(e) steuern¶
In OBS ist die Nutzung von V4L2 Geräten möglich, über UVC z.B. auch die Avermedia Live Gamer USB GC553.
Jedoch wird eine Quelle das Gerät exklusiv belegen.
Weitere Transformationen sind über Filter wie Zuschneiden/Padding oder Skalierung möglich, somit auch über ein Stream Deck schaltbar. Weitere Geräte- bzw. Hardwareeinstellungen wie Auflösung, Farbraum, Pixelformat und Framerate jedoch nicht, diese sind manuell zu konfigurieren.
In Windows habe ich mir für jeden Upscaler und ggf. deren Auflösungen, sowie Bildformate 4:3 / 16:9 und jedes weitere HDMI Gerät, sofern sie nicht die gleichen Einstellungen benötigen, eine eigene Quelle in OBS angelegt. So, dass ich quasi wie an einem Fernseher die Sender umschalten kann bzw. Eingabequellen und sofort die richtigen Formate und Transformationen habe.
In Linux ist das so nicht möglich, da wie o.g. exklusiv belegt wird. Was auch ein Vorteil ist, ganz klar!
Also muss ich sowas wie multiplexen. Das macht man in Linux wohl mit dem Kernel Loopback Modul v4l2loopback, aus dem AUR zu installieren, ich habe die OBS DKMS Version installiert.
Auflistung der v4l2-Geräte¶
❯ v4l2-ctl --list-devices
Live Gamer Ultra-Video: Live Ga (usb-0000:00:14.0-3):
/dev/video0
/dev/video1
/dev/media0
Auflistung der verfügbaren Formate¶
❯ v4l2-ctl --list-formats-ext -d /dev/video0
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'NV12' (Y/UV 4:2:0)
Size: Discrete 3840x2160
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Size: Discrete 2560x1440
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 2560x1080
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.008s (120.000 fps)
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Size: Discrete 640x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
[1]: 'YV12' (Planar YVU 4:2:0)
Size: Discrete 3840x2160
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Size: Discrete 2560x1440
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 2560x1080
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.008s (120.000 fps)
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Size: Discrete 640x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
[2]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 2560x1440
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 2560x1080
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Size: Discrete 640x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
[3]: 'BGR3' (24-bit BGR 8-8-8)
Size: Discrete 2560x1440
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 2560x1080
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x576
Interval: Discrete 0.020s (50.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Size: Discrete 720x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.017s (59.940 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.033s (29.970 fps)
Size: Discrete 640x480
Interval: Discrete 0.017s (60.000 fps)
Interval: Discrete 0.033s (30.000 fps)
TLDR Formate¶
| Auflösung | Pixelformat | FPS |
|---|---|---|
| 640x480 | NV12, YV12, YUYV, BGR3 | 30, 60 |
| 720x480 | NV12, YV12, YUYV, BGR3 | 29.97, 30, 59.94, 60 |
| 720x576 | NV12, YV12, YUYV, BGR3 | 25, 50 |
| 1280x720 | NV12, YV12, YUYV, BGR3 | 25, 29.97, 30, 50, 59.94, 60 |
| 1920x1080 | YUYV, BGR3 | 24, 25, 29.97, 30, 50, 59.94, 60 |
| 1920x1080 | NV12, YV12 | 24, 25, 29.97, 30, 50, 59.94, 60, 120 |
| 2560x1080 | BGR3 | 30 |
| 2560x1080 | NV12, YV12, YUYV | 30, 59.94, 60 |
| 2560x1440 | BGR3 | 30 |
| 2560x1440 | YUYV | 30, 50 |
| 2560x1440 | NV12, YV12 | 30, 50, 59.94, 60 |
| 3840x2160 | NV12, YV12 | 24, 25, 29.97, 30 |
Relevante Pixelformate 50, 60 FPS¶
| Auflösung | 50 FPS | 59.94 / 60 FPS |
|---|---|---|
| 640x480 | - | ALL |
| 720x480 | - | ALL |
| 720x576 | ALL | - |
| 1280x720 | ALL | ALL |
| 1920x1080 | ALL | ALL |
| 2560x1080 | - | NV12, YV12, YUYV |
| 2560x1440 | NV12, YV12, YUYV | NV12, YV12 |
| 3840x2160 | - | - |
Gerät initialisieren¶
Zur Initialisierung das Format für /dev/video0 festlegen:
v4l2-ctl -d /dev/video0 --try-fmt-video=width=1920,height=1080,pixelformat=BGR3
Sollte das klappen, also die gewünschten Werte ALLE korrekt angezeigt werden:
❯ v4l2-ctl -d /dev/video0 --try-fmt-video=width=1920,height=1080,pixelformat=BGR3
Format Video Capture:
Width/Height : 1920/1080
Pixel Format : 'BGR3' (24-bit BGR 8-8-8)
Field : None
Bytes per Line : 5760
Size Image : 6220800
Colorspace : sRGB
Transfer Function : Rec. 709
YCbCr/HSV Encoding: Rec. 709
Quantization : Default (maps to Full Range)
Flags :
kann man das Format festsetzen mit:
sudo v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=BGR3
Ggf. die Framerate noch:
sudo v4l2-ctl -d /dev/video0 --set-parm=60
Überprüfen:
v4l2-ctl -d /dev/video0 --get-fmt-video
Loopback Device(s) erstellen¶
Mit v4l2loopback drei Geräte /dev/video10...12 erstellen mit den jeweiligen Namen und exklusiv Flag (nur einmalige Nutzung erlaubt)
sudo modprobe v4l2loopback devices=3 video_nr=10,11,12 card_label="Stream10,Stream11,Stream12" exclusive_caps=1
Multiplex Stream¶
Quelle /dev/video0 -> /dev/video10...12
Mit ffmpeg natürlich...
ffmpeg -f v4l2 -input_format bgr3 -framerate 60 -video_size 1920x1080 -i /dev/video0 \
-vf format=yuv420p \
-map 0:v -f tee "[f=v4l2]/dev/video10|[f=v4l2]/dev/video11|[f=v4l2]/dev/video12"