2015-06-18 272 views
0

我试图让ffmpegs输出到一个命名管道,在那里我可以从另一个shell读取。我不需要传输视频流,只需要下面的信息即可获得转换过程的状态。我不能够实现任何方式的管道的行为,但我可以用下面的命令将数据写入一个文件:管道ffmpeg输出到命名管道

ffmpeg -i vid.mov -vcodec h264 -acodec aac -strict -2 -y vid.mp4 > fflog.txt 2>&1 

这导致以下输出fflog.txt

Stream mapping: 
Stream #0:1 -> #0:0 (h264 (native) -> h264 (libx264)) 
Stream #0:0 -> #0:1 (aac (native) -> aac (native)) 
Press [q] to stop, [?] for help 
frame= 50 fps=0.0 q=0.0 size=  0kB time=00:00:03.20 bitrate= 0.1kbits/s 
frame= 73 fps= 70 q=28.0 size=  230kB time=00:00:04.05 bitrate= 465.4kbits/s 
frame= 100 fps= 65 q=28.0 size=  462kB time=00:00:05.44 bitrate= 695.3kbits/s 

之后我可以通过

tail -f -1 fflog.txt 

超出文件。但是我认为,这些界限并没有被正确地转义。 VI显示我下面的:

frame= 50 fps=0.0 q=0.0 size=  0kB time=00:00:03.20 bitrate= 0.1kbits/s 
^Mframe= 73 fps= 70 q=28.0 size=  230kB time=00:00:04.05 bitrate= 465.4kbits/s 
^Mframe= 100 fps= 65 q=28.0 size=  462kB time=00:00:05.44 bitrate= 695.3kbits/s 
^Mframe= 125 fps= 61 q=28.0 size=  608kB time=00:00:06.48 bitrate= 767.5kbits/s 

所以问题是:

  1. 如何将CRLF转换为UNIX像LF通过尾-n返回正确的数据?
  2. 甚至更​​好:如何正确管道ffmpeg结果到一个mkfifo命名管道?
  3. 还是最普遍的:有没有一种更聪明的方式来实现我的目标?
+0

dos2unix的文件? – rogerdpack

回答

1

让我们先解决行结尾。 ffmpeg使用回车符('\ r')将光标发送回行的开头,使其不会用进度消息填满终端。用tr,修复很简单。

ffmpeg -i input.mov output.webm 2>&1 | tr '\r' '\n' 

现在您应该分别看到每条进度线。如果我们将管道或重定向到其他地方,事情会变得更有趣。

ffmpeg -i input.mov output.webm 2>&1 | tr '\r' '\n' | cat 

请注意,输出显示为块而不是逐行显示。如果您的目的不可接受,您可以使用stdbuf禁用tr的输出缓冲。

ffmpeg -i input.mov video.webm 2>&1 | stdbuf -o0 tr '\r' '\n' | cat 

为了读取来自其他shell的输出,命名管道可能工作。但是,直到ffmpeg完成后,管道才会结束,因此tail将不会打印任何内容。您可以使用其他工具(如catgrep)读取正在运行的管道,但使用纯文件可能更容易。

# shell 1 
ffmpeg -i input.mov output.webm 2>&1 | stdbuf -o0 tr '\r' '\n' > fflog.txt 

# shell 2 
tail -f fflog.txt