利用 docker 构建 ffmpeg
首先,是一些关于为什么要这么干的小问答:
问:为什么要自己构建?
答:使用非自由授权的编码器(如:fdk-aac)。
问:为什么要用 docker
来构建?
答:不用额外在宿主机配置环境,直接编译就行了。
问:如何确保编译出来的文件能跨平台运行?
答:使用静态构建,将所有依赖内嵌到可执行文件里。
问:如何加入自己的编译参数或依赖?
答:直接建立一个新的 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 )