关于 ffmpeg-docker-containers
这是一份在 Docker 容器中运行 FFmpeg 的实用技能指南,涵盖镜像选择、硬件加速及视频处理服务和流水线的部署模式。
主要功能
- 01比较 FFmpeg Docker 镜像变体
- 02运行容器化转码
- 03配置 NVIDIA、Intel 和 AMD GPU
- 04创建 Compose 与 Kubernetes 部署
- 05调整资源限制和挂载卷
适用场景
- 01在 CI/CD 流水线中统一 FFmpeg 版本
- 02运行生产环境转码服务
- 03在 Kubernetes 上部署视频处理任务
- 04配置 GPU 加速的容器处理
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill ffmpeg-docker-containers安装后在 Claude Code 中输入/ffmpeg-docker-containers确认已加载。
详细介绍
关键指南
Windows 文件路径要求
必须:在 Windows 上始终为文件路径使用反斜杠
在 Windows 上使用 Edit 或 Write 工具时,必须在文件路径中使用反斜杠(\),而不是正斜杠(/)。
快速参考
| 镜像 | 大小 | GPU | 命令 |
|---|---|---|---|
jrottenberg/ffmpeg:7.1-alpine320 | ~100MB | 否 | docker run --rm -v $(pwd):/data jrottenberg/ffmpeg:7.1-alpine320 -i /data/input.mp4 /data/output.mp4 |
jrottenberg/ffmpeg:7.1-nvidia2404 | ~1.5GB | NVIDIA | docker run --gpus all --rm -v $(pwd):/data jrottenberg/ffmpeg:7.1-nvidia2404 ... |
jrottenberg/ffmpeg:7.1-vaapi2404 | ~300MB | Intel/AMD | 添加 --device /dev/dri:/dev/dri |
linuxserver/ffmpeg:latest | ~150MB | 否 | 由 LinuxServer.io 维护 |
何时使用此技能
适用于容器化 FFmpeg 部署:
- 需要一致 FFmpeg 版本的 CI/CD 管道
- FFmpeg 需求各不相同的多用户系统
- 生产级转码服务
- Kubernetes 视频处理任务
- GPU 直通配置
Docker 容器中的 FFmpeg(2025)
在 Docker 容器中运行 FFmpeg 的完整指南,涵盖 GPU 支持、优化和生产环境模式。
为什么使用 Docker 运行 FFmpeg?
优势
- 隔离性:主机系统上不会出现依赖冲突
- 可复现性:各处使用相同的 FFmpeg 版本
- 可移植性:在不同平台上都能以相同方式运行
- 轻松更新:更改镜像标签即可切换 FFmpeg 版本
- CI/CD 集成:确保管道中的构建一致
- GPU 访问:支持 NVIDIA、Intel、AMD 硬件加速
何时使用 Docker
- FFmpeg 需求各不相同的多用户环境
- 需要特定 FFmpeg 构建版本的 CI/CD 管道
- 生产级转码服务
- 容器化微服务架构
- 需要使用系统 FFmpeg 中没有的特定编解码器或功能时
常用 FFmpeg Docker 镜像
jrottenberg/ffmpeg(推荐)
最受欢迎且维护良好的 FFmpeg Docker 镜像。
可用变体:
| 标签 | 基础镜像 | 大小 | 使用场景 |
|---|---|---|---|
7.1-ubuntu2404 | Ubuntu 24.04 LTS | ~250MB | 生产环境,功能完整 |
7.1-alpine320 | Alpine 3.20 | ~100MB | 精简,启动快速 |
7.1-nvidia2404 | Ubuntu + CUDA | ~1.5GB | NVIDIA GPU |
7.1-vaapi2404 | Ubuntu + VAAPI | ~300MB | Intel/AMD GPU(Linux) |
7.1-scratch | Scratch | ~80MB | 精简,静态二进制文件 |
8.0-ubuntu2404 | Ubuntu 24.04 LTS | ~250MB | 最新 FFmpeg 8.0 |
# Pull specific version
docker pull jrottenberg/ffmpeg:7.1-ubuntu2404
# Latest (not recommended for production)
docker pull jrottenberg/ffmpeg:latest
linuxserver/ffmpeg
专为临时命令行使用而设计。
docker pull linuxserver/ffmpeg:latest
mwader/static-ffmpeg
静态编译的 FFmpeg 二进制文件。
docker pull mwader/static-ffmpeg:7.1
基本用法
简单转码
# Mount current directory and run FFmpeg
docker run --rm \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /data/input.mp4 \
-c:v libx264 \
-c:a aac \
/data/output.mp4
Windows(PowerShell)
# Windows PowerShell
docker run --rm `
-v ${PWD}:/data `
jrottenberg/ffmpeg:7.1-ubuntu2404 `
-i /data/input.mp4 `
-c:v libx264 `
/data/output.mp4
Windows(Git Bash/MINGW)
# Git Bash requires MSYS_NO_PATHCONV to prevent path conversion
MSYS_NO_PATHCONV=1 docker run --rm \
-v "$(pwd)":/data \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /data/input.mp4 \
-c:v libx264 \
/data/output.mp4
使用绝对路径
# Linux/macOS
docker run --rm \
-v /home/user/videos:/input:ro \
-v /home/user/output:/output \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /input/video.mp4 \
/output/converted.mp4
# Windows
docker run --rm \
-v C:\Videos:/input:ro \
-v C:\Output:/output \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /input/video.mp4 \
/output/converted.mp4
Docker 中的 GPU 加速
NVIDIA GPU(Docker + NVIDIA Container Toolkit)
要求:
- 支持 NVENC 的 NVIDIA GPU
- NVIDIA 驱动程序 450+
- 已安装 NVIDIA Container Toolkit
安装 NVIDIA Container Toolkit:
# Ubuntu/Debian
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
使用 NVIDIA GPU 运行:
docker run --rm --gpus all \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-nvidia2404 \
-hwaccel cuda \
-hwaccel_output_format cuda \
-i /data/input.mp4 \
-c:v h264_nvenc \
-preset p4 \
/data/output.mp4
选择特定 GPU:
# Use GPU 0 only
docker run --rm --gpus '"device=0"' \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-nvidia2404 \
-hwaccel cuda -i /data/input.mp4 -c:v h264_nvenc /data/output.mp4
# Use multiple GPUs
docker run --rm --gpus '"device=0,1"' \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-nvidia2404 \
...
Intel QSV/VAAPI(Linux)
# Intel GPU with VAAPI
docker run --rm \
--device=/dev/dri:/dev/dri \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-vaapi2404 \
-hwaccel vaapi \
-hwaccel_device /dev/dri/renderD128 \
-hwaccel_output_format vaapi \
-i /data/input.mp4 \
-vf 'format=nv12|vaapi,hwupload' \
-c:v h264_vaapi \
/data/output.mp4
AMD GPU(Linux VAAPI)
docker run --rm \
--device=/dev/dri:/dev/dri \
--device=/dev/kfd:/dev/kfd \
--group-add video \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-vaapi2404 \
-hwaccel vaapi \
-hwaccel_device /dev/dri/renderD128 \
-i /data/input.mp4 \
-c:v h264_vaapi \
/data/output.mp4
构建自定义 FFmpeg 镜像
精简的自定义 Dockerfile
FROM ubuntu:24.04 AS builder
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
build-essential \
pkg-config \
yasm \
nasm \
git \
wget \
libx264-dev \
libx265-dev \
libvpx-dev \
libfdk-aac-dev \
libmp3lame-dev \
libopus-dev \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /tmp/ffmpeg
RUN wget -O ffmpeg.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.1.tar.bz2 && \
tar xjf ffmpeg.tar.bz2 --strip-components=1
RUN ./configure \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libvpx \
--enable-libfdk-aac \
--enable-libmp3lame \
--enable-libopus \
--disable-doc \
--disable-debug && \
make -j$(nproc) && \
make install
# Production stage
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y \
libx264-164 \
libx265-209 \
libvpx9 \
libfdk-aac2 \
libmp3lame0 \
libopus0 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/bin/ffmpeg /usr/local/bin/
COPY --from=builder /usr/local/bin/ffprobe /usr/local/bin/
ENTRYPOINT ["ffmpeg"]
构建支持 NVIDIA 的镜像
FROM nvidia/cuda:12.4-devel-ubuntu24.04 AS builder
ENV DEBIAN_FRONTEND=noninteractive
# Install build dependencies
RUN apt-get update && apt-get install -y \
build-essential \
pkg-config \
yasm \
nasm \
git \
wget \
libx264-dev \
libx265-dev \
&& rm -rf /var/lib/apt/lists/*
# Install nv-codec-headers
RUN git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git && \
cd nv-codec-headers && \
make install
# Build FFmpeg
WORKDIR /tmp/ffmpeg
RUN wget -O ffmpeg.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.1.tar.bz2 && \
tar xjf ffmpeg.tar.bz2 --strip-components=1
RUN ./configure \
--enable-gpl \
--enable-nonfree \
--enable-cuda-nvcc \
--enable-libnpp \
--enable-nvenc \
--enable-nvdec \
--enable-cuvid \
--enable-libx264 \
--enable-libx265 \
--extra-cflags=-I/usr/local/cuda/include \
--extra-ldflags=-L/usr/local/cuda/lib64 && \
make -j$(nproc) && \
make install
# Production stage
FROM nvidia/cuda:12.4-runtime-ubuntu24.04
RUN apt-get update && apt-get install -y \
libx264-164 \
libx265-209 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/bin/ffmpeg /usr/local/bin/
COPY --from=builder /usr/local/bin/ffprobe /usr/local/bin/
ENTRYPOINT ["ffmpeg"]
Docker Compose 模式
简单转码服务
version: '3.8'
services:
ffmpeg:
image: jrottenberg/ffmpeg:7.1-ubuntu2404
volumes:
- ./input:/input:ro
- ./output:/output
command: >
-i /input/video.mp4
-c:v libx264 -crf 23
-c:a aac -b:a 128k
/output/converted.mp4
GPU 加速服务
version: '3.8'
services:
ffmpeg-gpu:
image: jrottenberg/ffmpeg:7.1-nvidia2404
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
volumes:
- ./input:/input:ro
- ./output:/output
command: >
-hwaccel cuda
-hwaccel_output_format cuda
-i /input/video.mp4
-c:v h264_nvenc
/output/output.mp4
监视文件夹处理
version: '3.8'
services:
ffmpeg-watcher:
image: jrottenberg/ffmpeg:7.1-ubuntu2404
volumes:
- ./watch:/watch
- ./done:/done
entrypoint: ["/bin/sh", "-c"]
command:
- |
while true; do
for f in /watch/*.mp4; do
[ -e "$$f" ] || continue
filename=$$(basename "$$f")
ffmpeg -i "$$f" -c:v libx264 -crf 23 "/done/$$filename"
rm "$$f"
done
sleep 5
done
restart: unless-stopped
Kubernetes 部署
FFmpeg 任务
apiVersion: batch/v1
kind: Job
metadata:
name: ffmpeg-transcode
spec:
template:
spec:
containers:
- name: ffmpeg
image: jrottenberg/ffmpeg:7.1-ubuntu2404
command:
- ffmpeg
- -i
- /input/video.mp4
- -c:v
- libx264
- /output/output.mp4
volumeMounts:
- name: input
mountPath: /input
readOnly: true
- name: output
mountPath: /output
volumes:
- name: input
persistentVolumeClaim:
claimName: input-pvc
- name: output
persistentVolumeClaim:
claimName: output-pvc
restartPolicy: Never
启用 GPU 的 Pod(NVIDIA)
apiVersion: v1
kind: Pod
metadata:
name: ffmpeg-gpu
spec:
containers:
- name: ffmpeg
image: jrottenberg/ffmpeg:7.1-nvidia2404
resources:
limits:
nvidia.com/gpu: 1
command:
- ffmpeg
- -hwaccel
- cuda
- -i
- /input/video.mp4
- -c:v
- h264_nvenc
- /output/output.mp4
volumeMounts:
- name: input
mountPath: /input
- name: output
mountPath: /output
volumes:
- name: input
hostPath:
path: /data/input
- name: output
hostPath:
path: /data/output
性能优化
卷挂载最佳实践
# Read-only input for security
docker run --rm \
-v $(pwd)/input:/input:ro \
-v $(pwd)/output:/output \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /input/video.mp4 /output/output.mp4
# Use tmpfs for temp files
docker run --rm \
--tmpfs /tmp:size=1G \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /data/input.mp4 /data/output.mp4
资源限制
# Limit CPU and memory
docker run --rm \
--cpus="4" \
--memory="4g" \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-threads 4 \
-i /data/input.mp4 /data/output.mp4
并行处理
# Process multiple files in parallel
for f in *.mp4; do
docker run --rm -d \
--cpus="2" \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i "/data/$f" "/data/converted_$f"
done
故障排除
常见问题
输出时出现权限被拒绝:
# Check file ownership
ls -la output/
# Run with current user
docker run --rm \
--user $(id -u):$(id -g) \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /data/input.mp4 /data/output.mp4
未检测到 GPU:
# Verify NVIDIA runtime
docker run --rm --gpus all nvidia/cuda:12.4-base-ubuntu24.04 nvidia-smi
# Check Docker GPU support
docker info | grep -i gpu
路径转换问题(Git Bash):
# Set MSYS_NO_PATHCONV
MSYS_NO_PATHCONV=1 docker run ...
# Or add to ~/.bashrc
export MSYS_NO_PATHCONV=1
内存不足:
# Increase memory limit
docker run --rm --memory="8g" --memory-swap="8g" ...
# Use streaming mode
docker run --rm \
-v $(pwd):/data \
jrottenberg/ffmpeg:7.1-ubuntu2404 \
-i /data/input.mp4 \
-f segment -segment_time 60 \
/data/output_%03d.mp4
调试命令
# Enter container shell
docker run --rm -it \
--entrypoint /bin/bash \
jrottenberg/ffmpeg:7.1-ubuntu2404
# Check FFmpeg version and capabilities
docker run --rm jrottenberg/ffmpeg:7.1-ubuntu2404 -version
docker run --rm jrottenberg/ffmpeg:7.1-ubuntu2404 -encoders
docker run --rm jrottenberg/ffmpeg:7.1-ubuntu2404 -hwaccels
最佳实践
- 固定镜像版本——使用特定标签,而不是
latest - 对输入文件使用只读挂载
- 限制资源,防止耗尽主机资源
- 对自定义镜像使用多阶段构建
- 将日志输出到 stdout/stderr,以便进行容器日志记录
- 为长期运行的服务配置运行状况检查
- 使用
--rm标志清理容器 - 安全性——尽可能以非 root 用户身份运行
本指南介绍了 Docker FFmpeg 模式。有关硬件加速的具体说明,请参阅硬件加速技能。
评论
支持 Markdown