Python отслеживает прогресс Handbrake

Поэтому я использую ручной тормоз и python для кодирования видео по расписанию. Мне нужно следить за прогрессом, потому что я использую его для оценки времени кодирования. Тогда я могу приспособить это к своему планировщику.

У меня проблема с получением ETA и% завершения процесса. Вот что у меня так далеко

profile = ["HandBrakeCLI","-i",input,"-o","output","-e","x264"]
cp = subprocess.Popen(profile, stderr=subprocess.PIPE, bufsize=1)
for line in iter(cp.stderr.readline, b''):

  # regex match for % complete and ETA
  matches = re.match( r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s', line.decode('utf-8') )

  if matches:
    print( matches.group() )

  print(line),

cp.stderr.close()
cp.wait()

Это не соответствует, на самом деле я не совсем уверен, что происходит. Когда я запускаю свой скрипт, я вижу ETA и распечатываю% complete

Encoding: task 1 of 1, 1.19 % (45.57 fps, avg 62.74 fps, ETA 00h08m01s)

Я пытался использовать стандартный вывод, но он тоже не работает.

1 ответ

Вам нужно читать с stdout, а не с stderr.

profile = ["HandBrakeCLI","-i",input,"-o","output","-e","x264"]
cp = subprocess.Popen(profile, stderr=subprocess.PIPE, strout=subprocess.PIPE, bufsize=1)
for line in iter(cp.stdout.readline, b''):

  # regex match for % complete and ETA
  matches = re.match( r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s', line.decode('utf-8') )

  if matches:
    print( matches.group() )

  print(line),

cp.stderr.close()
cp.stdout.close()
cp.wait()

Используя обертку прогресса (используя clint.textui.progress.Bar) и читайте побайтово (работает для меня):

profile = ["HandBrakeCLI","-i",input,"-o","output","-e","x264"]
cp = subprocess.Popen(profile, stderr=subprocess.PIPE, strout=subprocess.PIPE, close_fds=True)
bar = Bar(label="Encoding %s" % input, width=30, expected_size=10000, every=1)
bar.show(0)

line = ""
c = 0

while True:    
  nl = cp.stdout.read(1)
  if nl == '' and cp.poll() is not None:
     break  # Aborted, no characters available, process died.
  if nl == "\n":
     line = ""
  elif nl == "\r":
     # regex match for % complete and ETA, assuming the regex is ok.
     matches = re.match( r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s', line.decode('utf-8') )

     if matches:
        print( matches.group() )
        # do something
     line = ""
  else:
     line += nl

error = cp.stderr.read()
success = "Encode done!" in error

Не проверял код, переписал его, чтобы он соответствовал начальному посту темы.

Надеюсь, это поможет.

Здесь хорошие кости. Однако мне пришлось внести несколько изменений, чтобы заставить его работать с Python 3.7 и PyQt5. Строки пользовательского интерфейса предназначены для PyQt5 QProgressBar и QLineEdit

Этот код был протестирован. Благодарю всех вас за помощь.

def hbConvertISOtoMP4():

line = ""
inFile = #place your input file here!
oFile =  #place your output file here!

ui.progressBar.setValue(0)
profile = ["HandBrakeCLI", "-t", "1", "-i", inFile, "-o", oFile, "-e", "x264"]
cp = Popen(profile, stderr=PIPE, stdout=PIPE, close_fds=True)

ui.leProgress.setText('Loading data... Please Wait.')
ui.centralwidget.repaint()

while True:
    nl = cp.stdout.read(1)

    if nl == '' or cp.poll() is not None:
        break  # Aborted, no characters available, process died.

    elif nl.hex() == '0d' and len(line) > 30:

        # regex match for % complete and ETA, assuming the regex is ok.
        matches = re.match(r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s\)', line)

        if matches:
            # do something here
            # I inserted this code for a PyQt5 Progress Bar UI
            ui.leProgress.setText(line)
            ui.centralwidget.repaint()
            pBar = matches.group().split(' ')
            ui.progressBar.setValue(int(float(pBar[5])))

        line = ""
    else:
        line += nl.decode('utf-8')

error = cp.stderr.read()

if 'Encode done!' in str(error):
    ui.progressBar.setValue(0)
    ui.leProgress.setText("Encode Done!")
else:
    ui.leProgress.setText('Error during Endoding')
Другие вопросы по тегам