Search code examples
pythonffmpegsubprocessstdoutstderr

Redirect stderr and stdout from ffmpeg to a file in Python with subprocess


I am trying to redirect both the stderr and stdout of a ffmpeg command to a file and to suppress them when executing the Python script. This is my code:

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

So in general I want to do something similar to ffmpeg -hide_banner -i input.mp4 -c:v libx264 -b:v 2M -c:a copy enc_out.mp4 &> ffmpeg_out.txt. So currently in the ffmpeg_stdout I have only (b'', None) and the stdout and stderr are both printed when executing the script.


Solution

  • oguzismail's answer is probably superior in this particular case, but just for the record, it's not hard at all.

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

    Notice also the preference for subprocess.run() over raw Popen. (Probably add check=True as well.)