我的 BeeCam 是 Raspberry Pi3/Raspbian Stretch,带有新编译的 ffmpeg 版本 N-89882-g4dbae00bac,并将其作为服务运行:
#!/bin/bash
cd /usr/local/bin/
while true
do
./ffmpeg -re -thread_queue_size 512 -rtsp_transport tcp -i \
"rtsp://anonymous:[email protected]:554" -i WilliamTellOverture.mp3 \
-vcodec copy -acodec copy -t 00:11:51 -f flv \
"rtmp://a.rtmp.youtube.com/live2/my-youtube-streaming-key"
sleep 10s
done
其中 192.168.1.11 是我的新款 Reolink RLC-423S,-t 00:11:51是我的免版税 MP3 的长度。这通常很有效:
https://www.youtube.com/user/IAmTheWaterbug/live
并且会不断循环。YT 流在重新启动时会出现故障,但流会恢复,只会丢失大约 15 秒的视频。在我开始摆弄它之前,它至少连续运行了一整夜 8 个小时(例如多次循环)。
我将睡眠时间改为 5s,但这似乎并没有造成困扰。
但有时我会sudo systemctl 停止 StreamToYouTube其次是sudo systemctl 启动 StreamToYouTube,在 1-2 秒内(例如,我打字的速度向上 向上 向上和进入),有时当我这样做时,流会失败,并且 ffmpeg 开始转储:
[rtsp @ 0x302c2f0] RTP: PT=60: bad cseq e680 expected=0b49
[rtsp @ 0x302c2f0] RTP: PT=60: bad cseq 93ab expected=0b49
[rtsp @ 0x302c2f0] RTP: PT=60: bad cseq 93ac expected=0b49
[rtsp @ 0x302c2f0] RTP: PT=60: bad cseq e682 expected=0b49
不休。
重启 Pi 并不能解决这个问题(例如 YT 流仍然失败,并且 sudosystemctl 状态 StreamToYouTube返回相同的“bad cseq”错误流),但重新启动相机确实可以解决问题。我想知道这个错误到底是什么意思,以及如何向 Reolink 报告。
在“失败”状态下,相机似乎在其他客户端上正常工作,例如,我可以在 Mac 上启动 Reolink.app 或从任何浏览器查看相机的网页,并且视频看起来很好。
但由于某种原因,RTSP 流变得异常,以至于 ffmpeg 无法解决。
如果我快速停止/启动服务,它是相当可重复的,但在我的脚本中暂停 5 秒重新启动似乎并不会困扰它。
谢谢!
答案1
我在 Reolink C2 上遇到了类似的问题,在一个用作ffmpeg
子进程的自定义 NodeJS 程序中(在我的 Windows 计算机上)。
有相同类型的错误(“RTP:PT=60:坏 cseq a5b6 预期=4e9b”等),以及类似的高级症状(不久后启动第二个流会失败,但从其他设备(如我的手机)流可以正常工作)。
一个区别是,就我的情况而言,只要我让相机静置(不尝试启动任何流!)约 30 秒到 1 分钟,问题就会解决。所以也许这是固件差异,我的型号会在一定时间段后自动终止/清理旧流,而您的型号则不会。
无论如何,我最终找到了解决我的问题的方法:https://github.com/agsh/rtsp-ffmpeg/issues/35
摘要:我用来启动流的库在希望流结束时ffmpeg
没有“正常终止”进程。它只是调用,这导致了问题。ffmpeg
process.kill()
一旦我将该process.kill()
行更改为process.stdin.write("q\r\n")
,问题就完全解决了。(显然,某些版本通过其标准输入ffmpeg
接受q
命令以正常退出,而其他版本则不然 - 因此 Linux 和 Mac 的解决方案可能不同)
我不知道您启动和停止方法的细节ffmpeg
,但我建议仔细查看终止该过程的代码,并确保它允许ffmpeg
“正常退出”,因为这为我解决了问题。