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')