FFmpeg

Posted on By ᵇᵒ

前言

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 版本的实现。 当然绝大多数版本实现都应该参考自最早金山的版本。