似乎無法找出這一個出來......我有一個設置NGINX服務器與優秀的RTMP擴展,一切工作正常。但是,我正在嘗試restream /推送需要在另一個RTMP流應用程序中流式傳輸的特定流的副本(具體來說,這些流將流式傳輸到應用程序「靜態」,但在當前情況下也需要推送爲了活着」)。在NGINX-RTMP中重新進行流/推送流的過程相對簡單,但在我的情況下,我需要選擇性地推送一些流,而不是將每個流都流式傳輸到應用程序「靜態」。問:Bash腳本無限循環導致ffmpeg垃圾郵件
想法是讓NGINX-RTMP將流名稱傳遞給bash腳本,然後在不中斷任何其他流或服務的情況下執行restreaming。
取得了一些成功,我試圖通過創建一個bash紙條這樣..
在運行bash腳本有關NGINX配置位爲:
exec_publish /etc/nginx/rtmp_conf.d/stream_id.sh $name;
我有試過「如果/其他」
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
,我和開關試了一下
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
兩者都存在問題,它們最終都會發送大量ffmpeg進程垃圾郵件......並且我不知道爲什麼 - 我試過更改代碼,但是最終ffmpeg根本沒有啓動或發送垃圾郵件服務器。
也許是因爲我試圖一次完成所有這一切,這就是爲什麼我最終加載ffmpeg進程 - 因爲我以統一的方式做它導致每個「if/else」相乘...也許我應該爲每個想要restream的流分別做一個If/else? –
使用bash -x運行腳本以提供調試信息。 –
'if/else'和'case..esac'版本看起來是等價的。除非調用系統'NGINX-RTMP'在後臺運行整個腳本,這可能允許它幾乎立即啓動另一個子進程樹,否則不應該有任何理由對ffmpegs進行垃圾郵件。是否「檢查」文件,並且因爲文件沒有被隱藏,它認爲它應該啓動另一個進程?看看你的系統是否有'ptree',看看'ffmpeg'進程是從哪裏開始的(他們的父進程)。然後你有一個關於這是如何發生的線索。祝你好運。 – shellter