ffmpeg monitor and restart stream when it hung or stall

You are using ffmpeg to stream to youtube but after a while, it hung or stuck. You want to restart the streaming command when this happens.

First run the ffmpeg command on a terminal in a while loop (this example is for fish terminal)

while true
  ffmpeg -re -i https://roundrobin3.videostreamingwowza.com/visdeurbel2/visdeurbel2.stream/playlist.m3u8 -c:v copy -c:a aac -ar 44100 -ab 128k -ac 2 -strict -2 -flags +global_header -bsf:a aac_adtstoasc -bufsize 3000k -f flv "rtmp://a.rtmp.youtube.com/live2/abcd-efgh-ijkl" > youtube.log
  sleep 5
end

This will run the stream and output it to a log.txt

run this script on separate terminal to monitor and restart ffmpeg process

#!/bin/sh

#sleep 10
while true
do
    frameA=$(grep "videostreamingwowza" youtube.log | tail -n1 | sed -n 's/.*\(roundrobin3.videostreamingwowza.com.*\.ts.*\)/\1/p')
    echo "A: $frameA"
    sleep 30
    frameB=$(grep "videostreamingwowza" youtube.log | tail -n1 | sed -n 's/.*\(roundrobin3.videostreamingwowza.com.*\.ts.*\)/\1/p')
    echo "B: $frameB"

    if [ "$frameA" = "$frameB" ]
    then
        echo "Stream has hung"
        printf "%s - Stream has hung\n" "$(date)" >> stream.log
        pkill ffmpeg
        echo "killed ffmpeg..."
    fi

    sleep 2
done

Basically it take some line from the log, and do it again after 30 seconds.

If the line stays the same, it assume that the stream stuck and kill the ffmpeg process

Last updated