Docker容器内fluent-ffmpeg与ffmpeg-concat无法裁剪合并视频求助
问题根因与解决方案
两个问题均由Docker基础镜像缺少必要的编码扩展、图形运行依赖、虚拟显示组件导致,对应解决方案如下:
问题1:无法解析录制视频宽高报错解决
- 根因:Debian系统默认源安装的ffmpeg版本较低,缺少对h264、opus等编码的完整支持,无法正确读取react-media-recorder生成的可变帧率MP4/WebM文件的元数据,导致ffmpeg-concat解析场景参数时无法获取宽高属性。
- 解决步骤:
- 更换ffmpeg安装源,安装全编码支持的高版本ffmpeg
- 裁剪视频时强制输出固定帧率,避免可变帧率导致元数据解析失败
- 将音频编码拷贝配置替换为通用aac编码,兼容所有容器格式
问题2:无法创建OpenGL上下文报错解决
- 根因:ffmpeg-concat依赖的headless-gl库需要OpenGL运行环境,无头Docker容器默认没有图形界面和对应的运行依赖,也没有虚拟显示服务支持。
- 解决步骤:
- 安装OpenGL相关依赖包、xvfb虚拟显示服务
- 启动Node服务前先拉起xvfb虚拟显示,配置对应DISPLAY环境变量
修改后的完整Dockerfile
FROM node:14 RUN mkdir /opt/prod_api WORKDIR /opt/prod_api # 安装全功能ffmpeg、OpenGL依赖、xvfb虚拟显示服务 RUN apt-get -y update && apt-get -y upgrade && \ apt-get install -y software-properties-common && \ add-apt-repository -y ppa:savoury1/ffmpeg4 && \ apt-get -y update && \ apt-get install -y ffmpeg mesa-utils libgl1-mesa-glx libgl1-mesa-dri xvfb libxext6 libxi6 && \ apt-get clean && rm -rf /var/lib/apt/lists/* COPY . . RUN chmod 777 -R /opt # 启动时先挂载虚拟显示再运行服务 ENTRYPOINT ["xvfb-run", "-a", "/opt/prod_api/entrypoint.sh"] EXPOSE 8080
裁剪代码优化调整
const allCutVideos = await Promise.all(convertVideoList.map(async (row) => { return await new Promise((resolve) => { ffmpeg(row.uploadedFile) .setStartTime(row.startTime) .setDuration(row.endTime) .size("640x360") .autopad() .outputFPS(30) // 新增固定帧率配置 .withAudioCodec('aac') // 替换copy为通用aac编码 .on("start", function (commandLine) { console.log("Spawned FFmpeg with command: " + commandLine); }) .on("error", function (err) { resolve({ ...row, status: false, message: err.message }) }) .on("end", function (err) { if (!err) { resolve({ ...row, status: true }); } }) .output(row.outputPath) .run(); }); }));
内容的提问来源于stack exchange,提问作者Keval savani
相关产品推荐
相关产品推荐

