nginx/1.22.1
我在使用ffmpeg
Raspberry 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,因为脚本运行检索视频/音频的代码。