​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解码器libdav1d,具体的操作步骤说明如下:

一、配置libdav1d

libdav1d是一款AV1的解码器,只负责解码,不负责编码。它的源码托管页面在https://code.videolan.org/videolan/dav1d/,最新版本是2025年1月发布的dav1d-1.5.1,该版本的源码包下载地址是https://code.videolan.org/videolan/dav1d/-/archive/1.5.1/dav1d-1.5.1.tar.gz。

libdav1d的配置步骤说明如下。

1、安装编译工具meson和ninja

meson和ninja是基于Python语言的编译工具,故需确保Windows系统已经安装了Python3。另外,还要按照《FFmpeg开发实战:从零基础到短视频上线》第一章的“1.3.2  安装依赖的Windows软件”给电脑安装Visual Studio 2022。

接着依次选择Windows开始菜单的“Visual Studio 2022”→“x64 Native Tools Command Prompt for VS 2022”,打开Visual Studio 2022的命令行界面,执行以下命令安装meson和ninja。

pip3 install meson
pip3 install ninja

2、使用meson配置libdav1d

先下载最新的dav1d源码,解压下载后的源码包,再从Visual Studio 2022的命令行进入dav1d源码目录:

cd dav1d-1.5.1

然后运行下面命令生成dav1d的VS工程:

meson setup build --buildtype=release --backend=vs

配置完成后,dav1d源码目录下出现build目录,里面便是meson给dav1d生成的VS工程。

二、编译libdav1d

打开Visual Studio 2022,在欢迎页面单击右侧的“打开项目或解决方案”,在弹出的文件对话框中选择dav1d-1.5.1\build目录下的dav1d.sln。

打开dav1d工程后,依次选择顶部菜单:生成→生成→生成dav1d,Visual Studio就开始编译dav1d模块。编译过程可在Visual Studio界面下方观察,直到编译完成如下图所示。

此时可在dav1d-1.5.1\build\src目录下找到dav1d.lib和dav1d.dll,这两个文件就是编译生成的libdav1d库文件。

三、安装libdav1d

确保Windows系统已经按照《FFmpeg开发实战:从零基础到短视频上线》第一章“1.3  Windows系统安装FFmpeg”的说明安装配置了MSYS,再按照以下步骤在MSYS环境安装libdav1d。

1、在msys64的/usr/local目录下新建libdav1d目录,并在该目录下创建lib子目录;

2、把dav1d工程中build\src目录下的dav1d.lib和dav1d.dll两个文件复制到第一步创建的lib目录;

3、在lib目录下创建pkgconfig子目录,并把dav1d工程的build\meson-private\dav1d.pc复制到pkgconfig目录;然后打开dav1d.pc,把开头一行改成下面这样。

prefix=/usr/local/libdav1d

4、把dav1d工程的include目录复制到msys64的/usr/local/libdav1d目录;

经过以上步骤操作后的libdav1d目录结构如下所示。

/usr/local/libdav1d
 |--------------- lib
 |                 |----- dav1d.lib
 |                 |----- dav1d.dll
 |                 |----- pkgconfig
 |                           |----- dav1d.pc
 |--------------- include
 |                 |----- dav1d
 |                           |----- dav1d.h
 |                           |----- headers.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/libdav1d/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-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/libdav1d/lib/dav1d.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-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-libdav1d”,说明FFmpeg已经启用了AV1解码器libdav1d。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

FFmpeg开发笔记(六十八)Windows给FFmpeg集成AV1解码器libdav1d的更多相关文章

  1. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  2. 安卓开发笔记(十八):实现button按钮事件的三种方法

    Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...

  3. .net开发笔记(十八) winform中的等待框

    winform中很多任务是需要在后台线程(或类似)中完成的,也就是说,经常容易涉及到UI界面与后台工作线程之间的交互.比如UI界面控制后台工作的执行(启动.暂停.停止等),后台工作进度在UI界面上的显 ...

  4. Java开发笔记(十八)上下求索的while循环

    循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...

  5. Android笔记(六十八) Fragment总结

    Fragment的产生: 为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期.可以接收并处理用户的各种事件,还可以动态的增删 ...

  6. Python+Selenium笔记(十八):持续集成jenkins

    (一)安装xmlrunner 使用Jenkins执行测试时,测试代码中会用到这个模块. pip install xmlrunner (二)安装jenkins (1)   下载jekins https: ...

  7. Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件

    前言   上一篇已经将himpp套入qt的基础上进行开发.那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤.   受限制   因为直接配置sample的vi比较麻烦 ...

  8. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  9. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  10. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

随机推荐

  1. Docker 镜像及容器命令

    授人以鱼不如授人以渔,先列出官方命令文档 docker命令文档地址:https://docs.docker.com/engine/reference/commandline/images/ 镜像相关指 ...

  2. 查看nginx版本号的几种方法

    1. 查看服务器上安装的nginx版本号,主要是通过nginx的-v或-V选项,查看方法如下图所示      -v 显示 nginx 的版本.      -V 显示 nginx 的版本,编译器版本和配 ...

  3. Windows Terminal

    ... Windows Terminal 安装 命令行接口 Windows Terminal 的命令行接口是 wt 因此我们可以在运行输入 wt 打开 Windows Terminal 也可以在资源管 ...

  4. SRE网站可靠性工程师

    SRE网站可靠性工程师 SRE需要做什么? 一般: 故障模式,尤其是SPOF(单点故障).消除SPOFs是你作为SRE最大的挑战和乐趣. 基础设施组件,从应用程序到硬件(服务器.交换机.路由器.互联网 ...

  5. 保存计算过程的计算器——java实现

    一.设计模型 按照MVC-Model View Control(模型,视图,控制器)的设计思想展开程序的设计和代码的编写.数据模型部分相当于MVC中的Model角色,视图设计部分给出的界面部分相当于M ...

  6. 2025年4月TIOBE指数

    4 月头条:编程语言 Kotlin.Ruby 和 Swift 直到最近在 TIOBE 指数排名中都一直稳居前 20 的稳定位置.但如今它们似乎失去了发展动力,且很可能会逐渐过时.Kotlin 和 Sw ...

  7. Sentinel源码—2.Context和处理链的初始化

    大纲 1.Sentinel底层的核心概念 2.Sentinel中Context的设计思想与源码实现 3.Java SPI机制的引入 4.Java SPI机制在Sentinel处理链中的应用 5.Sen ...

  8. eolinker返回值正则处理后设置为全局变量

    特别注意:需要使用全局变量前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 如下图,返回值content内,需要取出验证码后面的数字 预处理, ...

  9. 为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)

    设计模式实战项目:Markdown 文本编辑器软件开发(已开源) 一.项目简介 项目名称:YtyMark-java 本项目是一款基于 Java 语言 和 JavaFX 图形界面框架 开发的 Markd ...

  10. C#高性能开发之类型系统:从C# 7.0 到C# 14的类型系统演进全景

    自C# 7.0以来,C#语言在类型系统方面引入了众多新数据类型.类型构造和语言特性,以提升性能.类型安全性和开发效率.本文全面整理了从C# 7.0到C# 14.0(截至2025年4月,C# 14.0为 ...