2017-07-06 82 views
0

似乎無法找出這一個出來......我有一個設置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根本沒有啓動或發送垃圾郵件服務器。

+0

也許是因爲我試圖一次完成所有這一切,這就是爲什麼我最終加載ffmpeg進程 - 因爲我以統一的方式做它導致每個「if/else」相乘...也許我應該爲每個想要restream的流分別做一個If/else? –

+1

使用bash -x運行腳本以提供調試信息。 –

+0

'if/else'和'case..esac'版本看起來是等價的。除非調用系統'NGINX-RTMP'在後臺運行整個腳本,這可能允許它幾乎立即啓動另一個子進程樹,否則不應該有任何理由對ffmpegs進行垃圾郵件。是否「檢查」文件,並且因爲文件沒有被隱藏,它認爲它應該啓動另一個進程?看看你的系統是否有'ptree',看看'ffmpeg'進程是從哪裏開始的(他們的父進程)。然後你有一個關於這是如何發生的線索。祝你好運。 – shellter

回答

0

需要更多信息。
ffmpegs說什麼?
你檢查了$ 1嗎?
我想看整個腳本。

+0

對不起,這是整個腳本 - 這是一個特殊的一次性情況,通常情況下,直播流只能通過「靜態」流應用程序發送。 –

+0

嘗試將ffmpeg的stderr重定向到文件併發布其內容。 將2>〜/ log.txt放在ffmpeg命令的末尾。 – hedgar2017

0

事實證明,在我的情況下,ffmpeg不喜歡參數標誌「-vcodec x264」(奇怪,因爲源流使用x264編碼,但是很好),將其更改爲使用「複製」音頻和視頻編解碼器解決了我的問題 - ffmpeg不會產生數十個進程,每個進程都嘗試使用異常資源量。

在我的情況下,工作代碼的例子是:

要啓動的bash腳本,我把這個在我的NGINX配置(其中由RTMP的設計通過輸入流名字的bash腳本作爲模塊):

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

使用開關:

#!/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 

而使用的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