我已经看了一些问题,但仍然无法弄清楚这一点.我使用PyQt,我希望运行ffmpeg -i file.mp4 file.avi并获取输出流,所以我可以创建一个进度条.
我已经看了这些问题:
Can ffmpeg show a progress bar?
https://stackoverflow.com/questions/1606795/catching-stdout-in-realtime-from-subprocess
我可以使用以下代码查看rsync命令的输出:
import subprocess, time, os, sys
cmd = "rsync -vaz -P source/ dest/"
p, line = True, 'start'
p = subprocess.Popen(cmd,
shell=True,
bufsize=64,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
for line in p.stdout:
print("OUTPUT>>> " + str(line.rstrip()))
p.stdout.flush()
但是当我将命令更改为ffmpeg -i file.mp4 file.avi时,我没有收到输出.我猜这是与stdout / output缓冲有关的,但是我坚持如何读取这样的行
frame= 51 fps= 27 q=31.0 Lsize= 769kB time=2.04 bitrate=3092.8kbits/s
我可以用来弄清楚进度.
有人可以告诉我如何从ffmpeg获取这个信息到python的例子,有或没有使用PyQt(如果可能的话)
编辑:
我结束了jlp的解决方案,我的代码看起来像这样:
#!/usr/bin/python
import pexpect
cmd = 'ffmpeg -i file.MTS file.avi'
thread = pexpect.spawn(cmd)
print "started %s" % cmd
cpl = thread.compile_pattern_list([
pexpect.EOF,
"frame= *\d+",
'(.+)'
])
while True:
i = thread.expect_list(cpl, timeout=None)
if i == 0: # EOF
print "the sub process exited"
break
elif i == 1:
frame_number = thread.match.group(0)
print frame_number
thread.close
elif i == 2:
#unknown_line = thread.match.group(0)
#print unknown_line
pass
哪个给出这个输出:
started ffmpeg -i file.MTS file.avi
frame= 13
frame= 31
frame= 48
frame= 64
frame= 80
frame= 97
frame= 115
frame= 133
frame= 152
frame= 170
frame= 188
frame= 205
frame= 220
frame= 226
the sub process exited
完善!