Получение вывода в реальном времени из ffmpeg для использования в индикаторе выполнения (PyQt4, stdout)

Я посмотрел на ряд вопросов, но до сих пор не могу понять это. Я использую PyQt и надеюсь запуститьffmpeg -i file.mp4 file.avi и получить вывод в виде потоков, чтобы я мог создать индикатор выполнения.

Я посмотрел на эти вопросы:Может ли ffmpeg показать индикатор выполнения? ловить стандартный вывод в реальном времени из подпроцесса

Я могу увидеть вывод команды 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

Отлично!

Ответы на вопрос(6)

Ваш ответ на вопрос