Kann nicht scheinen, diese herauszufinden ... Ich habe einen NGINX-Server mit der ausgezeichneten RTMP-Erweiterung eingerichtet und alles funktioniert gut. Ich versuche jedoch, eine Kopie einiger spezifischer Streams, die in einer anderen RTMP-Stream-Anwendung gestreamt werden müssen, erneut zu reamern/zu pushen (insbesondere werden diese Streams zur Anwendung "statisch" gestreamt, müssen aber in der aktuellen Situation ebenfalls übersteuert werden) Leben"). Der Prozess des Restreaming/Pushing eines Streams in NGINX-RTMP ist relativ einfach, aber in meinem Fall muss ich selektiv ein paar Streams pushen anstatt jeden Stream, der gestreamt wird, in die Anwendung "statisch" zu schicken.Q: Bash Skript Endlosschleife verursacht ffmpeg Spam
Idea ist, dass NGINX-RTMP den Stream-Namen an das Bash-Skript weiterleitet, das dann das Restreaming durchführt, ohne andere Streams oder Dienste zu unterbrechen.
Mit einigem Erfolg, ich habe durch die Schaffung eines bash Scrip dies zu tun versucht ..
Die entsprechend NGINX Config Bit, das das Bash-Skript ausgeführt ist:
exec_publish /etc/nginx/rtmp_conf.d/stream_id.sh $name;
Ich versuchte es mit einem " if/else“
if [ $1 == "stream_name_1" ]; then
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_1 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_0
elif [ $1 == "stream_name_2" ]; then
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_2 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_1
elif [ $1 == "stream_name_3" ]; then
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_3 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_2
elif [ $1 == "stream_name_4" ]; then
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_4 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3
else
echo "FAIL" >> /etc/nginx/rtmp_conf.d/stream.log && echo date > /etc/nginx/rtmp_conf.d/stream.log
exit
fi
Und ich versuchte es mit Switches
case "$1" in
"stream_name_1")
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_1 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_0
;;
"stream_name_2")
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_2 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_1
;;
"stream_name_3")
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_3 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_2
;;
"stream_name_4")
ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_4 -vcodec libx264 -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3
;;
echo "FAIL " >> /etc/nginx/rtmp_conf.d/stream.log && echo date > /etc/nginx/rtmp_conf.d/stream.log
esac
Problem mit beiden ist, dass sie am Ende eine Menge ffmpeg Prozesse spaming ... und ich weiß nicht warum - ich habe versucht, den Code zu ändern, aber entweder am Ende fmpeg nicht feuern oder spammen die Server.
Vielleicht ist es, weil ich versuche, alles auf einmal zu tun und deshalb am Ende mit vielen ffmpeg-Prozessen fertig bin - weil ich es in einer einheitlichen Weise mache, bewirkt es, dass jedes "if/else" multipliziert wird ... sollte ich vielleicht einen If/else für jeden Stream einzeln machen, den ich neu streamen möchte? –
Führen Sie das Skript mit bash -x aus, damit Sie Debuginformationen erhalten. –
die 'if/else' und' case..esac' Versionen scheinen gleich zu sein. Es sollte keinen Grund geben, für ffmpegs gespammt zu werden, es sei denn, das aufrufende System 'NGINX-RTMP' läuft das ganze Skript im Hintergrund ab, wodurch es möglich ist, fast sofort einen anderen Unterprozessbaum zu starten.Prüft es eine Datei, und weil die Datei nicht verborgen ist, dass sie einen anderen Prozess starten soll? Sehen Sie, ob Ihr System "ptree" hat und sehen Sie, wo die 'ffmpeg' Prozesse gestartet werden (ihr übergeordneter Prozess). Dann haben Sie einen Hinweis darauf, wie dies geschieht. Viel Glück. – shellter