使用 bash 读取 FFmpeg 终端输出

使用 bash 读取 FFmpeg 终端输出

我有一个小问题,如何读取 FFmpeg 运行时生成的终端输出文本。我有一个流媒体服务器,里面有一个摄像头流,当摄像头所在位置的网络连接出现问题时,它有时会损坏和丢失。循环会检查此流while,当连接完全断开时,循环会尝试重新启动它。

但在某些情况下,当出现大量数据包丢失时,流会损坏,但不会完全停止。FFmpeg 编码挂起,与服务器的连接不会断开。(那时我的“重启”循环就没用了)。当发生这种情况时,视频的 FPS 开始下降到较低的值,然后我需要捕获该值并采取必要的措施。

包含该信息的行如下所示:

frame=74190 fps= 20 q=0.0 size=  285208kB time=01:01:49.45 bitrate= 629.9kbits/s

因此,如果 中的值fps= 20下降到 18 或更低,则会采取适当的措施。我需要使用什么?我尝试通过管道传输,grep但没有成功。

我会很高兴得到任何能够取得进展的解决方案或建议。

答案1

请注意,ffmpeg 的输出写入stderr而不是stdout这是什么?)。

如果您想要grepffmpeg 的日志输出,您需要先将所有内容从 管道传输stderrstdout,在 Bash 中您可以这样做:

ffmpeg … 2>&1 | grep …

但是,如果您正在从服务器运行进程,则最好将输出直接发送到日志文件,grep如果需要的话,可以这样做。

ffmpeg … 2>&1 > /var/log/ffmpeg.log
grep "fps=…" /var/log/ffmpeg.log

请注意,每次调用 时> /var/log/ffmpeg.log,该特定文件都会被您的 shell 截断并重写。您可以改为使用 附加到现有文件>>

相关内容