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')
对于寻找答案的后人来说,这行得通。(您必须用空格分隔命令。)
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'])
最好以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(见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。
我知道这个问题很老了,但现在 Python 中有一个很好的 ffmpeg 包装器:
ffmpeg-python
。你可以在https://github.com/kkroening/ffmpeg-python找到它
有了它,命令可以这样实现:
import ffmpeg
ffmpeg
.input('test*.png', pattern_type='glob')
.output('output.avi')
.run()
我也使用子流程,但以另一种方式。
正如@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。
你使用的是什么版本的 Python?getstatusoutput() 自 2.6 版起已弃用。在 Python 3 中,您可以使用 subprocess 来获得相同的效果。
subprocess.getoutput('cd /Users/Alex/code/pics/')