我想使用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会更容易吗?
答案 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)
如果要传递参数,可以轻松设置字符串格式