FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
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、将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令。
tar zxf aom_3.7.1.orig.tar.gz
cd aom-3.7.1
2、进入解压后的build目录,运行下面命令配置libaom。
cd build
cmake ..
3、运行下面命令编译libaom。
make -j4
4、编译完成后,运行下面命令安装libaom。
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、将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令。
tar zxvf SVT-AV1-v1.4.0.tar.gz
cd SVT-AV1-v1.4.0
2、进入解压后的Build目录,运行下面命令配置libsvtav1。
cd Build
cmake ..
3、运行下面命令编译libsvtav1。
make -j4
4、编译完成后,运行下面命令安装libsvtav1。
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。另外,由于服务器访问国外网站不稳定,因此可先设置国内的资源镜像网站,比如移动云。具体的镜像设置与工具安装命令如下:
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、将下载好的压缩包上传到服务器并解压,也就是依次执行以下命令。
tar zxvf dav1d-1.3.0.tar.gz
cd dav1d-1.3.0
3、进入解压后的build目录,运行下面命令配置libdav1d。
mkdir build
cd build
meson setup
4、运行下面命令编译libdav1d。
ninja
5、编译完成后,运行下面命令安装libdav1d。
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文件:
cd
vi .bash_profile
往.bash_profile的文件末尾添加下面两行:
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
保存并退出.bash_profile之后,执行以下命令加载环境变量:
source .bash_profile
然后执行下面的环境变量查看命令,确保环境变量PKG_CONFIG_PATH和LD_LIBRARY_PATH已经成功加载。
env | grep PKG_CONFIG_PATH
env | grep LD_LIBRARY_PATH
2、回到FFmpeg源码的目录,执行以下命令重新配置FFmpeg,主要增加启用libaom、libdav1d、libsvtav1。(增加了选项--enable-libaom --enable-libsvtav1 --enable-libdav1d)
./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。
make clean
make -j4
4、执行下面命令安装FFmpeg。
make install
5、运行以下命令查看FFmpeg的版本信息。
ffmpeg -version
查看控制台回显的FFmpeg版本信息,找到“--enable-libaom --enable-libsvtav1 --enable-libdav1d”,说明FFmpeg正确启用了AV1的三个编解码器libaom、libdav1d、libsvtav1。
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器的更多相关文章
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- Django笔记二十四之数据库函数之比较和转换函数
本文首发于公众号:Hunter后端 原文链接:Django笔记二十四之数据库函数之比较和转换函数 这一篇笔记开始介绍几种数据库函数,以下是几种函数及其作用 Cast 转换类型 Coalesce 优先取 ...
- FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待 前言 将ffmpeg移植到海思H ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- Java开发学习(二十四)----SpringMVC设置请求映射路径
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
- 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口
前言 上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...
- Android笔记二十四.Android基于回调的事件处理机制
假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...
- (二十四)linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...
- BizTalk开发系列(二十四) BizTalk项目框架建议
Asp.NET有MVC框架,大部份的开发都是按照MVC进行的.BizTalk是面向消息的开发,不能完全采用分层的开发模式.而微软只提供了 BizTalk项目开发的基本策略,通过分析相关的Complex ...
- 仿酷狗音乐播放器开发日志二十四 选项设置窗体的实现(附328行xml布局源码)
转载请说明原出处,谢谢~~ 花了两天时间把仿酷狗的选项设置窗体做出来了,当然了只是做了外观.现在开学了,写代码的时间减少,所以整个仿酷狗的工程开发速度减慢了.今天把仿酷狗的选项设置窗体的布局代码分享出 ...
随机推荐
- 如何使用ODBC应用程序接口连接数据库
如何使用 ODBC 应用程序接口连接数据库? 安装 unixODBC. yum install -y unixODBC yum install -y unixODBC-devel 下载并安装 open ...
- 手机配置IPV6
据可靠消息说今年7月份前大部分系统都得支持ipv6,之前也没当回事,突然说要全切,还得验证ipv6的支持情况. 网上找了一堆,发现都过时了,或者行不通,琢磨了一下把华为android的搞定了(流量模式 ...
- ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现
在上文<Keycloak中授权的实现>中,以一个实际案例介绍了Keycloak中用户授权的设置方法.现在回顾一下这个案例: 服务供应商(Service Provider)发布/Weathe ...
- 比Bloom Filter节省25%空间!Ribbon Filter在Lindorm中的应用
简介: 本文研究了一种新的过滤器Ribbon Filter,并将其集成到Lindorm中 作者:箫苏 朝戈 正研 1 前言 Lindorm是一个低成本高吞吐的多模数据库,目前,Lindorm是阿里内部 ...
- 龙蜥社区开源 coolbpf,BPF 程序开发效率提升百倍 | 龙蜥技术
简介: coolbpf,可以酷玩的BPF!来看看让BPF加了双翅膀的它究竟有多硬核? 文/系统运维 SIG(Special Interest Group) 引言 BPF 是一个新的动态跟踪技术,目前这 ...
- 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章
背景:今天给大家带来的分享主题是<媒体智能-淘宝直播流媒体互动实践>,内容分为5个部分,首先看看在淘宝直播的直播间里主播可以怎样给用户拜年:然后具体讲如何制作一个手势拜年的特效:接着介绍我 ...
- 基于 MaxCompute 的实时数据处理实践
简介: MaxCompute 通过流式数据高性能写入和秒级别查询能力(查询加速),提供EB级云原生数仓近实时分析能力:高效的实现对变化中的数据进行快速分析及决策辅助.当前Demo基于近实时交互式BI ...
- [FAQ] Quasar BEX Bridge 通信方式 this.$q.bex 未定义的问题
Bridge 是一个基于 Promise 的事件系统,在BEX的所有部分之间共享,允许在你的Quasar App中监听事件,从其它部分发出它们. 你可以使用 $q.bex 从你的 Quasar A ...
- [FAQ] swagger-php @OA\JsonContent 与 @MediaType @OA\Schema 的用法
@OA\JsonContent 是对 @MediaType @OA\Schema 两者的封装,类似于 laravel 中 JsonResponse 对 Response 的封装. @OA\JsonCo ...
- JavaScript数组Array方法介绍,使用示例及ES6拓展
数组定义 有次序和编号的一组值 类似数组对象 函数agruments对象,字符串,DOM元素集 实例属性 Array.prototype.length length可以赋值,用以改变数组长度 arr. ...