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

Docker容器配置FFmpeg及Python视频压缩报错排查求助

问题排查与解决方案

核心问题分析

1. subprocess调用格式错误

报错信息中显示找不到的是完整命令字符串,这是因为subprocess.run()默认以列表形式解析命令参数,直接传递完整字符串时,它会把整个串当作单个可执行文件路径查找,而非拆分命令和参数。

2. Docker容器内PATH冲突

Dockerfile中配置了虚拟环境,并将虚拟环境的PATH放在系统PATH之前,导致系统层面安装的ffmpeg不在当前执行环境的PATH中,即使安装完成也无法被识别。

修复步骤

步骤1:修正Python代码中的subprocess调用

修改compress函数,移除无用的文件打开操作,将命令拆分为列表形式传递,同时添加错误处理:

def compress(name):
    output = name[0:-4] + "-f" + ".mp4"
    # 以列表形式传递命令参数,确保subprocess正确解析
    subprocess.run(["ffmpeg", "-i", name, "-vcodec", "libx264", output], check=True)

video = cv2.VideoCapture(rtsp_url)
fileName = saveToProjDir(video)
compress(fileName)
  • 列表形式的参数避免了shell=True的安全风险,同时让subprocess能正确识别命令和每个参数
  • check=True会在ffmpeg执行失败时抛出异常,便于快速定位问题
  • 移除无意义的with open(name) as f代码块,仅使用文件名即可完成压缩操作

步骤2:优化Dockerfile

Docker容器本身已是隔离环境,无需额外虚拟环境,同时调整安装顺序以减小镜像体积:

FROM python:3.11.0

WORKDIR /app/

# 先安装系统依赖,清理缓存减小镜像体积
RUN apt-get update && apt-get install -y ffmpeg libsm6 libxext6 && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

ADD main.py .
CMD ["python", "/app/main.py"]
  • 移除虚拟环境相关配置,彻底解决PATH冲突问题
  • 合并apt-get命令并清理缓存,符合Docker镜像构建的最佳实践
  • 先安装系统依赖再安装Python依赖,确保opencv等库能正常调用系统级组件

额外验证建议

  • 进入容器手动执行ffmpeg -version,确认命令可正常运行:
    docker exec -it <容器ID> /bin/bash
    ffmpeg -version
    
  • 检查saveToProjDir函数生成的文件路径,确保视频文件确实保存在容器内的/app目录下

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:55:34