无法在 nginx 服务器上同时传输两个 rtmp 流

无法在 nginx 服务器上同时传输两个 rtmp 流

nginx/1.22.1我在使用ffmpegRaspberry Pi同时传输两个流时遇到问题6.6.20+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.20-1+rpt1 (2024-03-07) aarch64 GNU/Linux

nginx.conf

rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                application live {
                        live on;
                        record off;
                        exec_play /home/pi/ffmpeg_live.sh &;
                }
                application live1 {
                        live on;
                        record off;
                        exec_play /home/pi/ffmpeg_live1.sh &;
                }
        }
}

ffmpeg_live.sh(ffmpeg_live1.sh 与此大体相同,但 lock 和 rtmp url 不同)

#!/bin/bash
lock_file=/tmp/.rtmp_lock
if test -f $lock_file; then
 exit 1
else
 touch $lock_file
fi

#
#... code that retrieves v.mp4 and a.m4a (forks with '&')
#
/home/pi/ffmpeg-3.4.2-arm64-64bit-static/ffmpeg -y -loglevel info -fflags +genpts   -re -i "v.mp4" -i "a.m4a"  -map 0  -map 1  -strict unofficial  -metadata date="2024-04-25T19:50:28.9104087+01:00" -ignore_unknown -copy_unknown -c copy -f flv rtmp://127.0.0.1:1935/live/stream & #forks!

rm -rf $lock_file

我正在使用exec_play,因此仅当我连接到 rtmp 服务器时流才会启动,并且锁定文件以防止ffmpeg在多次请求 rtmp url 时多次执行该文件。

如果我只访问其中一个流,则一切都可以正常工作,但是当我访问一个流然后访问另一个流时,有时它可以工作并且我可以从远程播放器看到该流,但大多数时候两个流都会无法流式传输,即使ffmpeg仍在运行,一段时间后其中一个流可能会再次流式传输。

有什么建议可以解决此问题吗?谢谢。

更新:

我正在尝试查明问题所在,因此我在 conf 中仅使用了一个流(application live1仅):在第一次尝试后,我尝试进行流式传输service nginx restart,但它不会流式传输,但在我终止第一个 ffmpeg 进程后,它将在第二次尝试中流式传输:

$ service nginx restart
*SENDING PLAY*
*FFMPEG STARTED* (exec_play)
*NO STREAM RECEIVED*
$ killall -9 ffmpeg
*SENDING PLAY*
*FFMPEG STARTED* (exec_play)
*STREAM WORKS*

nginx 访问日志

192.168.1.16 [29/Apr/2024:22:21:38 +0100] PLAY "live1" "stream" "" - 351 542 "" "" (10s)
192.168.1.16 [29/Apr/2024:22:21:48 +0100] PLAY "live1" "stream" "" - 351 542 "" "" (10s)
192.168.1.16 [29/Apr/2024:22:21:59 +0100] PLAY "live1" "stream" "" - 351 542 "" "" (10s)
192.168.1.16 [29/Apr/2024:22:22:12 +0100] PLAY "live1" "stream" "" - 351 542 "" "" (10s)
127.0.0.1 [29/Apr/2024:22:22:24 +0100] PUBLISH "live1" "stream" "" - 16349560 409 "" "FMLE/3.0 (compatible; Lavf59.27" (49s)
192.168.1.16 [29/Apr/2024:22:23:13 +0100] PLAY "live1" "stream" "" - 443 9115389 "" "" (34s)

第二个PUBLISH没有显示在日志中,我想是因为它在流结束后打印。

我发现问题出在exec_play当我在重新启动后评论exec_play并运行ffmpeg_live1.sh脚本时nginx它在第一次尝试时就流式传输。

我的最终目标是在客户端连接(播放)时启动一个脚本(使用 ffmpeg),并在最后一个客户端断开连接时终止该脚本(我也尝试过,exec_pull但它有类似的问题exec_play,我使用脚本而不是直接使用 ffmpeg,因为脚本运行检索视频/音频的代码。

相关内容