为了方便批量处理,我试图创建一个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都可以。
如果我想要的根本无法做到,那么我想我将跨越这座桥时再考虑。
awk
。这节省了我很多麻烦! - SethRS='\r|\n'
来实现我在OSX上看到的相同行为。 - ajmicek