改进 bash 脚本,用于检查 ffmpeg 何时将流式 IP 摄像头 rtsp 挂起到 youtube

sha*_*are 8 youtube ffmpeg stream rtsp

背景

我有一个花园 IP 摄像头,喜欢将直播传输到 youtube,所以我决定使用 ffmpeg 来实现这一点。

问题

每当我的网络摄像机重新启动或失去连接时;ffmpeg 将卡在同一帧上,并且一旦 IP 摄像头恢复在线就不会恢复。

我的解决方案

我将 ffmpeg 输出记录到文件中,然后让脚本每隔几秒获取日志的最后一行并比较帧数。如果帧号匹配,它会终止 ffmpeg 进程并启动另一个 ffmpeg 进程。

我的问题

有没有更好更高效的方法呢?

日志检查器.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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Jab*_*ock 3

我一直在尝试做类似的事情。我使用 ffmpeg 来记录 IP 摄像机镜头 (Reolink),因为内置 ftp 功能会跳过每个文件之间的几秒钟记录。有时录音会中断 12 秒。我使用Raspberry Pi作为服务器,用于录制相机的命令如下:

pgrep -x ffmpeg || ffmpeg -stimeout 5000000 -rtsp_transport tcp -i rtsp://user:pass@192.168.1.30/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
Run Code Online (Sandbox Code Playgroud)

我用来检查 ffmpeg 是否挂起的命令是:

test `stat -L -c %Y /proc/$(pgrep -x ffmpeg)/fd/4` -ge $(($EPOCHSECONDS - 10)) || killall ffmpeg
Run Code Online (Sandbox Code Playgroud)

事实证明,4 号管道是当前正在写入的文件的系统链接,因此我检查上次修改时间,如果不是在最近 10 秒内,则终止该进程。时间会证明这是否是正确的解决方案。