Bash ffmpeg在连接中断时从关闭的实时流录制视频

Bash ffmpeg在连接中断时从关闭的实时流录制视频,bash,ubuntu,video,ffmpeg,stream,Bash,Ubuntu,Video,Ffmpeg,Stream,我面临FFMPEG流的问题。我正在尝试将实时运行的流记录到文件_Name.ts文件中。使用以下代码可以正常工作 ffmpeg -i "http://clientportal.link:8080/live/tmalik/Tanveer/9026.m3u8" -c copy abc.ts -y ffmpeg-i“http://clientportal.link:8080/live/tmalik/Tanveer/9026.m3u8“-c复制abc.ts-y 但实际的问题是,我的输入流不太稳定,它在平均

我面临FFMPEG流的问题。我正在尝试将实时运行的流记录到文件_Name.ts文件中。使用以下代码可以正常工作

ffmpeg -i "http://clientportal.link:8080/live/tmalik/Tanveer/9026.m3u8" -c copy abc.ts -y ffmpeg-i“http://clientportal.link:8080/live/tmalik/Tanveer/9026.m3u8“-c复制abc.ts-y 但实际的问题是,我的输入流不太稳定,它在平均1小时后停止4-6秒

现在有什么方法可以让我自动重新连接,如果我从链接中得到我的流(在上面的代码中作为输入给出)


重要的是我在UBUNTU机器上工作。因此,如果有任何bash文件将被删除

制作一个bash脚本,如

#!/bin/bash
# this script will run until someone kills it
echo PID="$PID"
while true ; do
    startDateTime=$(/bin/date +%Y-%m-%d.%H%M)
    echo "starting ffmpeg at ${startDateTime}"
    ffmpeg -i "http://clientportal.link:8080/live/tmalik/Tanveer/9026.m3u8" -c copy abc."${startDateTime}".ts -y
    # sleep 0.5
done
将其保存到文件(不要使用Windows编辑器保存,只使用纯文本编辑器)

现在,将该文件标记为可执行文件(因此它将作为脚本运行),使用

从终端命令行运行它,如下所示

nohup /path/to/ffmpegRestarter.sh > /tmp/ffmpegRestarter.log.${startDateTime}.$$ 2>&1 &
(当然,将
/path/更改为
到脚本的正确路径。)

现在,您可以在终端会话中执行其他操作,也可以启动另一个终端会话,只是为了进行监视,您可以查看/tmp/${logName}.log文件的末尾,了解使用

tail -f /tmp/ffmpegRestarter.log."${startDateTime}".* 
您可以使用
Ctrl-C
停止查看文件

您可以完全退出终端,稍后返回查看该文件

您还需要监视正在创建的文件,因此请使用以下两个命令

/bin/ls -l /path/to/abc.* | tail -5
/bin/ls -l /tmp/ffmpegRestarter.log.* | tail -5
您可以将
-5
更改为您想要的任何数字,它将显示每种类型的最后
N
文件

如果您认为存在问题,并希望终止脚本,请使用

pid=$(grep '[P]ID=' /tmp/ffmpegRestarter.log.YYYY-MM-DD.HHMM.$$)
pid=${pid#PID=}
ps -ef | grep "$pid"   # this line to confirm that the job is still running
# will return something like
# userX    1088  1029  0 16:31 ?        00:00:00 /path/to/ffmpegRestarter.sh
kill $pid

#worst case, use
kill -9 $pid
# dont get in a habit of using `-9` on kill, bad things can happen! ;-)
我在这里留下了几个小错误,所以您必须考虑正在发生的事情和缺少的东西;-)


根据您的查询“30秒后运行另一个程序”,您只需

nohup /path/to/ffmpegRestarter.sh > /tmp/ffmpegRestarter.log.${startDateTime}.$$ 2>&1 &
sleep 30
anotherProgram

IHTH.

如果在修复此问题之前您缺少关键视频,您可以使用权宜之计解决方案,如将cmd放入“无限”循环,即
为true;不要;完成
,每次停止时将重新启动ffmpeg。也许您想在文件名中添加一个日期/时间戳,以便以后可以使用一些软件来组装它们。(我知道有这样的东西,但我不能告诉你该用什么)。使用
-c copy abc.$(/bin/date+%Y%m%d.%H%m%S).ts…
在创建每个文件时为其添加新的日期戳。祝你好运。谢谢你的快速回复。我不喜欢bash,你能帮我吗?我会帮你一点,但我不想变成技术支持。现在很忙,稍后将发布上述内容的更完整版本。祝你好运。谢谢你的剧本。它工作得很好。我现在只需要做最后一件事。我可以在30秒后用bash文件启动另一个进程吗?@FarhanShahid::-)。祝你好运。我试过了,但运气不好/bin/bash#此脚本将一直运行,直到有人将其杀死,并在为true时回显PID=“$PID”;do startDateTime=$(/bin/date+%Y-%m-%d.%H%m)echo“在${startDateTime}开始ffmpeg”ffmpeg-i”“-c copy/home/tanveer/channels_ts/abc.ts-Y sleep 10 echo”为abc“vlc-vvv”启动vlcfile:///home/tanveer/channels_ts/abc.ts“--sout'#std{access=http,mux=ts,dst=:55665/ABC#u NEW}”“你不记得我说过什么技术支持吗?我已经回答了你原来的问题。请接受这个答案,然后发布一个新问题。如果可以,我会帮助你。祝你好运。这是我最不想用这段代码做的事情。只要在while循环中10秒或30秒后也要玩VLC
nohup /path/to/ffmpegRestarter.sh > /tmp/ffmpegRestarter.log.${startDateTime}.$$ 2>&1 &
sleep 30
anotherProgram