Set*_*eth 5 bash shell ffmpeg carriage-return
对于上下文,我正在尝试创建一个shell脚本,它简化了ffmpeg的实时控制台输出,只显示正在编码的当前帧.我的最终目标是在批处理的某种进度指示器中使用此信息.
对于那些不熟悉ffmpeg输出的人,它将编码的视频信息输出到stdout,并将控制台信息输出到stderr.此外,当它实际显示编码信息时,它使用回车来防止控制台屏幕填满.这使得不可能简单地使用grep和awk来捕获适当的行和帧信息.
我尝试过的第一件事是使用tr替换回车:
$ ffmpeg -i "ScreeningSchedule-1.mov" -y "test.mp4" 2>&1 | tr '\r' '\n'
这适用于它向控制台显示实时输出.但是,如果我然后将该信息传递给grep或awk或其他任何东西,tr的输出将被缓冲并且不再是实时的.例如:$ ffmpeg -i "ScreeningSchedule-1.mov" -y "test.mp4" 2>&1 | tr '\r' '\n'>log.txt导致文件立即填充一些信息,然后5-10秒后,更多行被删除到日志文件中.
起初我认为sed对于这个很好:$ # ffmpeg -i "ScreeningSchedule-1.mov" -y "test.mp4" 2>&1 | sed 's/\\r/\\n/'但是它会在所有回车的情况下到达行并等待处理完成之后再尝试做任何事情.我认为这是因为sed在逐行的基础上工作,并且需要整个行在它做任何其他事情之前完成,然后它不会替换回车.我已经尝试了各种不同的正则表达式用于回车和换行,并且尚未找到替代回车的解决方案.我正在运行OSX 10.6.8,所以我使用的是BSD sed,这可能是其中的原因.
我还尝试将信息写入日志文件并用于tail -f读取它,但我仍然遇到了实时替换回车的问题.
我已经看到在python和perl中有解决方案,但是,我不愿意立即走这条路.首先,我不知道python或perl.其次,我有一个功能齐全的批处理shell应用程序,我需要移植或找出如何与python/perl集成.可能并不难,但不是我想要进入的,除非我绝对必须这样做.所以我正在寻找一个shell解决方案,最好是bash,但任何OSX shell都可以.
如果我想要的东西根本不可行,那么当我到达那里时,我想我会越过那座桥.
如果这只是管道之后接收应用程序的输出缓冲问题。然后你可以尝试使用gawk(和一些 BSD awk) 或者mawk可以刷新缓冲区。例如,尝试:
... | gawk '1;{fflush()}' RS='\r\n' > log.txt
Run Code Online (Sandbox Code Playgroud)
或者,如果您的 awk 不支持此功能,您可以通过重复关闭输出文件并附加下一行来强制执行此操作...
... | awk '{sub(/\r$/,x); print>>f; close(f)}' f=log.out
Run Code Online (Sandbox Code Playgroud)
或者你可以只使用 shell,例如bash:
... | while IFS= read -r line; do printf "%s\n" "${line%$'\r'}"; done > log.out
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2049 次 |
| 最近记录: |