Перенаправить stderr и stdout из ffmpeg в файл на Python с подпроцессом - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь перенаправить как stderr, так и stdout команды ffmpeg в файл и подавить их при выполнении скрипта Python. Это мой код:

import subprocess, shlex

cmd = 'ffmpeg -hide_banner -i input.mp4 -c:v libx264 -b:v 2M -c:a copy enc_out.mp4'

with open("ffmpeg_out.txt", 'w') as log:
    ffmpeg_cmd = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)
    ffmpeg_stdout = ffmpeg_cmd.communicate()
    for i in range(len(ffmpeg_stdout) - 1):
        log.write(str(ffmpeg_stdout[i]) + "\n")

В общем, я хочу сделать что-то похожее на ffmpeg -hide_banner -i input.mp4 -c:v libx264 -b:v 2M -c:a copy enc_out.mp4 &> ffmpeg_out.txt. Так что в настоящее время в ffmpeg_stdout у меня есть только (b'', None), и stdout и stderr оба печатаются при выполнении скрипта.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Ответ oguzismail , вероятно, лучше в данном конкретном случае, но, к сведению, это совсем не сложно.

with open("ffmpeg_out.txt", 'w') as log:
    ffmpeg_cmd = subprocess.run(shlex.split(cmd), 
        stdout=log, stderr=log)

Обратите внимание также на предпочтение для subprocess.run() перед необработанным Popen. (возможно, также добавьте check=True.)

0 голосов
/ 09 ноября 2018

ffmpeg может перенаправить stderr в файл самостоятельно, и, поскольку в большинстве случаев он не печатает ничего, необходимого для stdout, это будет полезным обходным путем

my_env = os.environ.copy()
my_env["FFREPORT"] = "file=ffmpeg_out.txt:level=32"
subprocess.Popen(shlex.split(cmd), env=my_env)
...