我有一个小问题,如何读取 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
(这是什么?)。
如果您想要grep
ffmpeg 的日志输出,您需要先将所有内容从 管道传输stderr
到stdout
,在 Bash 中您可以这样做:
ffmpeg … 2>&1 | grep …
但是,如果您正在从服务器运行进程,则最好将输出直接发送到日志文件,grep
如果需要的话,可以这样做。
ffmpeg … 2>&1 > /var/log/ffmpeg.log
grep "fps=…" /var/log/ffmpeg.log
请注意,每次调用 时> /var/log/ffmpeg.log
,该特定文件都会被您的 shell 截断并重写。您可以改为使用 附加到现有文件>>
。