2017-07-06 5 views
0

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.

+0

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? –

+1

Führen Sie das Skript mit bash -x aus, damit Sie Debuginformationen erhalten. –

+0

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

Antwort

0

Benötigen Sie weitere Informationen?
Was sagen ffmpegs?
Haben Sie die $ 1 überprüft?
Ich möchte das gesamte Skript sehen.

+0

Entschuldigung, aber das ist das ganze Skript - dies ist eine spezielle einmalige Situation, in der dies notwendig ist, normalerweise würden die Livestreams nur durch die "statische" Stream-Anwendung gesendet werden. –

+0

Versuchen Sie, ffmpegs stderr in eine Datei umzuleiten und den Inhalt zu posten. Geben Sie 2> ~/log.txt am Ende eines ffmpeg-Befehls ein. – hedgar2017

0

Es stellt sich heraus, dass in meiner Situation ffmpeg nicht mochte das Argument Flag "-vcodec x264" (seltsam, weil der Quellstream mit x264 kodiert ist, aber oh well), ändern Sie es zu "kopieren" Audio und Video Codec hat mein Problem behoben - ffmpeg erzeugt nicht Dutzende von Prozessen, von denen jeder versucht, abnormale Ressourcenmengen zu verwenden.

Die Beispiele für den Arbeits Code in meinem Fall ist:

den Bash-Skripte zu initiieren ich dies in meinem NGINX Config bin platzieren (die die eingehenden Stream-Namen an das Bash-Skript geht, wie durch Design des RTMP Modul):

exec_publish /etc/nginx/rtmp_conf.d/stream_id.sh $name; 

mit den Schaltern:

#!/bin/bash 
case "$1" in 
    "stream_name_1") 
     ffmpeg -re -i rtmp://127.0.0.1:2000/static/stream_name_1 -vcodec copy -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 copy -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 copy -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 copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3 
    ;; 
esac 

Und mit If/Else:

#!/bin/bash 
if [ $1 == "stream_name_1" ]; then 
    ffmpeg -re -i rtmp://127.0.0.1:2000/static/$1 -vcodec copy -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/$1 -vcodec copy -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/$1 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_2 
else [ $1 == "stream_name_4" ]; then 
    ffmpeg -re -i rtmp://127.0.0.1:2000/static/$1 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:2000/live/live_3 
fi 
Verwandte Themen