首页 > 解决方案 > 由于sed,如何在FFmpeg输出中替换没有新行的回车?

问题描述

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 流有很多错误,所以经常换行。任何想法?

谢谢。

标签: sedffmpegtr

解决方案


我想你正试图以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

推荐阅读