【问题标题】:Redirect stderr and stdout from ffmpeg to a file in Python with subprocess使用子进程将stderr和stdout从ffmpeg重定向到Python中的文件
【发布时间】:2019-04-12 19:36:26
【问题描述】:

我正在尝试将 ffmpeg 命令的 stderr 和 stdout 都重定向到一个文件,并在执行 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) 并且在执行脚本时都打印了标准输出和标准错误。

【问题讨论】:

    标签: python ffmpeg subprocess stdout stderr


    【解决方案1】:

    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)
    

    【讨论】:

    • 这不会重定向标准输出。
    • ffmpeg 将什么写入标准输出?
    • 一些分析过滤器可以写入标准输出,如元数据或 libvmaf。
    • @Gyan 如何将ffmpeg 命令的输出直接重定向到文件?
    • 在python中,不知道。
    【解决方案2】:

    oguzismail's answer 在这种特殊情况下可能更胜一筹,但仅作记录,一点也不难。

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

    还要注意preference for subprocess.run() over raw Popen.(可能还要加上check=True。)

    【讨论】:

    • 谢谢。很遗憾,我今天没有票了,但我会记住你的。
    • 更切题地说,shlex.split() 不会做任何你自己做不到的事情。只需将空格替换为 ', ' 并将命令设为列表即可。
    • @tripleee 实际上我要执行的命令要长得多,所以这节省了我一些时间,而且在过去我经常错过放置, 所以脚本崩溃了,我需要看看我错过的地方放一个......
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2012-07-14
    • 2015-08-18
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多