似乎无法找出这一个出来......我有一个设置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