Probleme mit FFMPEG und RTMP unter Ubuntu 24.02

SirLoading

Lt. Junior Grade
Registriert
Dez. 2021
Beiträge
355
Guten Morgen zusammen,

ich habe einen Server Upgrade bei Hetzner gemacht, da der alte Server nicht mehr genug Leistung hat.
(Es laufen auch Game-Server und hier hat die Leistung nicht mehr gereicht)

Also ich habe den EX44 bei Hetzner.
OS Ubuntu 24.02
Ubuntu 22.04 macht Probleme mit der iGPU. (Ob es am Server liegt oder OS, weiß ich nicht)

Also, was habe ich gemacht:
- iGPU Freigeschaltet
sudo apt-get install libnginx-mod-rtmp

sudo usermod -a -G video www-data
sudo usermod -a -G render www-data

sudo apt-get install ffmpeg
sudo apt-get install onevpl-tools vainfo intel-media-va-driver-non-free

Dann habe ich die nginx config bearbeitet und neugeladen.

RTMP:
rtmp {
server {
listen 1935;
chunk_size 4096;
max_message 5M;

application appname {
live on;
record off;
meta copy;

# push rtmp://adresse/foo/bar;

# exec ffmpeg -i /home/test.mp4
exec ffmpeg -i rtmp://127.0.0.1/appname/key
-c copy
-f flv rtmp://adresse/foo/bar 2>>/tmp/ffmpeg-$name.log;
}
}
}

  • Also wenn ich via push arbeite, dann wird es weitergeleitet.
  • Wenn ich eine .mp4 nutze und in OBS den Stream starte, dann wird die .mp4 gesendet. (Laut .log passt es)
  • Wenn ich den rtmp Stream als Input nehme, dann wird der Stream nicht weitergeleitet. (Laut .log startet ffmpeg, aber empfängt / verarbeitet keine Daten; keine Fehlermeldung)

In htop wird wir bei nginx ffmpeg angezeigt.

Im vergleich zum alten Server ist alles gleich eingerichtet, ich bin ratlos.
Hoffentlich kann mir jemand helfen.

Ja, ich weiß RTMP ist mehr das neuste und es gibt andere Möglichkeiten.
Muss das aber Zeitnah erstmal umsetzen, da beide Server Geld kosten.

Folgendes ist mir auch aufgefallen: (Oben neuer Server / unten alter Server)
Ob das was zu bedeuten hat, weiß ich nicht.
1721621489716.png


Vielen Dank
Grüße
SirLoading
 
Warum copiest du den stream überhaupt mit ffmpeg an einen anderen Endpunkt? Also was ist genau dein Plan?
 
Im Endeffekt schicke ich 1080p60 mit 12000er Bitrate an den Server.
Dieser leitet das an YouTube weiter.
Zudem macht er für Twitch 1080p60 mit 6000er Bitrate und sendet das raus.
Für Kick und YouTube Shorts auch.

Quasi ein Server für Multistreaming.

Warum mache ich das so?
Mein Upload reicht dafür nicht.
 
SirLoading schrieb:
Quasi ein Server für Multistreaming.
Verstehe.

In deinem Beispiel oben macht du aber kein recoding auf die von dir angegebenen Bitraten. Oder hast du die nur für das posten hier weggelassen?

Es gibt im RTMP-Modul allow and deny. Hast du mal versucht allow_play für 127.0.0.1 zu erlauben? (Genaue bezeichnung müsstest du nochmal in der doku nachschauen)

Dann was passiert, wenn du das ffmpeg Script testweise aus der nginx config nimmst, zu dem endpoint streamst und dann den ffmpeg command manuell auf dem server ausfühst? Bekommst du dann eine bessere Fehlermeldung von ffmpeg?

Kannst du den stream lokal mittels VLC empfangen?
 
Habe den Streaming Server aktuell auf einem Server mit einem i7 8700 am laufen.
Also mein Beispiel funktioniert da ohne Probleme.
Auch mit dem verringern der Bitrate via iGPU.

Ein Record muss ich aufmachen, wenn der Stream in eine Datei geschrieben werden soll.

Das umcodieren habe ich rausgenommen zur Fehlersuche.
Ein Push schickt den Stream an YouTube, sprich RTMP macht eigentlich. Was es soll.

Wenn ich die APP ohne exec / push habe, dann via console ffmpeg laufen lasse, dann wartet das auf den Beginn.

Sprich, keine Fehlermeldung.
Wenn ich den Key ändere, dann sagt er, io Error.

Wenn ich als -i eine .mp4 eintrage und den Stream starte, dann wird die .mp4 an YouTube gesendet.
Somit sollte RTMP in Verbindung mit Excel ffmpeg funktionieren.
Wenn ich hier das ffmpeg aus rtmp entferne und in der console starte, dann sehe ich, wie es arbeitet.

Via VLC geht nicht, geht aber auch nicht beim alten Server.

Allow und deny wäre eine Möglichkeit, muss ich heute Abend testen.
Ich weiß ja nicht, ob durch die neuere Hardware was anders gemacht werden muss.

Danke, teste ich heute Abend dann
 
SirLoading schrieb:
Ja, ich weiß RTMP ist mehr das neuste und es gibt andere Möglichkeiten.
Meinst du das Nginx Modul, oder das Protokoll? Das Protokoll ist immer noch am weitesten verbreitet und quasi Standard, auch wenn es Alternativen gibt. Wenn du mit Nginx+rtmp generell zufrieden bist, passt das schon auch. Wenn nicht gäbe es auch gute Alternativen.

Wenn du denkst, dass das Problem definitiv an ffmpeg liegt, könntest du auch erst mal Ngnix stoppen und direkt mit ffmpeg arbeiten, ist zum Debuggen sicher einfacher. Das kannst du nämlich auch in einem Server-Mode starten:

Code:
ffmpeg -f live_flv -listen 1 -i rtmp://0.0.0.0:1935/live/app -c copy -f flv rtmp://example.org/live/stream
 
  • Gefällt mir
Reaktionen: SirLoading
jb_alvarado schrieb:
Wenn du denkst, dass das Problem definitiv an ffmpeg liegt, könntest du auch erst mal Ngnix stoppen und direkt mit ffmpeg arbeiten, ist zum Debuggen sicher einfacher. Das kannst du nämlich auch in einem Server-Mode starten:

Code:
ffmpeg -f live_flv -listen 1 -i rtmp://0.0.0.0:1935/live/app -c copy -f flv rtmp://example.org/live/stream
Das ist interessant, gibt es hier auch die Möglichkeit vor dem annehmen des Streams eine URL aufzurufen um Berechtigungen zu prüfen wie das nginx modul es kann?
 
@NJay Leider nicht mit ffmpeg selber (es existieren patches dafür, werden aber nicht angenommen), aber mit etwas Scripting könnte es gehen:

Das stderr umleiten und überwachen, wenn ffmpeg dann eine Zeile ausgibt mit „rtmp“ und „Unexpected stream“ soll ffmpeg gestoppt werden.

Das ganze könnte man dann in einen Systemd Service packen, der ffmpeg jedes Mal neu startet.
 
Ach krass, auf die Idee bin ich ja gar nicht gekommen.
Also der der "Server-Mode" funktioniert ohne Probleme.

Dann liegt es wohl an der Zusammensetzung von NGINX + FFMPEG.
Beides für sich funktioniert ohne Probleme.

Also wenn ich den Server-Mode starte, dann zeigt es mir die Sachen an wie in den Logs.
Wenn ich dann den Stream starte, dann fängt ffmpeg an zu arbeiten. (So aber nicht bei NGINX + ffmpeg)

Ich vermute nun ein Rechte-Problem.
Also ffmpeg kann auf den RTMP-Stream nicht zugreifen.
Meine Vermutung, da ich als "-i" kein Problem mit einer ".mp4" habe.

Für mich reicht "libnginx-mod-rtmp", da ich fix meine Outputs drin habe und idR nichts ändern muss.
Keep it simple. :)

Alloy macht keinen Unterschied.
 
Wüsste jetzt nicht, warum hier ein Rechteproblem entsteht. ffmpeg wird ja im selben Kontext wie Nginx gestartet. Hört Nginx auf ipv4, oder ipv6? Wenn v6 wäre 127.0.0.1 ein Problem.
 
eig. ipv4.

Davon abgesehen, wenn ich den ffmpeg server-mode nutze, dann geht das via iGPU nicht, schmiert ab.
 
Zuletzt bearbeitet:
Nachtrag:
Also ich habe mal ein paar Dinge versucht.
Ich bin der Meinung:

ffmpeg wird gestartet sobald der Stream läuft und wartet auf die den Input.
Und hier scheint es zu hängen.

Habe mal das versucht:
ffprobe -v quiet -print_format json -show_streams rtmp://127.0.0.1/name/key
Auf dem alten Server kommt dann ein Output was die Daten des Streams betrifft.
Auf dem Neuen Server kommt einfach nichts.

Würde meine Annahme bestätigen.
Der RTMP Stream geht an den Server und startet den exect ffmpeg, aber irgendwie fehlt der Stream.


Das mit der iGPU erst Mal hinten angestellt.

Ok Nachtrag zur iGPU, hie rmusste ich noch folgendes installieren:
sudo apt-get install libmfx-dev

Könnte möglicherweise ein Packet für RTMP fehlen?
 
Zuletzt bearbeitet:
Vielleicht mal den ffmpeg error level auf debug stellen? Aber wenn das log jetzt schon komplett leer ist, würde ich auch tippen das ffmpeg keine Daten bekommt.

Was sagt denn netstat -tulpn und ps aux | grep ffmpeg wenn ein Stream rein kommt?
 
jb_alvarado schrieb:
Was sagt denn netstat -tulpn und ps aux | grep ffmpeg wenn ein Stream rein kommt?
Hab das "und" übersehen und das komplette ausgeführt...
1. Befehl bringt immer das gleiche.
2. Befehl einmal mit und einmal ohne Stream.
1721707587479.png

jb_alvarado schrieb:
Vielleicht mal den ffmpeg error level auf debug stellen?
Wie du es schon selbst gesagt hast. :(

Ich verstehe nur nicht, warum kann ich per "push" den Stream an YouTube weiterleiten, aber via exec / exec_push geht es nicht?!

Ich sehe nur verschiedene Versionen beim alten und neuen Server.
Habe beim alten Server mal alles Up2Date gebracht, da funktioniert das immer noch.

Hätte noch das: (Rot meine IP / Blau keine Ahnung?!)
Beim alten Server aber auch so, nur andere IP.
1721704404385.png


rtmp {
server {
listen 1935;
chunk_size 4096;
max_message 5M;

application live {
live on;
record off;
meta copy;

exec ffmpeg -i rtmp://127.0.0.1/live/Key-c copy -f flv rtmp://127.0.0.1/TestStream/Key;
}

application TestStream {
live on;
record off;
meta copy;
}
}
}

Ok, in der LOG von NGINX steht folgendes, wenn ich einen Stream starte:
(Alter Server hat das nicht)
2024/07/23 05:32:08 [alert] 13226#13226: unknown process 13353 exited on signal 9
Wobei das erst drin steht, wenn ich den Stream beende. (Evtl doch kein Fehler)

Habe zum testen mal das exec auskommentiert, dann kommt kein fehler, bei push auch nicht.
 
Zuletzt bearbeitet:
Nein, wenn der appname anders ist, dann bricht OBS ab.
Wenn der Key anders ist, dann startet ffmpeg nicht.

$app und $name sind Variabeln.
Ich möchte feste Werte, da sonst jeder einfach mit meiner IP streamen kann.
Habe das wie im Beispiel schon getestet.

Im Vergleich zum alten Server ist es identisch, nur bekommt ffmpeg keinen Input, bzw RTMP gibt keinen Output den ffmpeg abgreifen kann.

Wahrscheinlich ist es irgendetwas einfaches, so wie bei der iGPU.
Durch neues Ubuntu und neues ffmpeg + nginx irgendwas, was sich geändert hat... Ich hasse Technik 😇
 
Ich habe das auch mal in einem Container getestet und ich kann noch nicht mal den Stream abspielen, also ohne dass ffmpeg überhaupt involviert ist.
Ich würde da mal einen Bugreport auf Github öffnen. In der Zwischenzeit könntest du über Docker oder Inucs/lxd gehen. Oder du verwendest doch eine Alternative, wie z.B. SRS - das ist am nächsten an der nginx Syntax dran.
 
Zuletzt bearbeitet:
SRS habe ich schon versucht, geht auch nicht.
Docker und lxd bin ich raus.
Nutze ich auf dem Homeserver, will ich aber ungerne auf dem Server im Web nutzen.

Sonst hätte ich Restreamer genommen, aber auch only Docker.

Kann man auch eine ältere Version von NGINX / RTMP Modul installieren?
Wenn ja, wie?
Würde dann das vom alten Server versuchen
 
Könnte mir schon vorstellen, dass man auch eine ältere Version installieren kann, aber ist auch Gefrickel. Dann musst du die Version pinnen und was ist dann mit zukünftigen Updates?

Was ging denn bei SRS nicht? Damit kenne ich mich besser aus...
 
Quasi alles 😅
Weiß nicht mehr wie ich das damals auf dem alten vorletzten Server gemacht hatte.
Deswegen beim alten dann wieder rtmp.
 
Zurück
Oben