2

问题

我正在尝试将图像加载到具有以下文件的子目录中:

  • .\images\image0.png
  • .\images\image1.png
  • .\images\image2.png
  • .\images\image3.png
  • ... ETC ...
  • .\images\image8.png
  • .\images\image9.png

当我运行代码时:

 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 是否有可能无法识别我当前的工作目录?(因此不会采用该相对路径?)

谢谢!建议/建议将不胜感激。

4

1 回答 1

3

问题是你已经设置了你的系统,所以每个新cmd.exe的 shell 都会立即 cd 到你的 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所建议的那样,将外壳排除在外:

cmd = "ffmpeg -f image2 -r 20 -i .\\images\\image%01d.png -c:v libx264 -r 20 .\\images\\output.mp4"
subprocess.check_call(cmd)

(总是有人会在评论中建议您不能将字符串与subprocessunless一起使用shell=True。在 Unix 上是这样,但在 Windows 上却不是。事实上,在 Windows 上,如果您传递参数列表,subprocess只会将它们连接起来转换成要传递给的字符串CreateProcess。如果您不知道如何为 Windows 正确转义参数,列表仍然是一个好主意——但如果您有一个非常好的命令行,请使用它。)

于 2013-08-07T21:46:02.120 回答