改进bash脚本以检查ffmpeg何时将流式IP cam rtsp挂起到youtube

时间:2018-03-25 01:11:30

标签: ffmpeg youtube stream rtsp

背景

我有一个花园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

1 个答案:

答案 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秒钟之内,则终止进程。时间会证明这是正确的解决方案。