FFmpeg入门及编译

news2024/11/30 2:30:16

文章目录

  • 前言
  • 一、FFmpeg 简介
  • 二、基本组成
    • 1、封装模块 - AVFormat
    • 2、编解码模块 - AVCodec
    • 3、滤镜模块 - AVFilter
    • 4、视频图像转换计算模块 - swscale
    • 5、音频转换计算模块 - swresample
    • 6、AVUtil - 核心工具库
    • 7、AVDevice - 硬件采集,加速,显示
  • 三、命令行工具
  • 四、FFmpeg 环境搭建及初体验
  • 五、Windows 下编译 FFmpeg
    • 1、准备编译环境
    • 2、MSYS2
    • 3、ffmpeg 源码
    • 4、修改 msys64
    • 5、安装其他编译工具
    • 6、编译 FFmepg
  • 六、VS 项目中引用 FFmpeg 库
    • 1、创建新项目
    • 2、控制台应用
    • 3、确定项目名称及位置
    • 4、点击创建
    • 5、引入FFmpeg 头文件
    • 6、指定库文件位置
    • 7、指定使用哪个库
    • 8、运行编译好的程序
  • 七、编译 FFmpeg 依赖库
    • 1、编译 SDL
      • ①、下载 SDL 源码
      • ②、下载 CMake
      • ③、编译 SDL
    • 2、编译 x264
    • 3、编译 fdk-aac
  • 八、FFmpeg 使用上述编译好的库


前言

本文主要讲解 FFmpeg 相关知识,以及在 Windows 下编译 FFmpeg 源码以及使用。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。


一、FFmpeg 简介

ffmpeg 是广泛使用的多媒体解决方案,既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。

其包括了目前领先的音/视频编码库 libavcodec。

ffmpeg 提供了多种媒体格式的封装和解封装,包括多种音视频编码,多种协议的流媒体,多种色彩格式转换,多种采样率转换,多种码率转换等。ffmpeg 发展至今,已经被许多开源项目使用。

二、基本组成

在这里插入图片描述
ffmpeg 框架的基本组成包含 AVFormat,AVCodec,AVFilter,AVDevice,AVUtil 等。

1、封装模块 - AVFormat

AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了 Protocol 层和 Demuxer、Muxer 层,使得协议和格式对于开发者来说是透明的。

AVFormat 中实现了目前多媒体领域中绝大多数媒体封装格式,包括封装和解封装,如 MP4,FLV 等文件封装格式,RTMP,HLS 等网络协议封装格式。ffmpeg 是否支持某种封装格式,取决于编译时是否包含了该格式的封装库。

应用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。

2、编解码模块 - AVCodec

编解码库,该模块也是最重要的模块之一,封装了 Codec 层。

AVCodec 中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec 除了支持自带的媒体解码格式之外,还支持第三方的编解码器,如 H.264 编码,需要使用 x264 编码器;MP3编码,需要使用libmp3lame 编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在 AVCodec 中增加相应的编解码模块。(有一些 Codec 是具备自己的 License 的,FFmpeg 是不会默认添加像 libx264、FDK-AAC、lame 等库的,但是 FFmpeg 就像一个平台 一样,可以将其他的第三方的 Codec 以插件的方式添加进来,然后为开发者提供统一的接口)

该库是音视频编解码的核心,avcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。

3、滤镜模块 - AVFilter

AVFilter 提供了一个通用的音频,视频,字幕等滤镜处理框架。该模块提供了包括音频特效和视频特效的处理,在使用 FFmpeg 的 API 进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便同时也非常高效的一种方式。

4、视频图像转换计算模块 - swscale

swscale 模块提供了高级别的图像转换 API,例如它允许进行图像缩放和像素格式转换,视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 gb565、rgb888 与 yuv420 等之间转换。

5、音频转换计算模块 - swresample

swresample 模块提供了高级别的音频重采样API。可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换。例如,它允许操作音频采样,音频通道布局转换与布局调整。

6、AVUtil - 核心工具库

该模块是最基础的模块之一,许多其他模块都会依赖该库做一些基本的音视频处理操作。

7、AVDevice - 硬件采集,加速,显示

硬件采集,加速,显示。输入输出设备库,比如,需要编译出播放声音或者视频的工具 ffplay,就需要确保该模块是打开的,同时也需要 libSDL 的预先编译,因为该设备模块播放声音与播放视频使用的都是 libSDL 库。

三、命令行工具

ffmpeg 已经编译好了3个常用的工具集 ffmpeg.exe、ffprobe.exe、ffplay.exe. 通过这 3 个工具就可以使用命令去操作一个多媒体文件。
在这里插入图片描述

  • ffmpeg.exe:ffmpeg 主要用于对音视频进行处理,比如说剪切、抽取视频、抽取音频、增加贴纸水印等等。Hyper fast Audio and Video encoder,音视频编解码工具(类似爱剪辑、格式工厂)。
  • ffplay.exe:ffplay主要用于播放视频,几乎支持所有的本地视频播放,还能支持流媒体等网络视频播放,甚至还能播放YUV视频,这点在开发过程中非常好用。Simple media player 简单媒体播放器。
  • ffprobe.exe:ffprobe主要用于查看音视频文件格式,比如说你要将一个音视频文件的所有信息以 JSON 格式输出,ffprobe 这个命令行就很便捷。Simple multimedia streams analyzer,简单多媒体流分析器。

四、FFmpeg 环境搭建及初体验

这里参考一下我前面写的博客:音视频开发常用工具

五、Windows 下编译 FFmpeg

1、准备编译环境

Windows11 64位
需要安装的软件和工具:

  • Visual Studio 2022(我本地已有)
  • MSYS2 + CMake

2、MSYS2

除了需要安装 VS 之外,还要安装 MSYS2,这是一款 Windows下模拟 Linux 的软件。FFmpeg 的编译就是在该软件中进行的,而编译时使用的编译器(cl.exe)和链接器(link.exe)则是由 Visual Studio 提供的。

MSYS2 可以到这里下载:
链接:https://pan.baidu.com/s/1fWcS_5Xlxv1Bja4354JnvA
提取码:worc

我这里将其安装到了 D:\msys64 目录下
在这里插入图片描述

3、ffmpeg 源码

编译环境准备好之后,接下来我们需要下载一份最新的 FFmpeg 源码,可以使用 Git 下载。先将Git命令安装好,然后执行下面的命令。

cd /d/Git-Space
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg   

代码就被下载到 D:\Git-Space 盘的 ffmpeg 目录下了

ffmpeg 源码也可以到这里下载:
链接:https://pan.baidu.com/s/1gjsDtEn_E4yCwnbT3TVUWQ
提取码:dlvx

4、修改 msys64

首先,进入 MSYS2 的安装目录,比如我这里将 MSYS2 安装到了 D:\msys64 目录下。在该目录下打开 msys2_shell.cmd 文件,将该文件第 17 行代码的注释打开,即去掉 rem 关键字,如下所示:
在这里插入图片描述
之所以要打开该注释,是为了让 MSYS2 可以继承 Windows 控制台的环境变量。

5、安装其他编译工具

之后,找到 x64 Native Tools Command Prompt for VS 2022 命令窗口:
在这里插入图片描述
在该命令窗口中输入下面的命令启动 MSYS2 软件

# 进入到 MSYS2 目录下
cd D:\msys64

# 启动 MSYS2
msys2_shell.cmd

在这里插入图片描述
此时,会弹出 MSYS2 的命令窗口。接下来,在该窗口中输入下面命令,安装必要的编译工具:

pacman -S diffutils make pkg-config yasm

在这里插入图片描述
其中 pacman 是 MSYS2的 包安装工具;而 diffutils、make…都是编译 FFmpeg 时需要用的编译工具。

6、编译 FFmepg

当编译工具安装好后,在 MSYS2 命令窗中执行下面命令,进入到 FFmpeg 源码目录下:

cd /d/Git-Space/ffmpeg

紧接着,运行 FFmpeg 源码目录中的 configure 脚本生成 Makefile 文件,命令如下:

./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-shared --disable-ffprobe --toolchain=msvc

上述命令的含义是使用 mscv 作为 FFmpeg 的编译工具链;编译出的 FFmpeg 库被放到 /usr/local/ffmpeg 目录下;编译的库是动态库,在 Windows 下就是 DLL 库;编译时不生成 ffprobe 程序。
在这里插入图片描述
上述脚本执行完成后,你可以在 FFmpeg 源码目录下发现多了一个 Makefile 文件。有了这个文件我们就可以编译FFmpeg了,编译命令如下:

make -j4 && make install

在这里插入图片描述
出现了很多报错:
fftools/opt_common.c(206): error C2065: “slib”: 未声明的标识符
fftools/opt_common.c(206): error C2296: “%”: 无效,因为左操作数的类型为“char [138]”
解决办法:
该问题是因为在 Windows下无法识别 CC_IDENT 导致的,只需将包括 CC_IDENT 关键字的那行代码注释掉即可。
在这里插入图片描述
在这里插入图片描述
继续编译

make -j4 && make install

此时编译通过了
在这里插入图片描述
当执行完这条命令后,在 D:\MSYS64\usr\local\ffmpeg 目录下就可以找到编译好的 FFmpeg 库和 FFmpeg 命令了。
在这里插入图片描述

六、VS 项目中引用 FFmpeg 库

编译好 FFmpeg 库后,下面我们就可以在 VS 中引用它了。

1、创建新项目

在这里插入图片描述

2、控制台应用

在这里插入图片描述

3、确定项目名称及位置

在这里插入图片描述

4、点击创建

在这里插入图片描述

5、引入FFmpeg 头文件

项目右键 -> 属性 -> C/C++ -> 常规 -> 附加包含目录 中添加 FFmpeg 头文件所在路径。
在这里插入图片描述

6、指定库文件位置

首先说明一点,我编译出来的库文件存在于 D:\msys64\usr\local\ffmpeg\bin 目录下在这里插入图片描述
项目右键 -> 属性 -> 链接器 -> 常规 -> 附加库目录 中添加 FFmpeg 库所在路径。
在这里插入图片描述

7、指定使用哪个库

项目右键 -> 属性 -> 链接器 -> 输入 -> 附加依赖项 中指定你所用到的 FFmpeg 库

指定以下所有库:

avcodec.lib
avdevice.lib
avfilter.lib
avformat.lib
avutil.lib
postproc.lib
swresample.lib
swscale.lib

在这里插入图片描述

8、运行编译好的程序

当上面这此工作完成后,我们就可以在 main(…) 函数中调用 FFmpeg API 了,如调用 FFmpeg 库中的日志函数:

#include <iostream>

extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
}

int main()
{
    av_log_set_level(AV_LOG_DEBUG);
    av_log(NULL, AV_LOG_INFO, "Hello World!\n");

    return 0;
}
  • 上述代码中,调用了 FFmpeg 中的两个 API,分别是 av_log_set_level(…) 以及 av_log(…),这两个函数都是 FFmpeg avutil 库中的 API。所以在使用这两个 API 之前,我们要在 main.c 中需要通过 #include 关键字将 libavtuil/log.h 这个头文件引入进来。
  • 此外,由于 FFmpeg 是 C 语言库,而我们用 VS 创建的是 C++ 工程,所以在引入头文件时需要加上 extern “C” 关键字,否则的话 VS 无法将其成功编译。

执行出现了这样的报错,其原因是在运行时无法找到需要的动态库。
在这里插入图片描述
解决方案一:
将 D:\msys64\usr\local\ffmpeg\bin 目录下的 avutil-58.dll 文件拷贝到 C:\Windows\System32 目录下
在这里插入图片描述
拷贝结果如下:
在这里插入图片描述
再次执行程序,可以看到如下的结果
在这里插入图片描述
解决方案二:
只需将我们之前编译好的 FFmpeg 库,即提示的无法找到的 .dll 库,拷贝到执行程序的同一目录下,这样执行程序就可以找到该库并正确执行了。
在这里插入图片描述

七、编译 FFmpeg 依赖库

很多时候我们在编译 FFmpeg 库时还要增加一些其它库,如 SDL、x264 等,如果要将这些库添加到 FFmpeg 中,首先我们要编译出 Windows 下可用的对应库。

1、编译 SDL

①、下载 SDL 源码

首先从 github 上获取 SDL 源码,命令如下:

git clone https://github.com/libsdl-org/SDL.git
git checkout release-2.26.x

需要注意的是,SDL现在已经发布了3.0版本,而ffmpeg目前只能用SDL2版本,所以在拉取代码后,需要切换到2.26这个版本

可以到这里自取 SDL-2.26.x
链接:https://pan.baidu.com/s/1n_wMhIsBb9yaDhAL8NHZ8Q
提取码:qqbh

②、下载 CMake

下载好 SDL2 源码后,我们需要使用 CMake 为其生成 VS 工程,并将其安装到 Windows 系统上。

可以到这里自取 CMake 安装包
链接:https://pan.baidu.com/s/1pQ7hh3WA6ES8pdBTpds1_Q
提取码:et4t

关于安装 CMake 这里,针对所有用户把 CMake 目录安装到系统目录
在这里插入图片描述
并将其安装到 D:\CMake\ 目录下
在这里插入图片描述

③、编译 SDL

之后打开 CMake-GUI,在 CMake-GUI 中指定 SDL 源码所在路径(D:/Git-Space/SDL)以及编译后的输出路径(D:/CMake/usr/local/)
在这里插入图片描述
随后执行

Configure -> Generate -> Open Project

生成 VS 工程。有了 VS 工程,我们就可以通过 VS2022 来编译 SDL 了。

分别在 Release 和 Debug 模式下,重新生成一下 All_BUILD 子项目。
在这里插入图片描述
没啥问题的话 SDL 就编译好了,你可以去 D:\Project\VS_Project\sdl_test\Debug 和 D:\Project\VS_Project\sdl_test\Release 目录下看看有没有对应的 lib 文件

D:\CMake\usr\local\sdl\Debug 目录如下:
在这里插入图片描述
D:\Project\VS_Project\sdl_test\Release 目录如下
在这里插入图片描述
为了满足要求,我们需要在指定输出目录下创建 lib 目录,并将 SDL2.lib 和 SDL2.dll 文件拷贝到 lib 目录下。同时在 lib 目录下创建 pkgconfig 目录,将 sdl2.pc 文件拷贝到该目录中。

最终完整的目录结构如下所示:

/usr/local/sdl2
 |------------ lib
 |              |-- sdl2.lib
 |              |-- sdl2.dll
 |              |-- pkgconfig
 |                     |----- sdl2.pc
 |------------ include

此外,我们还要修改 sdl2.pc 中的内容,将其中的库路径修改为指定的输出路径
在这里插入图片描述

2、编译 x264

x264 库的编译还是比较简单的,与 SDL 一样我们也要先获取其源码,可以通过下面的命令获取 x264 源码:

git clone https://code.videolan.org/videolan/x264.git

可以到这里自取 x264 源码
链接:https://pan.baidu.com/s/17HyuJBrka04DXoS4WOa3tQ
提取码:oqrb

源码获取到后,可以直接在 MSYS2 环境下编译出 Windows 下可用的动态库,具体步骤如下:

# 通过VS X64 Native... 窗口打开MSYS2
cd D:\msys64
msys2_shell.cmd

cd /d/Git-Space/x264/ # 在MSYS2中进入x264源码目录

pacman -S automake autoconf libtool # 安装生成Makefile的工具

CC=cl ./configure --prefix=/usr/local/x264 --enable-shared --disable-asm

make -j 4 && make install

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面的命令就可以将 x264 编译出来了。x264 编译好后,其输出的目录结构与 ffmepg 是一样的,在 /usr/local/x264 中包括了 include、lib、bin 等目录。
在这里插入图片描述
要特别强调的一点是,我们需要将 lib 目录下的 libx264.dll.lib 文件名修改为 libx264.lib,否则 ffmpeg 编译时会报 “无法找到该库” 的错误。
在这里插入图片描述

3、编译 fdk-aac

fdk-aac 的编译与 SDL 类似,它同样要使用 CMake 生成 VS 工程文件,之后再通过 VS 编译该库。

首先,通下面的的命令获取 fdk-aac 源码:

git clone https://github.com/mstorsjo/fdk-aac.git

可以到这里自取 fdk-aac 源码:
链接:https://pan.baidu.com/s/1ViuYEtEFFh71w9ZRgLaesA
提取码:hwf5

之后打开 CMake-GUI,在 CMake-GUI 中指定 SDL 源码所在路径(D:/Git-Space/fdk-aac)以及编译后的输出路径(D:/CMake/usr/local/fdk-aac)
在这里插入图片描述
随后执行

Configure -> Generate -> Open Project

生成 VS 工程。有了 VS 工程,我们就可以通过 VS2022 来编译 FDK-AAC 了。

分别在 Release 和 Debug 模式下,重新生成一下 All_BUILD 子项目。
在这里插入图片描述
没啥问题的话 FDK-AAC 就编译好了,你可以去 D:\CMake\usr\local\fdk-aac\Debug 和 D:\CMake\usr\local\fdk-aac\Release 目录下看看有没有对应的 lib 文件

D:\CMake\usr\local\sdl\Debug 目录如下:
在这里插入图片描述
D:\CMake\usr\local\fdk-aac\Release 目录如下:
在这里插入图片描述
为了满足要求,我们需要在指定输出目录下创建 lib 目录,并将 fdk-aac.lib 和 fdk-aac.dll 文件拷贝到 lib 目录下。同时在 lib 目录下创建 pkgconfig 目录,将 fdk-aac.pc 文件拷贝到该目录中。

但是这里发现一个问题,就是目录下没有 include 目录
在这里插入图片描述

为了解决这个问题,我又用 MSYS2+mingw 的方式重新编译了一遍 fdk-aac,这种方式是可以生成 include 头文件的

①、打开 MSYS2 MINGW64
在这里插入图片描述
②、在 fdk-aac 目录下执行如下命令

pacman -S mingw-w64-x86_64-gcc
./autogen.sh
./configure --prefix=/usr/local/fdk-aac --enable-shared
make -j4
make install

在这里插入图片描述
然后将生成的头文件手动拷贝到了 /usr/local/fdk-aac 目录下即可。
在这里插入图片描述
最终完整的目录结构如下所示:

/usr/local/fdk-aac
 |------------ lib
 |              |-- fdk-aac.lib
 |              |-- fdk-aac.dll
 |              |-- pkgconfig
 |                     |----- fdk-aac.pc
 |------------ include

此外,我们还要修改 fdk-aac.pc 中的内容,将其中的库路径修改为指定的输出路径
在这里插入图片描述

八、FFmpeg 使用上述编译好的库

首先,我们要设置环境变量 PKG_CONFIG_PATH,通过它告诉 FFmpeg 上述几个库从哪儿可以找到,具体的设置方法如下:

在 MSYS2 窗口中打开 .bashrc

pacman -S vim 
vim ~/.bashrc

在 ~/.bashrc 中设置环境变量

export PKG_CONFIG_PATH=/d/CMake/usr/local/sdl/lib/pkgconfig:/usr/local/x264/lib/pkgconfig:/d/CMake/usr/local/fdk-aac/lib/pkgconfig:$PKG_CONFIG_PATH
:wq #保存并退出vim  

在这里插入图片描述
让环境变是生效

source ~/.bashrc

接下来,重新生成 FFmpeg 的 Makefile 文件,并重新编译

首先进入到 ffmpeg 源码目录,执行下列命令

./configure --prefix=/usr/local/ffmpeg --arch=x86_64 --enable-shared --disable-ffprobe --disable-doc --enable-x264 --enable-gpl --enable-fdk-aac --enable-nonfree --toolchain=msvc

make clean

make -j 4 && make install

在这里插入图片描述
最后,将 sdl 的 dll、x264 的 dll 以及 fdk-aac 的 dll 拷贝到 ffmpeg 的 bin 目录下,这样就可以正确的执行 ffmpeg.exe 或 ffplay.exe 命令了。
在这里插入图片描述
进入 ffmpeg/bin 目录下,执行以下命令,如果能够输出版本信息,则说明正常

./ffmpeg.exe -version

在这里插入图片描述


我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教学必备工具

大家好&#xff0c;今天要给大家介绍一个超级方便的工具——易查分&#xff01;利用易查分&#xff0c;我们可以轻松制作一个便捷高效的作业查询系统&#xff0c;让作业查询变得简单又高效。下面就让我来为大家详细介绍一下易查分的使用教程吧&#xff01; 是不是想有个自己的分…

【Java】-【使用jxl操作excel】

文章目录 下载jxl包并引用基本使用多sheet页使用并与MySQL/Oracle数据库连接 报错excel文件读写报错&#xff1a;jxl.read.biff.BiffException: Unable to recognize OLE stream原因&#xff1a;文件版本不兼容&#xff0c;jxl只支持excecl03版解决办法 下载jxl包并引用 jxl.j…

【1++的C++进阶】之C++11(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;类的新变化二&#xff0c;可变参数模板三&#xff0c;lambda表达式 一&#xff0c;类的新变化 在C03之前&#xff0c;我们的默认成员函数有6个&#xff0c;…

(2596. 检查骑士巡视方案leetcode,经典深搜)-------------------Java实现

&#xff08;2596. 检查骑士巡视方案leetcode,经典深搜&#xff09;-------------------Java实现 题目表述 骑士在一张 n x n 的棋盘上巡视。在 有效 的巡视方案中&#xff0c;骑士会从棋盘的 左上角 出发&#xff0c;并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x n …

PY32F003F18之定时器中断

PY32F003F18定时器有TIM1&#xff0c;TIM3&#xff0c;TIM14&#xff0c;TIM16和TIM17。其中TIM1为高级定时器&#xff0c;其它为通用定时器。见下表&#xff1a; 一、PY32F003F18定时器的工作模式&#xff1a; 1、边沿对齐模式 计数器工作在"边沿对齐模式" 设置&q…

《动手学深度学习 Pytorch版》 4.7 前向传播、反向传播和计算图

4.7.1 前向传播 整节理论&#xff0c;详见书本。 4.7.2 前向传播计算图 整节理论&#xff0c;详见书本。 4.7.3 反向传播 整节理论&#xff0c;详见书本。 4.7.4 训练神经网络 整节理论&#xff0c;详见书本。 练习 &#xff08;1&#xff09;假设一些标量函数 X X X…

Wireshark把DDoS照原形

1 前言 MTU、 传输速度、 拥塞控制&#xff0c;还是各种重传&#xff0c;TCP传输相关的核心概念&#xff1a; 学习了RFC规范和具体的Linux实现通过案例&#xff0c;把这些知识灵活运用了起来 这种种还是在协议规范这大框架内的讨论&#xff0c;默认前提就是通信两端是遵照TC…

Activating More Pixels in Image Super-Resolution Transformer(HAT)超分

摘要 基于Transformer的方法在低级视觉任务&#xff08;如图像超分辨率&#xff09;上表现出令人印象深刻的性能。然而&#xff0c;我们发现这些网络只能通过归因分析利用有限的输入信息空间范围。这意味着Transformer的潜力在现有网络中仍未得到充分利用。为了激活更多输入像…

yolov7添加 iRMB模块

复制过来 yolo.py添加 yaml文件随便换&#xff0c;建议换3x3的 pip install timm0.6.5&#xff0c;版本问题记得搞一下

DNG格式详解,DNG是什么?为何DNG可以取代RAW统一单反相机、苹果安卓移动端相机拍摄输出原始图像数据标准

返回图像处理总目录&#xff1a;《JavaCV图像处理合集总目录》 前言 在DNG格式发布之前&#xff0c;我们先了解一下之前单反相机、苹果和安卓移动端相机拍照输出未经处理的原始图像格式是什么&#xff1f; RAW 什么是RAW&#xff1f; RAW是未经处理、也未经压缩的格式。可以…

基于开源模型搭建实时人脸识别系统(六):人脸识别(人脸特征提取)

文章目录 人脸识别的几个发展阶段基于深度学习的人脸识别技术的流程闭集和开集&#xff08;Open set&#xff09;识别人脸识别的损失Insightface人脸识别数据集模型选型参考文献结语人脸识别系统项目源码 前面我们讲过了人脸检测、人脸质量、人脸关键点、人脸跟踪&#xff0c;接…

微分中值定理

目录 费马定理 罗尔定理 拉格朗日中值定理 柯西中值定理 几个常用的泰勒公式 微分中值定理是微积分中的一个重要定理&#xff0c;它用于描述一个函数在某个区间内的平均变化率与该区间内某一点的瞬时变化率之间的关系。微分中值定理有两个主要形式&#xff1a;拉格朗日中值…

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter

Kotlin Files Paths write ByteArray writeString写多行BufferedWriter import java.nio.file.Files import java.nio.file.Paths import java.nio.file.StandardOpenOptionfun main(args: Array<String>) {val filePath "./myfile.txt"val path Paths.get(…

【报错】springboot3启动报错

报错内容&#xff1a;Cannot load driver class: org.h2.Driver Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 解决; 通过源码分析&#xff0c;druid-spring-boot-3-starter目前最新版本是1…

微信小程序 写一个接口不会掉就不会停止的加载动画

我们可以在接口调用前执行 wx.showLoading({title: 加载中,mask: true })这个加载会在这一直转 显示这加载的动画 它不会自己停下来 而是需要你执行 wx.hideLoading()之后 这个加载动画才会停止 那么我们完全可以将wx.hideLoading()放在接口返回的回调中 这样 就达到了一个 …

LeetCode每日一题:2596. 检查骑士巡视方案(2023.9.13 C++)

目录 2596. 检查骑士巡视方案 题目描述&#xff1a; 实现代码与解析&#xff1a; bfs模拟 原理思路&#xff1a; 2596. 检查骑士巡视方案 题目描述&#xff1a; 骑士在一张 n x n 的棋盘上巡视。在有效的巡视方案中&#xff0c;骑士会从棋盘的 左上角 出发&#xff0c;并…

利用Semaphore实现多线程调用接口A且限制接口A的每秒QPS为10

前段时间在群里面发现有个群友抛出一个实际需求&#xff1a;需要通过一个接口拉取数据&#xff0c;这个接口有每秒10QPS限制&#xff0c;请问如何实现数据拉去效率最大化且限制调用拉取接口每秒10PQPS&#xff1f;我觉得这个需求挺有意思的&#xff0c;跟某群友讨论&#xff0c…

CopyOnWriteArrayList源码分析

其中唯一的线程安全 List 实现就是 CopyOnWriteArrayList。 特点 由于读取操作不会对原有数据进行修改&#xff0c;因此&#xff0c;对于每次读取都进行加锁其实是一种资源浪费。相比之下&#xff0c;我们应该允许多个线程同时访问 List 的内部数据&#xff0c;毕竟对于读取操…

企业邮箱选择指南:最适合跨境贸易的解决方案推荐

随着全球贸易的不断发展&#xff0c;外贸公司越来越依赖高效的沟通和协作工具。在众多企业邮箱选择中&#xff0c;哪一种最适合外贸公司的需求呢&#xff1f;让我们一起来看看外贸公司常用的企业邮箱解决方案。 对于外贸公司而言&#xff0c;可靠性是选择企业邮箱的首要考虑因…

LC1798. 你能构造出连续值的最大数目(JAVA)

LC1798. 你能构造出连续值的最大数目 题目描述贪心算法代码演示 题目描述 难度 - 中等 Leetcode - 1798. 你能构造出连续值的最大数目 给你一个长度为 n 的整数数组 coins &#xff0c;它代表你拥有的 n 个硬币。第 i 个硬币的值为 coins[i] 。如果你从这些硬币中选出一部分硬币…