通过Python子进程传递包含%的ffmpeg命令

通过Python子进程传递包含%的ffmpeg命令,python,ffmpeg,subprocess,Python,Ffmpeg,Subprocess,我正在尝试用Tkinter构建一个GUI,其中一组图像通过按下按钮转换为.mp4视频 当我从命令行运行以下命令时,一切正常: > "ffmpeg -r 5 -i ptimage%03d -crf 20 animation.mp4" 但是,在Python中,下面给出了一个错误,我认为这与在参数中传递%有关: commandString = "ffmpeg -r 5 -i ptimage%03d -crf 20 animation.mp4" args

我正在尝试用Tkinter构建一个GUI,其中一组图像通过按下按钮转换为.mp4视频

当我从命令行运行以下命令时,一切正常:

> "ffmpeg -r 5 -i ptimage%03d -crf 20 animation.mp4"
但是,在Python中,下面给出了一个错误,我认为这与在参数中传递
%
有关:

commandString = "ffmpeg -r 5 -i ptimage%03d -crf 20 animation.mp4"
args = shlex.split(commandString)
p = subprocess.run(args)
我得到的错误是
ptimage%03d:没有这样的文件或目录
。我99%确定我在正确的目录下运行该命令;当我运行相同的命令,将
ptimage%03d
替换为列表中的特定图像
ptimage000.jpg
,我成功地获得了一个(非常短的)视频

我试着用
\%
来转义
%
,但是没有用


有什么想法吗?

您省略了文件扩展名。使用
ptimage%03d.jpg
,而不是
ptimage%03d
。使用
ptimage%03d
ffmpeg需要名为
ptimage000
ptimage001
等的文件

ffmpeg-帧速率5-i图像%03d.jpg-crf 20 animation.mp4


无关注释:有些玩家(YouTube除外)无法处理这么低的帧,所以考虑添加<代码> -R 10 < /Cord>输出选项。与色度子采样相同:考虑添加<代码> -VF格式= YUV420P < /代码>输出选项。

您确定您是否在正确的文件夹中?
os.getcwd()
显示了什么?文件名真的是
ptimage%03d
?这是一个非常不寻常的文件名。子进程不会为您扩展元字符。使用
ptimage%03d
时,它需要名为
ptimage000
ptimage001
ptimage002
,等等的文件。也许您打算将
ptimage%03d.jpg
用于
ptimage000.jpg
ptimage001.jpg
,等等。总之,更好的做法是将命令写成一个列表,而不是依赖于
shlex.split()
一个字符串……关注手头的问题,但是:不,
%
不是特别的,除非您使用格式化操作符;Python在这里所做的任何事情都不会影响您的名字,因此上面的评论建议用户错误(目录不正确,或者应该是
ptimage%03d.jpg
,带有扩展名),这是从Python专业知识的角度得出的最合理的解释,但对ffmpeg的使用只相当熟悉。