如何提取ffmpeg实时转码输出日志中的fps数值
解决方案
首先你之前的命令失效有两个核心原因:
- ffmpeg的运行状态日志默认输出到标准错误流(stderr)而非标准输出流(stdout),直接用管道无法捕获到对应内容
- ffmpeg默认用回车符
\r覆盖更新状态行,不会输出换行符,所以常规行处理工具识别不到单独的日志行
可用命令(实时提取fps数值)
ffmpeg -i in.mp4 -stats_period 0.0001 out.mp4 2>&1 | stdbuf -oL tr '\r' '\n' | grep -oP '(?<=fps=)\s*\K[0-9.]+'
各部分作用说明:
2>&1:将标准错误流重定向到标准输出流,让管道可以捕获到ffmpeg的状态日志stdbuf -oL:强制行缓冲模式,避免输出内容累积缓冲,保证实时输出tr '\r' '\n':将ffmpeg用来覆盖行的回车符替换为换行符,每一次状态更新都会变成独立的一行文本grep -oP '(?<=fps=)\s*\K[0-9.]+':正则匹配fps=后的数字,自动忽略fps=后面的空格,只输出纯数值
如果偏好使用awk实现,也可以用以下命令:
ffmpeg -i in.mp4 -stats_period 0.0001 out.mp4 2>&1 | stdbuf -oL tr '\r' '\n' | awk '/fps=/{match($0, /fps= *([0-9.]+)/, arr); print arr[1]; fflush()}'
这里加fflush()是为了强制awk实时输出结果,避免内部缓冲导致延迟。
如果需要把fps数值保存到文件,直接在命令末尾加>> fps_log.txt即可。
内容的提问来源于stack exchange,提问作者Kaique Vortex
相关产品推荐
相关产品推荐

