似乎想不出这件事...我有一个带出色的RTMP扩展的NGINX服务器,一切都很好。但是,我正在尝试回流/推送两个特定流的副本,这些流需要在另一个RTMP流应用程序中流式传输(具体地说,这些流被流式传输到应用程序“静态”,但在当前情况下也需要推送到“实时”)。在NGINX-RTMP中回流/推流的过程相对简单,然而,在我的例子中,我需要有选择地推送几个流,而不是每个流都“静态”地流到应用程序。
我的想法是让NGINX-RTMP将流名称传递给bash脚本,然后bash脚本在不中断任何其他流或服务的情况下执行重流。
在一些成功的情况下,我尝试通过创建bash脚本来做到这一点。
运行bash脚本的相关NGINX配置位是:
exec_publish /etc/nginx/rtmp_conf.d/stream_id.sh $name;
我试着用"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
我用开关试了试
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根本没有触发,要么就是给服务器发了垃圾邮件。
发布于 2017-07-07 01:15:11
需要更多信息。
ffmpegs是怎么说的?
你检查过1美元了吗?
我想看看完整的剧本。
发布于 2017-07-07 03:28:45
事实证明,在我的情况下,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
https://stackoverflow.com/questions/44949290
复制相似问题