使用ffmpeg的python子进程没有输出

时间:2018-03-21 08:32:08

标签: python ffmpeg subprocess

我想使用ffmpeg中的场景变化检测来提取场景变化时间戳。我必须在几百个视频上运行它,所以我想使用python子进程来遍历文件夹的所有内容。 我的问题是,我用于在单个视频上获取这些值的命令涉及将输出传递给一个文件,该文件似乎不是来自子进程调用的选项。

这是我的代码:

 p=subprocess.check_output(["ffmpeg", "-i", sourcedir+"/"+name+".mpg","-filter:v", "select='gt(scene,0.4)',showinfo\"","-f","null","-","2>","output"])

这个告诉ffmpeg需要一个输出

 output = "./result/"+name
 p=subprocess.check_output(["ffmpeg", "-i", sourcedir+"/"+name+".mpg","-filter:v", "select='gt(scene,0.4)',metadata=print:file=output","-an","-f","null","-"])

这个没有给我任何错误,但没有创建文件

这是我直接使用ffmpeg:

的原始命令
ffmpeg -i input.flv  -filter:v "select='gt(scene,0.4)',showinfo"  -f null  - 2> ffout

我只需要将此命令的输出写入文件,任何人都可以看到我如何使其工作? 是否有更好的方法然后进行子进程?或者只是另一种方式? C会更容易吗?

2 个答案:

答案 0 :(得分:1)

您可以直接从Python重定向stderr输出,而不需要shell=True,这可能会导致shell注入。

这很简单:

with open(output_path, 'w') as f:
    subprocess.check_call(cmd, stderr=f)

答案 1 :(得分:0)

如果使用shell命令的subprocess参数,情况会更容易,并且它应该表现相同。使用shell命令时,您可以传入字符串作为命令,而不是 args列表。

cmd = "ffmpeg -i {0}  -filter:v \"select='gt(scene,0.4)',showinfo\"  -f {1}  - 2> ffout".format(inputName, outputFile)
p=subprocess.check_output(cmd, shell=True)

如果要传递参数,可以轻松设置字符串格式