FFmpeg开发笔记(六十九)Windows给FFmpeg集成AV1编码器libaom
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四种。接下来以微软的视窗系统为例,介绍如何在Windows环境给FFmpeg集成AV1编码器libaom,具体的操作步骤说明如下:
一、配置libaom
libaom是谷歌提供的AV1编解码工具,其代码托管在谷歌网站,国内无法访问,开发者可通过清华大学的镜像网站下载它的源码,下载地址是https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/pool/main/a/aom/aom_3.12.1.orig.tar.gz。
先下载最新的aom源码,再把aom源码包复制到MSYS环境的/usr/local/src目录下。接着在MSYS控制台执行下面命令解压源码包:
tar zxvf aom_3.12.1.orig.tar.gz
cd aom-3.12.1
然后执行下面命令配置aom:
cd build
cmake -DBUILD_SHARED_LIBS=1 ..
配置完毕,会在build目录下找到AOM.sln,这就是aom的Visual Studio项目工程文件。
二、编译libaom
打开Visual Studio 2022,在欢迎页面单击右侧的“打开项目或解决方案”,在弹出的文件对话框中选择aom-3.12.1\build目录下的AOM.sln。
打开aom工程后,依次选择顶部菜单:生成→配置管理器,在打开的配置管理器窗口上,找到左上角的“活动解决方案配置”下拉框,把Debug模式改为Release模式,再单击窗口右下角的关闭按钮。
依次选择顶部菜单:生成→生成→生成aom,Visual Studio就开始编译aom模块。编译过程可在Visual Studio界面下方观察,直到编译完成如下图所示。

此时可在aom-3.12.1\build\Release目录下找到aom_dll.lib和aom.dll,这两个文件就是编译生成的libaom库文件。
三、安装libaom
确保Windows系统已经按照《FFmpeg开发实战:从零基础到短视频上线》第一章“1.3 Windows系统安装FFmpeg”的说明安装配置了MSYS,再按照以下步骤在MSYS环境安装libaom。
1、在msys64的/usr/local目录下新建libaom目录,并在该目录下创建lib子目录;
2、把aom工程中build\Release目录下的aom.dll复制到第一步创建的lib目录,把build\Release目录下的aom_dll.lib改名为aom.lib后再复制到第一步创建的lib目录;
3、在lib目录下创建pkgconfig子目录,并在pkgconfig目录下新建文件aom.pc,给该pc文件填入以下的配置内容。
prefix=/usr/local/libaom
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: aom
Description: Alliance for Open Media AV1 codec library v3.12.1.
Version: 3.12.1
Requires:
Conflicts:
Libs: -L${libdir} -laom
Libs.private: -lm
Cflags: -I${includedir}
4、在msys64的/usr/local/libaom目录下创建include目录,再在include下创建子目录aom,然后把aom工程中aom目录下的几个h文件都复制到刚才创建的include/aom目录;
经过以上步骤操作后的libaom目录结构如下所示。
/usr/local/libaom
|--------------- lib
| |----- aom.lib
| |----- aom.dll
| |----- pkgconfig
| |----- aom.pc
|--------------- include
| |----- aom
| |----- aom.h
| |----- aom_codec.h
| |----- ……
四、编译安装FFmpeg
先下载最新的FFmpeg源码(版本号需大于等于7.1),再把FFmpeg源码包复制到MSYS环境的/usr/local/src目录下。接着在MSYS控制台执行下面命令解压源码包:
cd /usr/local/src
unzip ffmpeg-n7.1.1.zip
确保MSYS环境已经按照《FFmpeg开发实战:从零基础到短视频上线》该书第八章的“8.1.1 给FFmpeg集成x264”和“8.1.5 给FFmpeg集成x265”安装了H.264的编码器libx264和H.265的编码器libx265,也按照该书第十章的“10.1.1 FFmpeg集成SDL”安装了Windows系统的SDL2库,并且按照之前的文章安装了H.266的编码器libvvenc,然后执行下面命令配置FFmpeg的编译环境:
cd ffmpeg-n7.1.1
export PKG_CONFIG_PATH=/usr/local/libaom/lib/pkgconfig:$PKG_CONFIG_PATH
./configure --prefix=/usr/local/ffmpeg --arch=x86_64 --enable-shared --disable-static --disable-doc --enable-libx264 --enable-libx265 --enable-libvvenc --enable-liblc3 --enable-librist --enable-libdav1d --enable-libaom --enable-sdl2 --enable-gpl --enable-nonfree --enable-iconv --enable-zlib --cross-prefix=x86_64-w64-mingw32- --target-os=mingw32
配置完毕执行下面命令编译和安装FFmpeg,编译完成的ffmpeg库将会安装到configure指定的/usr/local/ffmpeg目录。
make
make install
cp /usr/local/libaom/lib/aom.dll /usr/local/ffmpeg/bin
五、查看FFmpeg的安装结果
运行下面命令查看FFmpeg的安装版本:
ffmpeg -version
上面命令返回的FFmpeg版本信息如下:
ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers
built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
configuration: --prefix=/usr/local/ffmpeg --arch=x86_64 --enable-shared --disable-static --disable-doc --enable-libx264 --enable-libx265 --enable-libvvenc --enable-liblc3 --enable-librist --enable-libdav1d --enable-libaom --enable-sdl2 --enable-gpl --enable-nonfree --enable-iconv --enable-zlib --cross-prefix=x86_64-w64-mingw32- --target-os=mingw32
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.101 / 61. 19.101
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
根据以上返回的版本信息,可知已安装的FFmpeg版本号为7.1.1,同时configuration这行找到“--enable-libaom”,说明FFmpeg已经启用了AV1编码器libaom。
更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。
FFmpeg开发笔记(六十九)Windows给FFmpeg集成AV1编码器libaom的更多相关文章
- FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待 前言 将ffmpeg移植到海思H ...
- .Net开发笔记(十九) 创建一个可以可视化设计的对象
阅读本篇博客之前需要了解VS窗体设计器的工作原理,详细可参见本系列博客(十).(十一).(十二).必须需要知道的一条结论就是:处于窗体设计器(Form Designer)中的任何组件(包含控件,下同) ...
- Java开发笔记(十九)规律变化的for循环
前面介绍while循环时,有个名叫year的整型变量频繁出现,并且它是控制循环进出的关键要素.不管哪一种while写法,都存在三处与year有关的操作,分别是“year = 0”.“year<l ...
- 安卓开发笔记(十九):异步消息处理机制实现更新软件UI
主界面代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andr ...
- Android笔记(六十九) 仿微信界面(一)
综合之前的Fragment和自定义组件的知识,实现微信界面 MainActivity.java package cn.lixyz.test; import android.app.Acti ...
- Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件
前言 上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤. 受限制 因为直接配置sample的vi比较麻烦 ...
- FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放
前言 ffmpeg播放rtsp网络流和摄像头流. Demo 使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克 使用ffmpeg播放网络rtsp文件流 ...
- FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建
前言 本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8. FFmpeg简介 FFmpeg是领先的多媒体框架,能够解码 ...
- FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
随机推荐
- 【Java】字符串常用操作
字符的常用技巧 char c; 字母的顺序:c - 'A'.c - 'a' 字母大小写转换:c - 'a' + 'A'.c - 'A' + 'a' 数字字符转换为数字:c - '0' String.S ...
- 利用标准IO函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递
利用标准IO函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递 方法一:使用ftell函数直接获取光标偏移量 相关标准库函数 SYNOPSIS #include <stdio. ...
- Browser-use:基于 Python 的智能浏览器自动化 AI 工具调研与实战
Browser-use:基于 Python 的智能浏览器自动化 AI 工具调研与实战 一.概述 Browser-use 是一个旨在将 AI "智能体"(Agents)与真实浏览器进 ...
- Springboot+MongoDB添加数据时会自带_class字段
_class字段作用 帮助映射子类,为了方便处理Pojo中存在继承的情况,增加系统的扩展性 去除_class字段 新增mongodb的配置类,配置mappingMongoConverter,配置类网上 ...
- java基础之数据结构
一.栈:stack,又称堆栈[出口和入口在同一侧],特点:先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素) 例子:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当 ...
- Java 中如何判断对象是否是垃圾?不同垃圾回收方法有何区别?
Java 中如何判断对象是否是垃圾? 在 Java 中,垃圾是指不再被引用的对象.JVM 使用以下两种方法判断对象是否是垃圾: 1. 引用计数法(Reference Counting) 工作原理 每个 ...
- Go 语言的数据类型转换有哪些?
当不同的数据类型相互操作的时候,就需要类型转换,Go 的数据类型转换还是比较简单的. 数据类型转换包含显式和隐式两类,隐式的一般是大的数据类型到小的类型进行转换,不会有精度丢失的问题.否则就需要进行显 ...
- 还有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案
与上一篇区别在于,详情里面的模板通常是通用的,被定义在样式文件中,被重复使用,因此无法为其添加后台代码,如果能添加后台代码,请翻阅第一篇:所以需要用到命令的方式来辅助事件的抛出,当然还可以利用第三方库 ...
- [数据库/SQL] 浅谈DDL、DSL、DCL、DML、DQL
概念辨析:SQL.DQL.DML.DDL.DCL SQL(Structure Query Language, 结构化查询语言)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下 ...
- Spring AOP面向切面编程 通知类型
Spring AOP面向切面编程 通知类型 通知分为: 前置通知 执行方法之前通知 后置通知 执行方法之后通知 异常通知 相当于cache里面的内容 最终通知 相当于finally 环绕通知 前四种通 ...