【问题标题】:ffmpeg cannot detect file while os canffmpeg 无法检测文件,而 os 可以
【发布时间】:2013-08-09 11:03:41
【问题描述】:

问题

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

  • .\images\image0.png
  • .\images\image1.png
  • .\images\image2.png
  • .\images\image3.png
  • ...等...
  • .\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 是否有可能无法识别我当前的工作目录? (因此不会采用该相对路径?)

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

【问题讨论】:

  • 如何在运行 Python 脚本的同一个 DOS 提示符会话中实际运行相同的 ffmpeg 命令并 100% 确定它可以工作,而不仅仅是“非常确定”?
  • 您也可以通过调用os.path.abspath('.\\images') 并在您的cmd 字符串中使用它代替'.\\images' 来排除相对路径问题。
  • 这就是我的意思。它只是在这种情况下不起作用。我会试试的。
  • 另一种排除相对路径问题的方法是运行echo %cd% && ffmpeg … 而不仅仅是ffmpeg,这将使它打印出ffmpeg 将看到的当前工作目录。
  • @abarnert 我的路径不正确 - 它不使用我的 cwd。它路由到我的文档文件夹。我认为这是因为我为命令提示符编辑了注册表以自动打开我的文档。显然,这会影响 os.system 调用命令的方式。无论如何,您是否知道如何将我的 cmd 设置为在特定目录中打开而不会产生这种影响? (顺便说一句。感谢您的帮助!如果您将此作为答案发布,我很乐意接受。)

标签: python windows file python-2.7 ffmpeg


【解决方案1】:

问题是你已经设置了你的系统,所以每个新的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 的文档所建议的那样,并且不使用 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 正确转义参数,列表仍然是一个好主意 - 但如果您有一个非常好的命令行,使用它。)

【讨论】:

  • 再次感谢您的帮助。我将访问 os.system 和 subprocess 的文档。我会接受的。我也解决了我的问题 - 使用 cmd.exe \c \start 路径创建了一个 .bat 文件。运行该 .bat 文件将在我的路径中打开 cmd.exe 而无需修改 regedit
猜你喜欢
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2018-12-04
  • 2018-08-30
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多