11

Atm 我有这个作为我的代码,第一行似乎运行良好,但第二行给出了错误。

os.chdir('C://Users/Alex/Dropbox/code stuff/test')
subprocess.call('ffmpeg -i test%d0.png output.avi')

另外,当我尝试这样运行它时,它会出现 1s cmd 闪烁,然后什么也没有发生

os.system('ffmpeg -i test%d0.png output.avi')
4

5 回答 5

20

对于寻找答案的后人来说,这行得通。(您必须用空格分隔命令。)

import os
import subprocess
os.chdir('C://Users/Alex/')
subprocess.call(['ffmpeg', '-i', 'picture%d0.png', 'output.avi'])
subprocess.call(['ffmpeg', '-i', 'output.avi', '-t', '5', 'out.gif'])
于 2013-05-26T10:29:48.297 回答
7

最好以subprocess.call另一种方式调用。

首选方式是:

subprocess.call(['ffmpeg', '-i', 'test%d0.png', 'output.avi'])

或者:

subprocess.call('ffmpeg -i test%d0.png output.avi', shell=True)

您可以在手册中找到原因。我引用:

所有调用都需要 args,它应该是一个字符串或一系列程序参数。提供一系列参数通常是首选,因为它允许模块处理任何所需的参数转义和引用(例如,允许文件名中的空格)。如果传递单个字符串,shell 必须为 True(见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。

于 2013-05-25T10:23:38.007 回答
4

我知道这个问题很老了,但现在 Python 中有一个很好的 ffmpeg 包装器: ffmpeg-python。你可以在https://github.com/kkroening/ffmpeg-python找到它

有了它,命令可以这样实现:

import ffmpeg
ffmpeg
    .input('test*.png', pattern_type='glob')
    .output('output.avi')
    .run()
于 2018-11-21T15:38:50.933 回答
2

我也使用子流程,但以另一种方式。

正如@Roland Smith声称的那样,首选方法是(这不太舒服):

subprocess.call(['ffmpeg', '-i', 'test%d0.png', 'output.avi'])

第二种方法使用起来更舒服,但可能会出现一些问题:

subprocess.call('ffmpeg -i test%d0.png output.avi', shell=True)

除了建议避免将 shell 参数设置为“True”之外,当输出文件夹包含圆括号时,我遇到了问题,即:“temp(5)/output.avi”。

更健壮的方法如下:

import subprocess
import shlex

cmd = shlex.split('ffmpeg -i test%d0.png output.avi')
subprocess.call(cmd)

要了解有关shlex的更多信息。特别是对于 shlex.split:

使用类似 shell 的语法拆分字符串 s。

于 2021-06-16T07:34:00.233 回答
0

你使用的是什么版本的 Python?getstatusoutput() 自 2.6 版起已弃用。在 Python 3 中,您可以使用 subprocess 来获得相同的效果。

subprocess.getoutput('cd /Users/Alex/code/pics/')
于 2013-05-25T09:32:17.867 回答