Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将stderr和stdout从ffmpeg重定向到带有子进程的Python文件中_Python_Ffmpeg_Subprocess_Stdout_Stderr - Fatal编程技术网

将stderr和stdout从ffmpeg重定向到带有子进程的Python文件中

将stderr和stdout从ffmpeg重定向到带有子进程的Python文件中,python,ffmpeg,subprocess,stdout,stderr,Python,Ffmpeg,Subprocess,Stdout,Stderr,我试图将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(shl

我试图将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\u banner-I input.mp4-c:v libx264-b:v 2M-c:a copy enc\u out.mp4&>ffmpeg\u out.txt的事情。因此,目前在ffmpeg_stdout中,我只有
(b'',无)
,并且在执行脚本时都会打印stdout和stderr

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
可以单独将stderr重定向到一个文件,并且由于在大多数情况下它不打印stdout所需的任何内容,这将是一个有用的解决方法

my_env = os.environ.copy()
my_env["FFREPORT"] = "file=ffmpeg_out.txt:level=32"
subprocess.Popen(shlex.split(cmd), env=my_env)
在这个特殊的情况下,它可能更优越,但为了记录在案,它一点也不难

with open("ffmpeg_out.txt", 'w') as log:
    ffmpeg_cmd = subprocess.run(shlex.split(cmd), 
        stdout=log, stderr=log)
另外请注意(可能还要添加
check=True

在这种特殊情况下可能更优越,但就记录而言,这一点也不难

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

还要注意(可能还要添加
check=True

谢谢。遗憾的是,我今天的票数没有了,但我会记住你。更切题的是,
shlex.split()
没有做任何你自己做不到的事情。只需将空格替换为“
”、“
”,并将命令列为一个列表。@tripleee实际上我要执行的命令要长得多,因此这为我节省了一些时间,而且在过去,我一直无法放置
,因此脚本崩溃,我需要查看我没有放置的地方…谢谢。遗憾的是,我今天的票数没有了,但我会记住你。更切题的是,
shlex.split()
没有做任何你自己做不到的事情。只需将空格替换为“
”、“
”,并将该命令列为一个列表。@tripleee实际上我要执行的命令要长得多,因此这为我节省了一些时间,而且在过去,我一直无法放置
所以脚本崩溃了,我需要看看我没有放一个脚本的地方…这不会重定向stdout。ffmpeg写入stdout的是什么?一些分析过滤器可以像元数据或libvmaf一样写入stdout。@Gyan如何将
ffmpeg
命令的输出直接重定向到文件?在python中,不知道。这不会重定向stdout。ffmpeg会写入stdout什么?一些分析过滤器可以像元数据或libvmaf一样写入stdout。@Gyan我如何将
ffmpeg
命令的输出直接重定向到文件?在python中,我不知道。