利用 docker 构建 ffmpeg

首先,是一些关于为什么要这么干的小问答:

问:为什么要自己构建?
答:使用非自由(non-free)授权的编码器(如:fdk-aac)。

问:为什么要用 docker 来构建?
答:不用额外在宿主机配置环境,直接编译就行了。

问:如何确保编译出来的文件能跨平台运行?
答:使用静态构建(Static Build),将所有依赖内嵌到可执行文件里。

问:如何加入自己的编译参数或依赖?
答:直接建立一个新的 Dockerfile 并引入这个项目,或建立一个分支然后配置。


相关的 Dockerfile 和脚本都托管在 GitHub: JixunMoe/ffmpeg-builder,使用 Docker Hub 自动构建镜像并托管编译好的镜像

执行下面的代码就能导入目前最新的镜像:

docker pull jixun/ffmpeg-builder

如果希望手动生成 Docker 镜像,可以将代码仓库克隆到本地,然后在本地生成:

git clone https://github.com/JixunMoe/ffmpeg-builder.git
cd ffmpeg-builder/builder
docker build . --tag jixun/ffmpeg-builder:latest

然后执行下面的代码进行编译即可,其中 bin 目录指的是最终生成的可执行文件的目录。

需要注意的是,构建默认使用 -j4 编译 - 如果不是 4 核或以上的机器请魔改掉构建脚本再构建。

OUTPUT="$(pwd)/bin"
mkdir -p "${OUTPUT}"
docker run --rm -v "${OUTPUT}:/build/bin" jixun/ffmpeg-builder

编译后能看到启用了 fdk-aac

$ ./bin/ffmpeg -codecs | grep fdk
ffmpeg version N-97678-g345158a Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
  configuration: --prefix=/usr --pkg-config-flags=--static --extra-cflags='-static -Wl,-Bdynamic,-lgcc_s,-Bstatic' --extra-ldflags=-static --extra-libs='-lpthread -lm' --bindir=/build/bin --enable-static --enable-gpl --enable-gnutls --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree
  libavutil      56. 43.100 / 56. 43.100
  libavcodec     58. 83.100 / 58. 83.100
  libavformat    58. 43.100 / 58. 43.100
  libavdevice    58.  9.103 / 58.  9.103
  libavfilter     7. 80.100 /  7. 80.100
  libswscale      5.  6.101 /  5.  6.101
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
 DEAIL. aac                  AAC (Advanced Audio Coding) (decoders: aac aac_fixed libfdk_aac ) (encoders: aac libfdk_aac )
Jixun

Jixun

学习与游戏的旅途,各类杂谈。