【问题标题】:Passing ffmpeg command containing % through Python subprocess通过 Python 子进程传递包含 % 的 ffmpeg 命令
【发布时间】:2021-05-23 10:50:00
【问题描述】:

我正在尝试使用 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: No such file or directory。我 99% 确定我正在从正确的目录运行命令;当我运行相同的命令将ptimage%03d 替换为ptimage000.jpg(列表中的特定图像)时,我成功获得了(非常短的)视频。

我尝试使用\% 转义%,但这没有帮助。

有什么想法吗?

【问题讨论】:

  • 您确定您在正确的文件夹中吗? os.getcwd() 显示什么?
  • 你的文件名真的是ptimage%03d吗?这是一个非常不寻常的文件名称。 subprocess 不会为您扩展元字符。
  • 对于ptimage%03d,它期待名为ptimage000ptimage001ptimage002 等的文件。也许您打算将ptimage%03d.jpg 用于ptimage000.jpgptimage001.jpg 等。
  • 顺便说一句,- 一般来说,最好将命令写成列表而不是依赖shlex.split() 字符串。
  • ...专注于手头的问题,但是:不,%s 并不特殊,除非您使用格式化运算符; Python 在这里没有做任何事情会影响你的名字,所以上面的 cmets 建议用户错误(不正确的目录,或者它应该是带有扩展名的ptimage%03d.jpg)是来自 Python 专业方向的最合理的解释,但是对 ffmpeg 的使用只有中等程度的熟悉。

标签: python ffmpeg subprocess


【解决方案1】:

您省略了文件扩展名。使用ptimage%03d.jpg,而不是ptimage%03d。使用ptimage%03d ffmpeg 期待名为ptimage000ptimage001 等的文件。

ffmpeg -framerate 5 -i ptimage%03d.jpg -crf 20 animation.mp4

无关说明:某些播放器(YouTube 除外)无法处理如此低的帧,因此请考虑添加-r 10 输出选项。与色度子采样相同:考虑添加-vf format=yuv420p 输出选项。

【讨论】:

    猜你喜欢
    • 2014-07-14
    • 2012-07-03
    • 2018-04-29
    • 2015-01-13
    • 2019-06-21
    • 2017-02-13
    • 2012-11-02
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多