AV1是一种新兴的免费视频编码标准,它由开放媒体联盟(Alliance for Open Media,简称AOM)于2018年制定,融合了Google VP10、Mozilla Daala以及Cisco Thor三款开源项目的成果。据说在实际测试中,AV1标准比H.265(HEVC)的压缩率提升了大约27%。由于AV1具有性能优势,并且还是免费授权,因此各大流媒体平台更倾向使用AV1而非HEVC标准。
AV1如此炙手可热,以致它的编解码器如雨后春笋,单单FFmpeg支持的AV1编解码器,就有libaom、libdav1d、libsvtav1、librav1e四种。经过在Linux环境实地验证,前三种都能在华为云的欧拉系统上编译集成,只有librav1e尚未成功编译。下面就介绍如何在Linux环境给FFmpeg集成libaom、libdav1d、libsvtav1这三种AV1编解码库。
一、安装libaom
libaom是谷歌提供的AV1编解码工具,其代码托管在谷歌网站,国内无法访问,开发者可通过清华大学的镜像网站下载它的源码,下载地址是https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/pool/main/a/aom/aom_3.7.1.orig.tar.gz。 libaom的安装步骤说明如下。 1、将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令。
代码语言:javascript复制tar zxf aom_3.7.1.orig.tar.gz
cd aom-3.7.1
2、进入解压后的build目录,运行下面命令配置libaom。
代码语言:javascript复制cd build
cmake ..
3、运行下面命令编译libaom。
代码语言:javascript复制make -j4
4、编译完成后,运行下面命令安装libaom。
代码语言:javascript复制make install
二、安装libsvtav1
SVT-AV1项目最初由英特尔与奈飞公司合作创建,后来被AOM官方收编,它的源码托管页面在https://gitlab.com/AOMediaCodec/SVT-AV1。因为《FFmpeg开发实战:从零基础到短视频上线》一书采用的FFmpeg版本为5.1.2,兼容该版本FFmpeg的SVT-AV1最高版本为1.4.0,所以需要下载这个源码链接https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v1.4.0/SVT-AV1-v1.4.0.tar.gz。注意,如果使用更高版本的SVT-AV1,会导致后面FFmpeg编译失败。 libsvtav1的安装步骤说明如下。 1、将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令。
代码语言:javascript复制tar zxvf SVT-AV1-v1.4.0.tar.gz
cd SVT-AV1-v1.4.0
2、进入解压后的Build目录,运行下面命令配置libsvtav1。
代码语言:javascript复制cd Build
cmake ..
3、运行下面命令编译libsvtav1。
代码语言:javascript复制make -j4
4、编译完成后,运行下面命令安装libsvtav1。
代码语言:javascript复制make install
三、安装libdav1d
libdav1d是一款AV1的解码器,只负责解码,不负责编码。它的源码托管页面在https://code.videolan.org/videolan/dav1d/,源码包的下载地址是https://code.videolan.org/videolan/dav1d/-/archive/1.3.0/dav1d-1.3.0.tar.gz。 libdav1d的安装步骤说明如下。 1、安装编译工具meson和ninja meson和ninja是基于Python语言的编译工具,故需确保服务器已经安装了Python3。另外,由于服务器访问国外网站不稳定,因此可先设置国内的资源镜像网站,比如移动云。具体的镜像设置与工具安装命令如下:
代码语言:javascript复制pip config set global.index-url https://ecloud.10086.cn/api/query/developer/nexus/repository/python-sdk/simple
pip3 install meson
pip3 install ninja
2、将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令。
代码语言:javascript复制tar zxvf dav1d-1.3.0.tar.gz
cd dav1d-1.3.0
3、进入解压后的build目录,运行下面命令配置libdav1d。
代码语言:javascript复制mkdir build
cd build
meson setup
4、运行下面命令编译libdav1d。
代码语言:javascript复制ninja
5、编译完成后,运行下面命令安装libdav1d。
代码语言:javascript复制ninja install
四、让FFmpeg启用libaom、libdav1d、libsvtav1
由于FFmpeg默认未启用libaom、libdav1d、libsvtav1,因此需要重新配置FFmpeg,标明启用libaom、libdav1d、libsvtav1,然后重新编译安装FFmpeg。FFmpeg的Linux环境完整编译过程参见《FFmpeg开发实战:从零基础到短视频上线》一书的“1.2.3 自行编译与安装FFmpeg”,详细的启用步骤说明如下。 1、加载环境变量PKG_CONFIG_PATH和LD_LIBRARY_PATH 因为libaom、libdav1d、libsvtav1三个库默认安装在/usr/local/lib64目录,所以要将相关路径加载到PKG_CONFIG_PATH和LD_LIBRARY_PATH。执行下面命令编辑profile文件:
代码语言:javascript复制cd
vi .bash_profile
往.bash_profile的文件末尾添加下面两行:
代码语言:javascript复制export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
保存并退出.bash_profile之后,执行以下命令加载环境变量:
代码语言:javascript复制source .bash_profile
然后执行下面的环境变量查看命令,确保环境变量PKG_CONFIG_PATH和LD_LIBRARY_PATH已经成功加载。
代码语言:javascript复制env | grep PKG_CONFIG_PATH
env | grep LD_LIBRARY_PATH
2、回到FFmpeg源码的目录,执行以下命令重新配置FFmpeg,主要增加启用libaom、libdav1d、libsvtav1。(增加了选项--enable-libaom --enable-libsvtav1 --enable-libdav1d)
代码语言:javascript复制./configure --prefix=/usr/local/ffmpeg --enable-shared --disable-static --disable-doc --enable-zlib --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libdavs2 --enable-libmp3lame --enable-libfreetype --enable-libass --enable-libfribidi --enable-libxml2 --enable-fontconfig --enable-sdl2 --enable-libvorbis --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libopus --enable-libvpx --enable-openssl --enable-libaom --enable-libsvtav1 --enable-libdav1d --enable-libuavs3d --enable-iconv --enable-gpl --enable-nonfree
3、运行下面命令编译FFmpeg。
代码语言:javascript复制make clean
make -j4
4、执行下面命令安装FFmpeg。
代码语言:javascript复制make install
5、运行以下命令查看FFmpeg的版本信息。
代码语言:javascript复制ffmpeg -version
查看控制台回显的FFmpeg版本信息,找到“--enable-libaom --enable-libsvtav1 --enable-libdav1d”,说明FFmpeg正确启用了AV1的三个编解码器libaom、libdav1d、libsvtav1。