【问题标题】:python subprocess with ffmpeg give no output带有ffmpeg的python子进程没有输出
【发布时间】:2018-03-21 08:32:08
【问题描述】:

我想使用 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

我只需要将此命令的输出写入文件,有人知道我如何使它工作吗? 有没有比 subprocess 更好的方法?或者只是另一种方式?在 C 中会更容易吗?

【问题讨论】:

    标签: python ffmpeg subprocess


    【解决方案1】:

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

    很简单:

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

    【讨论】:

      【解决方案2】:

      如果您使用subprocess 命令的shell 参数,则事情会变得更容易,并且它的行为应该相同。使用 shell 命令时,您可以传入 string 作为命令,而不是 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)
      

      如果你想传递参数,你可以轻松地格式化你的字符串

      【讨论】:

      • shell=True 不鼓励使用,因为它可能导致 shell 注入。
      • 谢谢您,先生,这是可行的,但我仍然遇到传递每个文件的名称并更改每个文件的输出名称的问题。如果我将所有内容都放在一个字符串中并传递该字符串,它应该可以工作吗?对于 shell 注入,这是一个用于对视频进行排序的简单实用程序,atm 这并不重要,我们只需要证明该方法有效,但感谢您的输入,至少我可以告诉他们,在这种状态下,它们可能存在风险.
      • 我有点期待您知道如何进行字符串格式化,我添加了一个示例,您将如何自定义它。
      猜你喜欢
      • 2016-11-19
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2019-05-28
      相关资源
      最近更新 更多