背景
我有一个花园IP cam id喜欢直播到youtube,所以我决定使用ffmpeg实现这一点。
问题
每当我的IP摄像头重新启动或失去连接时; ffmpeg将卡在同一帧上,一旦IP cam重新联机就不会恢复。
我的解决方案
我将ffmpeg输出记录到文件中,然后让脚本每隔几秒获取一次日志的最后一行并比较帧号。如果帧数匹配,则会终止ffmpeg进程并启动另一个ffmpeg进程。
我的问题
有更好的方法更有效吗?
logchecker.sh
#/bin/bash
while true
do
frameA=$(tail /home/daniel/output.txt -n 1 | sed -nr 's/.*frame=(.*)fps.*/\1/p')
echo "$frameA"
sleep 3
frameB=$(tail /home/daniel/output.txt -n 1 | sed -nr 's/.*frame=(.*)fps.*/\1/p')
echo "$frameB"
if [ "$frameA" = "$frameB" ]
then
echo "Camera has hung"
pkill ffmpeg
echo "killed ffmpeg..."
echo "Waiting 30 secs"
sleep 30
bash /home/daniel/ffmpeg.sh &
echo "started ffpmeg.."
echo "Waiting 30 secs"
sleep 30
else
echo "proceed"
fi
sleep 2
done
ffmpeg.sh
#!bin/bash
sleep 30
ffmpeg -f lavfi -i anullsrc -rtsp_transport udp -i rtsp://user:password@url:5544/live0.264 -bufsize 5000k -c:v copy -c:a mp3 -b:a 1 -f flv rtmp://a.rtmp.youtube.com/live2/xxxx-xxxx-xxxx-xxxx 2> /home/daniel/output.txt
答案 0 :(得分:0)
我一直在尝试做类似的事情。我使用ffmpeg来记录IP摄像机的素材(Reolink),因为内置的ftp功能会跳过每个文件之间的记录几秒钟。有时录音会中断12秒钟。我使用Raspberry Pi作为服务器,而我用来记录摄像机的命令如下:
pgrep -x ffmpeg || ffmpeg -rtsp_transport tcp -i rtsp://admin:password@192.168.1.100:554//h264Preview_01_main -c copy -map 0 -f segment -segment_time 60 -segment_format mp4 -segment_atclocktime 1 -reset_timestamps 1 -strftime 1 /srv/dev-disk-by-id-usb-Seagate_Expansion_Desk_2HC015KJ-0-0-part1/camera/Backyard-%Y%m%d-%H%M%S.mp4
我一直用来检查ffmpeg是否挂起的命令是:
test `stat -L -c %Y /proc/$(pgrep -x ffmpeg)/fd/4` -ge $(($EPOCHSECONDS - 10)) || killall ffmpeg
结果显示,管道号4是到当前正在写入文件的系统链接,因此我检查了上次修改的时间,如果不是在最近的10秒钟之内,则终止进程。时间会证明这是正确的解决方案。