利用 Docker 来静态编译 ffmpeg

这篇文章是关于在 Linux 下使用 Docker 编译适用于 x86_64 架构的 ffmpeg 可执行文件,不包括 Windows 相关的内容。也许以后会做也说不定。

常见问题

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

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

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

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

注意事项

因为包含了 non-free 的编解码器,因此编译后的文件只能自用而不能分享。

Docker 镜像

你可以访问 JixunMoe/ffmpeg-builder 来获取构建镜像所使用的 Dockerfile,或是直接拉取在 Docker Hub 上自动构建的镜像:

docker pull jixun/ffmpeg-builder

镜像准备好后就可以开始编译了:

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

默认编译的版本是镜像编译时的最新版(4.2.3),或者你也可以添加参数来指定想编译的版本(不保证能成功):

docker run --rm -v "${OUTDIR}:/build/bin" jixun/ffmpeg-builder 4.2.3

最后就能在 $OUTDIR 里找到编译好的 ffmpegffprobe 文件了。

查看包含的编解码器

$ ./bin/ffmpeg -codecs | grep fdk
ffmpeg version 4.2.3 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-libbluray --enable-nonfree
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
DEA.L. aac AAC (Advanced Audio Coding) (decoders: aac aac_fixed libfdk_aac ) (encoders: aac libfdk_aac )

参考资料

  1. ffmpeg 官方的编译指南:https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

发表评论

电子邮件地址不会被公开。 必填项已用*标注