OBS Studio in the cloud
inspiriert von Martin Sauters Blog https://blog.wirelessmoves.com/2021/07/running-obs-studio-in-the-cloud.html
OBS in der Cloud bietet mir einige Vorteile, wenn ich z.B. bei Outdoor-Sportveranstaltungen, wie Radrennen, Motorsportveranstaltungen oder Skilanglaufmarathons, Videostreams mit mobilen Kameras mit 4G-Encodern produziere. Der Schnitt und die Produktion des fertigen Programms kann dann ortsunabhängig, von einem kleinen Rechner aus, in der Cloud erfolgen.
Eine sehr einfache Lösung: miete bei Hetzner einen virtuellen Server.
Damit hat es funktioniert:
Intel Xeon, CX51, 8VCPU´s, 32 GB RAM, 240 GB Disk Lokal mit Ubuntu 20.04
Aber auch andere Varianten mit AMD Prozessoren habe ich getestet und funktionieren. Da Hetzner aktuell (02/2022) keine Server mit GPU anbietet, müssen wir die fehlende Grafikkarte mit vielen CPU-Kernen ersetzen. Wenn ich Full-HD (1080p) Streams mit 30 fps bearbeiten und weiterleiten will, benötige ich 32 Kerne und trotzdem werden immer wieder mal paar Frames fallen gelassen. Also testen, testen und testen.
- Kostenreduzierung (keine Lizenzkosten)
- effektivere Auslastung der Hardware
Nach der Buchung des Servers mit Ubuntu, zuerst das Repository aktualisieren, den Video-Dummy-Treiber und das X-Windows-System installieren und einen neuen Benutzer zur Verwendung in der GUI wie folgt erstellen:
apt update -y && apt upgrade -y
apt install xserver-xorg-video-dummy -y
adduser obs
und ihm root Rechte geben
usermod -aG sudo obs
Da unser ausgewählter virtueller Server über keine Grafikarte und auch keinen Bildschirm verfügt, müssen wir diese simulieren und konfigurieren. Mit den folgenden Einstellungen in der Konfigurationsdatei wird ein Monitor erstellt/simuliert, der mit einer Bildwiederholfrequenz von genau 60 Hz läuft. Dies ist wichtig für OBS, um qualitativ hochwertige Aufnahmen von Videostreams mit 1080p und 30 oder 60 Hz zu erstellen!
Dafür gibt es die Konfigurationsdatei /etc/X11/xorg.conf, die folgenden Inhalt haben sollte:
nano /etc/X11/xorg.conf
# This xorg configuration file is meant to be used
# to start a dummy X11 server.
# For details, please see:
# https://www.xpra.org/xorg.conf
# Here we setup a Virtual Display of 1920x1080 pixels
# Konfiguration der Grafikkarte
Section "Device"
Identifier "dummy_videocard"
Driver "dummy"
Option "ConstantDPI" "true"
#VideoRam 4096000
#VideoRam 256000
VideoRam 192000
EndSection
# Monitordaten
Section "Monitor"
Identifier "dummy_monitor"
HorizSync 5.0 - 1000.0
VertRefresh 5.0 - 200.0
# Modeline Calculator
# https://arachnoid.com/modelines/
# 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
EndSection
# Zuordnung Grafikkarte und Monitor / Bildschirmauflösung
Section "Screen"
Identifier "dummy_screen"
Device "dummy_videocard"
Monitor "dummy_monitor"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
Virtual 1920 1080
EndSubSection
EndSection
Übrigens bringt Linux Tools mit, um die "Modeline" auszurechnen; gtf und cvt.
cvt 1920 1080 60
gibt uns z.B. Folgendes aus:
# 1920x1080 59.96 Hz (CVT 2.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz
Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
und
gtf 1920 1080 60
gibt aus:
# 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
CTV ist ein etwas neuerer Standart. Das VESA-Standardisierungsgremium hat Anfang 2003 den Video-Timing-Standard GTF (General Timing Formula) durch den CVT-Standard (Coordinated Video Timings) ersetzt.
OBS macht aber mit zwei Monitoren (Studio-Ansicht und Multiview-Ansicht) mehr Spaß.
Es gibt verschiedene Möglichkeiten. Ich definiere eine Dummy-Grafikkarte und zwei Dummy-Monitore in der xorg.conf und in der "Section Screen" gebe ich die Auflösung für zwei Full-HD Bildschirme nebeneinander, also zweimal 1920 Pixel Breite und 1080 Pixel Höhe an.
Dazu habe ich hier paar Infos gefunden: https://wiki.archlinux.org/title/Multihead
und hier: https://wiki.ubuntu.com/X/Config/Resolution#How_to_setup_a_dual_monitor
Variante für zwei gleiche Monitore an einer Grafikkarte: xorg.conf
, die ich gerade erstellt aber noch nicht getestet habe:
# zwei Virtuelle Displays mit jeweils 1920x1080 Pixel
# Screengröße ist damit 3840 x 1080 Pixel
Section "ServerLayout"
Identifier "Default Layout"
Screen "dummy_screen"
EndSection
# Konfiguration der Grafikkarte
Section "Device"
Identifier "dummy_videocard"
Driver "dummy"
Option "ConstantDPI" "true"
VideoRam 4096000
#VideoRam 256000
#VideoRam 192000
Option "Monitor-Left" "left_monitor"
Option "Monitor-Right" "right_monitor"
EndSection
# Monitordaten
Section "Monitor"
Identifier "left_monitor"
HorizSync 5.0 - 1000.0
VertRefresh 5.0 - 200.0
Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
Option "Primary" "true"
Option "LeftOf" "right_monitor"
EndSection
Section "Monitor"
Identifier "right_monitor"
HorizSync 5.0 - 1000.0
VertRefresh 5.0 - 200.0
Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
#Option "RightOf" "left_monitor"
EndSection
# Grafikkarte und Monitore / Bildschirmauflösung
Section "Screen"
Identifier "dummy_screen"
Device "dummy_videocard"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
Virtual 3840 1080
EndSubSection
EndSection
Als nächstes X-Window konfigurieren, indem du X als user root startest und nach kurzer Zeit, sobald die Konfiguration gemäß unserer xorg.conf geschrieben wurde und die Ausgabe im Terminal stoppt, mit STRG-C abbrichst.
X -config /etc/X11/xorg.conf
(Im Skript geht das nicht. Deshalb mal testen, ob ich den X-Server mit nohup einfach in einer extra Shell laufen lassen.)
Jetzt kommt so eine Anzeige:
X.Org X Server 1.20.11
X Protocol Version 11, Revision 0
Build Operating System: linux Ubuntu
Current Operating System: Linux ubuntu-32gb-nbg1-1 5.4.0-81-generic #91-Ubuntu SMP Thu Jul 15 19:09:17 UTC 2021 x86_64
Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.4.0-81-generic root=UUID=0bf56f61-7d4e-4900-8328-dfb8aaf686f0 ro consoleblank=0 systemd.show_status=true console=tty1 console=ttyS0
Build Date: 06 July 2021 10:17:51AM
xorg-server 2:1.20.11-1ubuntu1~20.04.2 (For technical support please see http://www.ubuntu.com/support)
Current version of pixman: 0.38.4
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Fri Sep 3 19:12:00 2021
(++) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
(II) Server terminated successfully (0). Closing log file.
paar Infos dazu:
Identifizieren der Displaynummer
Wenn kein anderer X-Server läuft, wird standardmäßig die Anzeigenummer 0 verwendet. Suche nach dieser Zeile, um die verwendete Anzeige zu identifizieren:
hier ist sie (==) Log file: "/var/log/Xorg.0.log", Time: Fri Sep 3 19:12:00 2021
Mit der Zeile Xorg.0.log wird dir mitgeteilt, dass das Display 0 verwendet wird, während dir Xorg.1.log sagt, dass das Display 1 verwendet wird.
locale-gen de_DE.UTF-8
Achtung: OBS Studio benötigt OpenGL 3.3 oder höher für Linux. Du kannst die Version von OpenGL deines Systems überprüfen, indem du
glxinfo | grep "OpenGL"
im Terminal eingibst. Dazu musst du vorher aber noch die mesa-utils installieren:apt install mesa-utils
.
Jetzt fehlt noch die komplette GUI, also der Windowmanager, der Displaymanager und die Desktop-Umgebung sowie ein Tool für den Fernzugriff (X11vnc).
Dafür kannst du dich jetzt als user obs zusätzlich per ssh auf deinem Server neu anmelden.
Hier teste ich noch, welcher Desktop am besten mit OBS-Studio harmoniert ;-)
Minimalvariante mit Gnome
apt install gnome-session gnome-terminal
apt install nautilus
apt install x11vnc
Falls ein VNC-Server auf einem Ubuntu-Server installiert werden soll, muss lt. ubuntuusers zusätzlich folgendes Paket installiert werden:
xfonts-base. apt install xfonts-base
Variante 1 / Gnome im Ubuntu-Style
Dabei werden z.B. Firefox, LibreOffice und Thunderbird mitinstalliert.
sudo apt install x11vnc gnome-shell ubuntu-gnome-desktop autocutsel gnome-core gnome-panel gnome-themes-standard gnome-settings-daemon metacity nautilus gnome-terminal dconf-editor gnome-tweaks yaru-theme-unity yaru-theme-gnome-shell yaru-theme-gtk yaru-theme-icon fonts-ubuntu tmux fonts-emojione -y
Variante 2
Bei der noch etwas zusätzliche Software mit installiert wird, wie z.B. LibreOffice, Firefox und Thunderbird sowie paar Spiele ... entspricht Variante 1 (??):
apt install ubuntu-desktop --no-install-recommends x11vnc
Variante 3
Sparsame kleine Desktopumgebung (Lubuntu ohne Anwendungsprogramme)
apt install x11vnc lightdm lxde-core
Die Installation dauert jeweils paar Minuten.
Wenn die Installation fertig ist, den Rechner neu starten:
reboot
oder reicht auch sudo systemctl restart gdm3
oder lightdm
?
mal testen, ob das funktioniert:
displaymanager=$( cut -d/ -f4 /etc/X11/default-display-manager )
systemctl restart $displaymanager
# oder stop und start
Schnell mal getestet:
apt update -y && apt upgrade -y
adduser cloud
usermod -aG sudo cloud
apt install xserver-xorg-video-dummy -y
jetzt die /etc/X11/xorg.conf erstellen
apt install x11vnc lightdm xfce4
apt install xfce4-terminal
reboot
wieder per SSH als user root verbinden und x11vnc starten
/usr/bin/x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -usepw
Im Terminal wird jetzt x11vnc gestartet. Wenn alles Fehlerfrei durchläuft erhältst du unter anderem die Info:
The VNC desktop is: debian....:0
PORT=5900
testen, ob der Fernzugriff per VNC Viewer funktioniert:
-> z.B. im VNC-Viewer von deiner lokalen Windows Maschine mit <Cloud-Server-IP>:5900
aufrufen. Bei mir hat´s funktioniert.
Das ist der Root-Zugriff
nano /lib/systemd/system/x11vnc.service
und einfügen:
[Unit]
Description="x11vnc"
Requires=display-manager.service
After=display-manager.service
[Service]
Type=simple
ExecStart=x11vnc -xkb -noxrecord -noxfixes -noxdamage -forever -loop -display :0 -auth /var/run/lightdm/root/:0
ExecStop=/usr/bin/killall x11vnc
Restart=on-failure
Restart-sec=2
[Install]
WantedBy=multi-user.target
dann noch:
systemctl daemon-reload
systemctl enable x11vnc.service
systemctl start x11vnc.service
systemctl status x11vnc.service
Diese Variante ist aus Sicherheitsgründen nicht zu empfehlen, da du dann auch per VNC Viewer immer als user root unterwegs bist. Außerdem wird kein VNC-Passwort abgefragt. Diese Variante macht auch keinen Sinn, wenn so eine virtuelle Maschine mal schnell, nur für wenige Stunden erzeugt, genutzt und dann wieder gelöscht wird, denn bereits nach wenigen Minuten wird deine Maschine von Boots gescannt und angegriffen.
Jetzt noch ffmpeg und OBS-Studio installieren:
#apt-get install software-properties-common
#add-apt-repository ppa:obsproject/obs-studio
apt install v4l2loopback-dkms -y
apt install ffmpeg
apt install obs-studio
#Bei Debian wird (01/2022) auf diese Weise leider nur eine ältere Version von OBS installiert.
Debian hat den Nachteil, das sich OBS nur in älteren Versionen über den Paktemanager installieren lässt. Ubuntu basiert zwar auch auf Debian, bringt aber von Haus aus deutlich aktuellere Software mit. Deswegen nutze ich aktuell Ubuntu.
x11vnc Passwort ändern: x11vnc -storepasswd
x11vnc starten: x11vnc -auth /run/user/root/gdm/Xauthority -usepw -forever -repeat -display :0
Im Terminal in einer aktiven Sitzung zwischen Graphischen System (GUI) und Textbasiertem System wechseln:
sudo systemctl isolate multi-user.target
# OR #
sudo systemctl isolate graphical.target
Ermitteln, welche Zieleinheit standardmäßig verwendet wird:
systemctl get-default
So änderst du das "Startziel" in den GUI-Modus:
sudo systemctl set-default graphical.target
Achtung: Stand 2022 nutzt Ubuntu 20.04 und 22.04 Wayland als "Displaytreiber". Das passt nicht zu X11vnc. Deshalb muss derzeit Wayland abgeschaltet werden.
nano /etc/gdm3/custom.conf
# und in der Zeile
# #WaylandEnable=false
# die Auskommentierung entfernen
Melde dich dann wieder per SSH als root an.
root@ubuntu-32gb-nbg1-1:~# ps wwwwaux | grep auth
Ausgabe:
root 1061 1.8 0.2 1671784 69504 tty1 Sl+ 12:23 0:00 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/128/gdm/Xauthority -background none -noreset -keeptty -verbose 3
root 1516 0.0 0.0 6432 664 pts/0 S+ 12:23 0:00 grep --color=auto auth
Du brauchst die Zahl zwischen /run/user/xxx/gdm/Xauthotity!
Starte dann x11vnc
root@ubuntu-32gb-nbg1-1:~# x11vnc -auth /run/user/**XXX**/gdm/Xauthority -usepw -forever -repeat -display :0
Wenn alles klappt, erhältst du solche Meldungen:
04/09/2021 12:14:41 -usepw: found /root/.vnc/passwd
04/09/2021 12:14:41 x11vnc version: 0.9.16 lastmod: 2019-01-05 pid: 11155
04/09/2021 12:14:41 Using X display :0
04/09/2021 12:14:41 rootwin: 0x50f reswin: 0x1400001 dpy: 0xb9710c30
04/09/2021 12:14:41
04/09/2021 12:14:41 ------------------ USEFUL INFORMATION ------------------
---
04/09/2021 12:14:41 --------------------------------------------------------
04/09/2021 12:14:41
04/09/2021 12:14:41 Default visual ID: 0x21
04/09/2021 12:14:41 Read initial data from X display into framebuffer.
04/09/2021 12:14:41 initialize_screen: fb_depth/fb_bpp/fb_Bpl 24/32/7680
04/09/2021 12:14:41
04/09/2021 12:14:41 X display :0 is 32bpp depth=24 true color
04/09/2021 12:14:41
04/09/2021 12:14:41 Autoprobing TCP port
04/09/2021 12:14:41 Autoprobing selected TCP port 5900
04/09/2021 12:14:41 Autoprobing TCP6 port
04/09/2021 12:14:41 Autoprobing selected TCP6 port 5900
04/09/2021 12:14:41 listen6: bind: Address already in use
04/09/2021 12:14:41 Not listening on IPv6 interface.
04/09/2021 12:14:41
04/09/2021 12:14:41 Xinerama is present and active (e.g. multi-head).
04/09/2021 12:14:41 Xinerama: number of sub-screens: 1
04/09/2021 12:14:41 Xinerama: no blackouts needed (only one sub-screen)
04/09/2021 12:14:41
04/09/2021 12:14:41 fb read rate: 485 MB/sec
04/09/2021 12:14:41 fast read: reset -wait ms to: 10
04/09/2021 12:14:41 fast read: reset -defer ms to: 10
04/09/2021 12:14:41 The X server says there are 10 mouse buttons.
04/09/2021 12:14:41 screen setup finished.
04/09/2021 12:14:41
**The VNC desktop is: ubuntu-32gb-nbg1-1:0**
**PORT=5900**
Herzlichen Glückwunsch. Damit läuft x11vnc für den User root. Du musst aber auch noch für den user cloud x11vnc starten!
Melde dich jetzt in einem neuen Terminal per SSH als user obs auf dem Server an.
Mit echo $UID
ermittelst du deine User ID.
In meinem Fall 1000. Diese 1000 fügst du in der folgenden Zeile ein und startest damit x11vnc als user cloud:
sudo x11vnc -auth /run/user/1000/gdm/Xauthority -usepw -forever -repeat -display :1
Leider funktioniert das hier nicht. Folgende Meldung erhalte ich:
cloud@ubuntu-32gb-fsn1-2:~$ sudo x11vnc -auth /run/user/1000/gdm/Xauthority -usepw -forever -repeat -display :1
[sudo] password for cloud:
04/09/2021 21:51:52 -usepw: found /root/.vnc/passwd
04/09/2021 21:51:52 x11vnc version: 0.9.16 lastmod: 2019-01-05 pid: 1835
04/09/2021 21:51:52 XOpenDisplay(":1") failed.
04/09/2021 21:51:52 Trying again with XAUTHLOCALHOSTNAME=localhost ...
04/09/2021 21:51:52 ***************************************
04/09/2021 21:51:52 *** XOpenDisplay failed (:1)
*** x11vnc was unable to open the X DISPLAY: ":1", it cannot continue.
*** There may be "Xlib:" error messages above with details about the failure.
Lösung:
Rufe zuerst mit dem VNC-Viewer den "root-Bildschirm" auf: "deine Server IP":5900
Achtung: In der Firewall müssen die Ports 5900 und 5901 offen !
(siehe "Vom Windows Client mit dem Server verbinden")
Ich habe mich verbinden und anmelden können. Dann kam aber ein leerer Bildschirm, da für den user cloud noch kein x11vnc Server gestartet wurde.
Melde dich wieder ab und starte jetzt als user cloud im Terminal den x11server
vorher kannst du mit ps wwwwaux | grep auth
nachschauen, ob du so eine Zeile siehst:
root 1990 1.2 0.2 1688272 82500 tty2 Sl+ 21:55 0:00 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
jetzt:
sudo x11vnc -auth /run/user/1000/gdm/Xauthority -usepw -forever -repeat -display :1
Jetzt hast du zwei Instanzen von x11vnc laufen. Später werden wir das noch als Service (systemd) laufen lassen. Jetzt musst du erstmal beide Terminals noch offen lassen!
Ich habe den RealVNC Viewer installiert.
Starte den VNC Viewer mit "deiner Server IP":5901
5901 ist der Standartport für Display 1, also das Display vom user cloud.
Hat bei mir funktioniert. Mein Server hat jetzt eine GUI und ich kann per VNC darauf zugreifen
Wir brauchen auch Audio für die OBS-Aufnahme. PulseAudio-System funktioniert auch dann gut, wenn keine physische Soundkarte vorhanden ist.
sudo apt install pulseaudio jackd2 alsa-utils dbus-x11
https://obsproject.com/wiki/install-instructions
im Terminal als user cloud
zuerst ffmpeg installieren und dann:
sudo apt install v4l2loopback-dkms -y
sudo add-apt-repository ppa:obsproject/obs-studio -y
# sudo apt update -y
sudo apt install obs-studio -y
In der Cloud bei Hetzner funktioniert so allerdings die "Virtuelle Kamera" noch nicht. Die Schaltfläche "Virtuelle Kamera" wird zwar angezeigt, beim Draufklicken öffnet sich ein Fenster mit einer Passwortabfrage, mehr passiert aber nicht. Im Log sehe ich folgende Fehlermeldung:
modprobe: ERROR: could not insert 'v4l2loopback': Unknown symbol in module, or unknown parameter (see dmesg)
Lösung:
# OBS beenden und dann:
sudo apt -y install v4l2loopback-dkms v4l2loopback-utils linux-modules-extra-$(uname -r)
sudo modprobe v4l2loopback
Jetzt läuft auch die "Virtuelle Kamera".
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb -y
In den Gratis-Varianten einiger VNC-Viewern wird kein Ton übertraqgen, was für uns aber wichtig ist. Deshalb nutze ich aktuell TeamViewer.
wget https://download.teamviewer.com/download/linux/teamviewer_amd64.deb
sudo apt install ./teamviewer_amd64.deb -y