2017-07-06 53 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