ffmpeg 通过在回车后覆盖之前的信息来连续显示帧数、流质量等。 在 Emacs 中,结果文件如下所示:
frame=11550 fps= 30 q=29.0 size= 50944kB time=00:06:23.23 bitrate=1089.0kbits/s dup=210 drop=7 speed=0.996x ^Mframe=11565 fps= 30 q=29.0 size= 51200kB time=00:06:23.73 bitrate=1093.0kbits/s dup=210 drop=7 speed=0.996x ^Mframe=11579 fps= 30 q=29.0 size= 51200kB time=00:06:24.19 bitrate=1091.7kbits/s dup=210 drop=7 speed=0.996x ^Mframe=11595 fps= 30 q=29.0 size= 51200kB time=00:06:24.73 bitrate=1090.2kbits/s dup=210 drop=7 speed=0.996x ^Mframe=11610 fps= 30 q=29.0 size= 51456kB time=00:06:25.23 bitrate=1094.2kbits/s dup=210 drop=7 speed=0.996x ^Mframe=11625 fps= 30 q=29.0 size= 51456kB time=00:06:25.73 bitrate=1092.8kbits/s dup=210 drop=7 speed=0.996x ^M
我试图删除控制字符,用换行符替换 ^M,用换行符替换回车符,以便稍后获取帧号和其他信息,但我失败了。 这是我的命令:
stdbuf -o0 tail -f -z ffreport.log| sed -u -e 's/x1b[[0-9;]*m//g' -e "s/r/n/" -e "s/^M/n/" -e 's/ +/t/g' |stdbuf -o0 grep "frame="|stdbuf -o0 cut -d$'t' -f2,4,6
事实上,从 CR/^M 到换行符的转换似乎不起作用,因为当我只保留 sed 的第一部分时,我什么也得不到。 这个命令行以前曾经工作过,因为我的 ffmpeg 流有很多错误,所以换行符经常。 知道吗?
谢谢。
我认为您正在尝试以某种方式监视ffmpeg
的进度。如果你让它以合理的可解析格式将进度写入不同的文件描述符,而不是试图读取用于终端并充斥着控制代码的东西,你可能会取得更大的成功。
因此,您可以为进度消息制作一个 fifo 并像这样阅读它们:
mkfifo ffmpeg.log
cat ffmpeg.log
然后运行如下ffmpeg
命令,进度定向到 fifo:
fmpeg -y -f lavfi -i testsrc=duration=10:size=1920x1080:rate=25 -progress pipe:3 null.mkv 3> ffmpeg.log
非常感谢马克的回答,在此基础上,我建立了我不好(但有效(的答案。
cat ffmpeg.log |awk '/^frame/{split($1,frame,"=")}/^fps/{split($1,fps,"=")}/^speed=.+x$/{split($1,speed,"=");printf "%s|%s|%sn", frame[2],fps[2],speed[2]}'
这给了我想要的东西,或多或少:
35|0.0|
47|42.5|
69|42.5|0.394x
91|42.4|0.709x
113|42.6|0.904x
135|42.8|1.04x
157|42.8|1.14x
179|42.8|
201|42.8|1.26x
223|42.8|
245|42.8|1.34x
267|42.8|1.37x
289|42.8|
303|41.7|1.38x
325|41.8|
347|41.9|1.42x
369|41.9|1.44x
391|42.0|1.45x
413|42.0|1.47x
435|42.1|1.48x
457|42.1|1.49x
479|42.2|
501|42.2|1.51x
523|42.3|1.52x
545|42.3|1.53x
559|41.7|1.51x
581|41.8|1.52x
603|41.8|1.52x