python stdout timeout_python – 从ffmpeg获取实时输出,用于进度条(PyQt4,stdout)

我已经看了一些问题,但仍然无法弄清楚这一点.我使用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

完善!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值