Как правильно получить вывод ffmpeg в python?
Написал себе gui-шку для ffmpeg.
Запускаю, запускается. И даже конвертирует. Однако ни в какую не хочет выводить мне ответ ffmpeg'а в gui.
Код:
# Та часть, которая запускает конверт:
height, width = find_video_metadata(old_file_name)
# файлы бывают с нечетной стороной, так что использую найденную в интернете команду
if height % 2 == 1 or width % 2 == 1:
command = 'ffmpeg -hide_banner -loglevel error -i "' + old_file_name + \
'" -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" "' + new_file_name + '"'
else:
command = 'ffmpeg -hide_banner -loglevel error -i "' + old_file_name + \
'" "' + new_file_name + '"'
convert_webm_mp4(command, log_info) # у меня в gui есть поле Text, log_info печатает в его конец.
# и сам конверт, тот вариант из интернетов, что хотя бы конвертирует,
# а не отваливается сходу с ошибками "Йа не знать кто такой '-loglevel error' давай папроще!":
def convert_webm_mp4(command, log_info):
log_info(command)
try:
p = subprocess.Popen(command, stdout=subprocess.PIPE)
out, err = p.communicate()
log_info("Info from convert: " + str(out))
log_info("Error from convert: " + str(err))
except Exception as e:
log_info('Error from try: ' + str(e))
В PyCharm в поле Run возникают надписи типа [matroska,webm @ 0000012ab12a1a00] File ended prematurely. В мой Text добавляются строки:
ffmpeg -hide_banner -loglevel error -i "input_file_address.webm" -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" "output_file_address.mp4"
Info from convert: b''
Error from convert: None
Во что мне можно попробовать что то переделать, чтобы python получал и выводил мне ответ ffmpeg'а?
Ответы (1 шт):
Автор решения: Gh0sTG0
→ Ссылка
Как посоветовал andreymal в комменте - надо изменить всего лишь одну строку, которая запускает сабпроцес:
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # Добавлено `stderr=subprocess.PIPE`
# Плюс ниже сделал конвертацию строк, удаление перехода на новую строку, и проверку на то что он не пуст:
out_text = str(out.decode("utf-8").replace("\r\n", ""))
err_text = str(err.decode("utf-8").replace("\r\n", ""))
if out_text != "":
log_info(" Info from convert: " + out_text)
if err_text != "":
log_info(" Error from convert: " + err_text)