sed - 由于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 流有很多错误,所以经常换行。任何想法?
谢谢。
解决方案
我想你正试图以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
推荐阅读
- latex - 我可以在markdown中插入文件中的数字吗?
- python - 在 Pandas 中避免整数的科学记数法
- r - 如何在给定R中的向量维度的情况下创建多个方阵
- hadoop - 如何防止hadoop以安全模式启动?
- html - 如何确保长文本在圆形内水平和垂直居中
- reactjs - React Native 错误 - 未定义不是函数(评估“(0 _reactnavigation.switchnavigator)”)
- ios - 隐藏在表格视图中的自定义范围滑块
- javascript - 使用 Javascript 函数进行时间转换
- sql - 在 Bigquery 中的 sum() 之后将科学记数法转换为浮点数
- php - 从具有相同值的两个表中选择数据后结果重复