前言
FFmpeg 出自于著名键盘侠 Fabrice Bellard ,这货可是键盘侠届的天才,名头可能没有xx语言之父响亮,但战斗值绝对爆表。
今天要聊的是 FFmpeg 源码安装。
源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)
configure
这一步几乎是最难的,很多人都倒在了这一步。好吧,好像是废话,毕竟剩下两步也不需要做啥。
pkg-config
# 查看当前安装的所有库
pkg-config --list-all
阅读 configure help 文档
在 FFmpeg 源码文件夹下 ./configure --help
可以输出所有的配置选项说明
- –prefix
用以指定编译好的 FFmpeg 安装到哪个目录,一般放到 /usr/local/ffmpeg 中即可 - –enable-shared
生成动态库 - –disable-static
不生成静态库 - –enable-libfdk-aac
将 fdk-aac 内置到 FFmpeg 中 - –enable-libx264
将 x264 内置到 FFmpeg 中 - –enable-libx265
将 x265 内置到 FFmpeg 中 - –enable-gpl
x264、x265 要求开启 GPL License - –pkgconfigdir=/opt/homebrew/lib/pkgconfig
指定 pkg-config,如果不是 homebrew 安装的,一般都位于 /usr/local/lib/pkgconfig - –cc=/usr/bin/clang
指定 c compiler - –arch=arm
平台架构,比如 x86_64 - –prefix=/opt/ffmpeg
安装的位置,如果不设置一般都默认安装在 /usr/local/bin/ffmpeg - –disable-asm
用苹果芯片的人最好汇编优化 disable 掉,你会感谢我的
编译错误处理
编译过程中如果出现了错误,首先看 terminal 的错误信息,然后去 ffbuild/config.log
查看具体错误,有时候命令行提示的错误并不一定是当前这个库的错误,也可能是其间接依赖库的错误所致。
错误信息提示缺少对应的 library,则使用 pkg-config 确认对应的 library 是否未安装:
# 这里以 openssh 为例
pkg-config --list-all | grep openssh
绝大多数错误都是对应的 library 未安装,使用 homebrew 安装即可:
brew install openssh
有时候光安装了 library 还不行(openssh 便是如此),还必须 link:
brew link openssh -force
对于缺省的 library 有时候我们也可以选择不安装,而是在 configure 里移除掉 library 对应的 enable 配置项(等于放弃这项功能)。
至于是安装对应的 library 还是直接移除对应的 configure 配置,需要视 library 和自己业务情况而定。 ` ./configure –help` 文档里有相应 library 的说明可供参考。–enable 项结尾标记为 [no] 的就需要安装对应 library。
但并不是所有的 library 都可以选择不安装,有些 library 缺省可能会导致核心模块无法编译:
- brew install yasm
ffmpeg 的编译过程依赖 yasm,若未安装 yasm 会出现错误:nasm/yasm not found or too old. Use –disable-x86asm for a crippled build. - brew install sdl2
ffplay 依赖于 sdl2,有的编译安转后bin文件夹下没有 ffplay 就是这依赖库没有装,缺少sdl2,就无法编译出ffplay。(缺少 sdl2 编译期间是不会报错的,只是最终会缺少 ffplay,即便你配置了 –enbale-ffplay) - brew install speex
不然会出现错误:ERROR: speex not found - brew install fdk-aac
不然会出现错误:ERROR: libfdk_aac not found - brew install x264
不然会出现错误:ERROR: libx264 not found - brew install x265
不然会出现错误:ERROR: libx265 not found
如下是我在 macbook pro m1 上使用的配置:
./configure --pkgconfigdir=/opt/homebrew/lib/pkgconfig --cc=/usr/bin/clang --arch=arm --prefix=/opt/ffmpeg --enable-cross-compile --enable-avdevice --enable-doc --enable-ffplay --enable-ffprobe --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-libsrt --enable-nonfree --enable-shared --enable-gpl --disable-asm
make
make -j 4
install
sudo make install
安装好后测试一下:
# 查看安装位置
which ffmpeg
# 查看安装的版本
ffmpeg -version
# 随便找个在线视频链接使用 ffplay 播一下
ffplay https://c4.biketo.com/article_video/20190917/4jsDf5pEGC.mp4
# 同样,随便找个视频分析下
ffprobe https://c4.biketo.com/article_video/20190917/4jsDf5pEGC.mp4
为什么坚持源码安装
安装一个软件有很多种方式,最省事的就是直接使用官方已经编译好的对应平台安装文件,下载成功后双击一下完事儿。
为什么要这么执着于源码编译安装呢?
- 官方未提供苹果芯片的安装文件 FFmpeg - Silicon ARM Info
- 编译好的安装文件不适合我们需要对源码修改定制的情况,这个时候只能源码编译。
FFmpeg flv+h265
FFmpeg 官方不支持 flv+h265,为此几年前国人还和老外吵了一架。FFmpeg 官方不支持是因为 flv 格式并未声明如何支持 h265,当然其根源是 flv 的版权方 Adobe 不再对其进行维护。
于是脑洞大开的国人便衍生出了相应版本的 ffmpeg,以支持 flv+h265。比如基于 FFmpeg 4.1 的 hack 版。
顺便也推销一下鄙人基于 FFmpeg 5.0 改的版本,参考了上面 4.1 版本的实现。 当然绝大多数版本实现都应该参考自最早金山的版本。