为什么Django部署在Windows虚拟服务器时subprocess调用ffmpeg不执行
- 优先替换ffmpeg为绝对路径
你本地配置的环境变量仅对当前登录的用户账号生效,Windows服务器上站点运行时使用的是独立服务账号(如IIS应用池身份、服务账号),不会加载你的用户环境变量,直接写死ffmpeg的全路径(例如C:\ffmpeg\bin\ffmpeg.exe)可排除环境变量读取失败问题。 - 替换字符串拼接为列表传参
现有直接拼接命令字符串的写法容错率极低,只要media_in或image_out的路径包含空格、中文、特殊字符就会直接导致命令解析失败。且不要开启shell=True,避免额外的Windows命令行转义问题,正确写法参考下面的代码示例。 - 增加错误日志捕获
现有代码没有捕获执行输出,无法定位具体错误原因,通过capture_output参数可拿到ffmpeg的标准输出和错误输出,直接就能看到是权限不足、文件不存在还是参数错误等问题。 - 检查目录读写权限
确认站点运行账号对media_in所在目录有读取权限、对image_out所在目录有写入权限,Windows服务器默认会限制站点账号的目录访问权限,没有对应权限会直接导致输出文件生成失败。
import subprocess # 填写你服务器上ffmpeg的实际绝对路径 FFMPEG_PATH = r"C:\ffmpeg\bin\ffmpeg.exe" # 所有参数以列表形式传入,自动处理转义和空格 cmd = [ FFMPEG_PATH, "-i", media_in, "-ss", "00:00:01", "-frames:v", "1", "-vf", "scale=w='min(150, iw*3/2):h=-1'", image_out ] # 捕获执行输出用于排查 run_result = subprocess.run( cmd, capture_output=True, text=True, shell=False ) # 可将以下内容写入站点日志,就能看到具体报错信息 print(f"执行返回码:{run_result.returncode}") print(f"ffmpeg输出:{run_result.stdout}") print(f"ffmpeg错误信息:{run_result.stderr}")
内容的提问来源于stack exchange,提问作者Ebr Mo
相关产品推荐
相关产品推荐

