Как правильно получить вывод 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)
→ Ссылка