通过Python子进程传递包含%的ffmpeg命令
我正在尝试用Tkinter构建一个GUI,其中一组图像通过按下按钮转换为.mp4视频 当我从命令行运行以下命令时,一切正常:通过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
> "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的使用只相当熟悉。