我正在尝试使用名为:
的文件在子目录中加载图像当我运行代码时:
print os.path.exists('.\\images\\image0.png')
cmd = "ffmpeg -f image2 -r 20 -i .\\images\\image%01d.png -c:v libx264 -r 20 .\\images\\output.mp4"
os.system(cmd)
导致:
True
//blah blah blah ffmpeg start up stuff blah blah blah
[image2 @ 00000000026ceda0] Could find no file with with path '.\images\image%01
d.png' and index in the range 0-4
.\images\image%01d.png: No such file or directory
我甚至检查过:
os.getcwd()
是正确的道路。
有人可以解释我的问题吗? 我很确定我的ffmpeg命令是正确的(它在过去对我有用)。我想知道ffmpeg是否有可能无法识别我当前的工作目录? (并且不会因此而采取相对路径?)
谢谢!建议/建议将不胜感激。
答案 0 :(得分:2)
问题是您已经设置了系统,因此每个新的cmd.exe
shell都会立即进入您的Documents目录,因此ffmpeg
正试图在那里运行。
显而易见的方法是只提供ffmpeg
绝对路径而不是相对路径:
images = os.path.abspath('.\\images')
cmd = "ffmpeg -f image2 -r 20 -i {}\\image%01d.png -c:v libx264 -r 20 {}\\output.mp4".format(images, images)
或者,您始终可以将cd
命令粘贴到发送到system
函数的内容中:
curpath = os.path.abspath(os.getcwd())
cmd = "cd {} && ffmpeg -f image2 -r 20 -i .\\images\\image%01d.png -c:v libx264 -r 20 .\\images\\output.mp4".format(curpath)
然而,最好的解决方案是完全停止使用system
,正如system
的文档建议的那样,并将shell排除在外:
cmd = "ffmpeg -f image2 -r 20 -i .\\images\\image%01d.png -c:v libx264 -r 20 .\\images\\output.mp4"
subprocess.check_call(cmd)
(有人会在评论中建议您不能使用subprocess
的字符串,除非shell=True
。这在Unix上是正确的,但在Windows上则不然。实际上,在Windows上,如果您传递参数列表,subprocess
只会将它们连接成一个字符串以传递给CreateProcess
。如果您不知道如何正确地转义参数对于Windows,列表仍然是一个好主意 - 但如果你有一个非常好的命令行,只需使用它。)