You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg命令错误触发方法与平移效果生成失败的异常处理问询

解决FFmpeg命令执行错误时触发异常分支的问题

你的核心问题在于**os.system()不会抛出Python异常**——它只会返回一个退出状态码(0表示成功,非0表示失败),所以你的try-except块根本捕获不到FFmpeg的执行错误。要实现“命令出错时执行异常分支”的需求,我们需要换一种方式检测命令执行状态,或者改用能抛出异常的子进程调用方法。

方案一:用subprocess.run()替代os.system()(推荐)

subprocess模块是Python处理子进程的标准方式,它支持捕获命令执行的错误,并且可以通过check=True参数让命令执行失败时直接抛出CalledProcessError异常,这样你的try-except就能正常工作了。

修改后的代码如下:

import subprocess

try:
    cmd = f"ffmpeg -y -loop 1 -i {combined_url} -ss 0 -t 3 -filter_complex '[0:v]scale=w=-2:h=3*720,crop=w=3*1280/1.4:h=3*720/1.4:y=(in_h-out_h)-t*(in_h-out_h)/5:x=t*(in_w-out_w)/5,scale=w=1280:h=720' -c:v h264 -crf 18 -preset veryfast {vid_out}"
    subprocess.run(cmd, shell=True, check=True)
except subprocess.CalledProcessError:
    # 执行异常分支的命令
    con_img = os.path.join(BASE_DIR, f"media/images/{filename}.{image_url.split('.')[-1]}")
    cmd1 = f"ffmpeg -i {combined_url} -vf scale=1280:720 {con_img}"
    subprocess.run(cmd1, shell=True, check=True)
    # 重新尝试原命令
    cmd = f"ffmpeg -y -loop 1 -i {combined_url} -ss 0 -t 3 -filter_complex '[0:v]scale=w=-2:h=3*720,crop=w=3*1280/1.4:h=3*720/1.4:y=(in_h-out_h)-t*(in_h-out_h)/5:x=t*(in_w-out_w)/5,scale=w=1280:h=720' -c:v h264 -crf 18 -preset veryfast {vid_out}"
    subprocess.run(cmd, shell=True)

关键说明:

  • shell=True:允许直接执行字符串形式的命令(和os.system行为一致)
  • check=True:当命令退出码非0时,抛出CalledProcessError,触发except块
  • 最后重新执行原命令时可以去掉check=True,避免再次失败又进入循环(根据你的需求调整)

方案二:检查os.system()的返回值

如果你不想改用subprocess,也可以直接判断os.system()的返回值是否为0,来手动触发错误分支:

cmd = "ffmpeg -y -loop 1 -i " + combined_url + " -ss 0 -t 3 " + " -filter_complex" + " '[0:v]scale=w=-2:h=3*720,crop=w=3*1280/1.4:h=3*720/1.4:y=(in_h-out_h)-t*(in_h-out_h)/5:x=t*(in_w-out_w)/5,scale=w=1280:h=720' " + " -c:v h264 -crf 18 -preset veryfast " + vid_out
exit_code = os.system(cmd)
if exit_code != 0:
    con_img = os.path.join(BASE_DIR, "media/images/" + filename + "." + image_url.split(".")[-1])
    cmd1 = "ffmpeg -i " + combined_url + " -vf scale=1280:720 " + con_img
    os.system(cmd1)
    # 重新执行原命令
    os.system(cmd)

这种方式不需要try-except,直接通过返回码判断命令是否执行成功,逻辑更直观。

额外建议

  • 尽量用f-string拼接命令(像方案一里那样),比字符串相加更易读和维护
  • 如果FFmpeg的错误是因为图片尺寸不满足滤镜要求,你可以在执行原命令前先检查图片的分辨率,提前处理不符合条件的图片,避免不必要的错误触发

内容的提问来源于stack exchange,提问作者JohnTerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:17:52