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
相关产品推荐
相关产品推荐

