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)
我一直在尝试做类似的事情。我使用 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 秒内,则终止该进程。时间会证明这是否是正确的解决方案。
| 归档时间: |
|
| 查看次数: |
3772 次 |
| 最近记录: |