当前位置: 首页 > news >正文

全面介绍AVFilter 的添加和使用


author: hjjdebug
date: 2025年 04月 22日 星期二 13:48:19 CST
description: 全面介绍AVFilter 的添加和使用


文章目录

  • 1.两个重要的编码思想
    • 1. 写代码不再是我们调用别人,而是别人调用我们!
    • 2. 面向对象的编程方法.
  • 2. AVFilter 开发流程
    • 2.1 编写AVFilter 文件
      • 2.1.0 定义AVFilter 对象
      • 2.1.1 初始化对象必要的成员变量.
      • 2.1.2 完善对象的指针函数
      • 2.1.3 成员变量可以是对象或对象数组
    • 2.2. 向ffmpeg 系统添加AVFilter文件
      • 2.2.1 copy文件到libavfilter目录下
      • 2.2.2 修改libavfilter/allfilter.c文件,添加外部AVFilter 对象声明
    • 2.3 重新执行configure 命令
      • 2.3.1. ff_vsrc_color_screen名称的意义
    • 2.4. 修改Makefile
      • 2.4.1 CONFIG_VSRC_COLOR_SCREEN_FILTER 配置宏名称的由来? 由对象名推导来的.
    • 2.5 小结
  • 3.代码验证:
    • 3.1 应用级验证
    • 3.2 最简单代码级验证
    • 3.3 用filtergraph 创建filter验证
  • 4. 改进意见

目的,本博客将引导你完成一个最简单的视频过滤器. 叫.vsrc_color_screen
它的功能很简单,就是产生一幅彩色屏幕画面.
通过本试验,你可以了解filter 是怎样工作的,我们怎样把自己的代码加入到ffmpeg框架中.

1.两个重要的编码思想

框架人家已经写好了,不能更改,你要想让自己的代码让框架调用,必需要符合一定的规范.
我们习惯了写代码调用别人的代码, 例如libc 库函数, printf 函数等等,
现在是别人调用自己. 这是第一个要转变的思想.

1. 写代码不再是我们调用别人,而是别人调用我们!

你可能听说过, 这不就是回调函数吗! 我注册一个函数,对方调用我.
对,是的,回调函数就是代码级别人调用自己的例子, 它要求函数的参数必需按对方要求的类型和个数来写.
这就是一个规范. 即参数的个数及类型早已经确定了,你不能更改.
ffmpeg 采用的代码接口是对象, 对象的概念一两句不易说明白,在使用中需慢慢体会.
这里需要知道,对象就是带指针函数的结构变量就可以了.

2. 面向对象的编程方法.

对象是c++中提出的概念, ffmpeg c语言所写也有对象的概念吗?
是的,ffmpeg 的对象才能更让你深刻的理解对象的本质. 它们是想通的.
c++说, 对象是由类创建的, 类由成员变量和成员函数构成.其中成员函数也可以是虚函数.
其实,c++的类就对应c的结构,对象就对应结构变量. c++有成员函数,c结构也可以有成员函数.
c++有虚函数,c结构也可以有虚函数,只是定义上有点区别而已.
后边介绍过滤器时,也会把这种面向对象的思想进行介绍,并与c++对比.

有了上面2个概念,开始介绍filter,vsrc_color_screen的开发.

2. AVFilter 开发流程

2.1 编写AVFilter 文件

2.1.0 定义AVFilter 对象

首先,因为它是filter, 我们就定义一个AVFilter 对象
AVFilter ff_vsrc_color_screen;
为什么叫这个名字,为什么前面加ff_?
嗯, 先理解为这就是规定, 因为filter对象都是这样起名字的叫ff_xxx
至于为什么这样,以后再介绍.
看到了吧,约束从起名字就开始了.
你只要把这个对象都处理好了,那这个彩色视频过滤器就算写好了.

且慢. c++里我创建一个对象一般都是写好类,然后一个new操作就把对象创建出来了.
ffmpeg 这里是在干啥呢?对象创建完了,我还没有写代码呢?它则么调用输出彩色屏幕的函数?

2.1.1 初始化对象必要的成员变量.

目前 ff_vsrc_color_screen 它就是一个默认的AVFilter对象,
是个架子,是个空壳,是个还缺少初始化的结构变量, 你需要把这个结构变量中的各成员变量都付给正确的值,
这个对象才算创建完成.
我们继续定义这个对象,添加几个变量, 没写的变量都是默认的空了.

AVFilter ff_vsrc_color_screen = {
.name = “color_screen”, //对象属性.name名称,可以叫做对外的对象名称
.activate = activate, // 获取frame 就会回调这个函数
.inputs = NULL,
.outputs = color_outputs, //指向过滤器的输出脚 AVFilterPad 数组
};

AVFilter 类(或说结构) 就不用我们写了,ffmpeg 都写好了, 我们只需要创建出一个完整的对象就可以了.
new 出来的对象不完整,成员变量全是空的,我们正在补全有用的信息.
.name 就是一个字符串, 给对象起个名, 以后把这个对象注册了, 系统就知道我们叫这个名,它以后要找我们,
也是找这个名就能找到我们
.activate 是一个函数指针, 需要我们去完成这个函数

又有问题了 !!
c++的成员函数是属于类的, 所有的对象都调用同一个成员函数,只是传递的this指针不同而以.
这里.activate 是一个函数, 为什么要我们写这个函数呢?它自己不会写吗?

.activate 函数指针, 可以理解为c++的虚函数指针. 虚函数指针在子类中是可以被改变的. 使得不同的子类有不同的表现.
从c的层面来理解, 虚函数是属于对象的,因为对象中虚函数指针可以被改变,使指向不同的函数,从而有不同的表现.
AVFilter 结构中能写的函数它都写了, 那些是属于类的,包括隐含的,你看不见的和无需关心的函数
对象中定义的.activate 就是一个回调函数, 参数的个数和类型已经确定. 具体执行什么操作需要你自己去完成.
它是上层调用AVReadFrame时 的回调函数
可见对象中可以定义很多个函数指针,它们都是回调函数,都是接口函数. 你不需要实现的,可以不实现.
这里,可以给对象另一个定义.
对象是代码级接口,包含很多成员变量和一系列回调函数.

2.1.2 完善对象的指针函数

虽然AVFilter可能很复杂, 但定义一个AVFilter对象还是比较简单,
只需要定义有限的几个变量和实现少数几个接口就可以了. 继续!

static int activate(AVFilterContext* ctx)
{AVFilterLink* outlink = ctx->outputs[0]; //定义的输出脚,见后.AVFrame* frame;if (!ff_outlink_frame_wanted(outlink)) //安全检查return FFERROR_NOT_READY;if (!test_picref){ //第一次调用生成一幅图片test_picref = ff_get_video_buffer(outlink, 640, 480);test_fill_picture_fn(outlink->src, test_picref); //自己写的函数,要补充完整.}frame = av_frame_clone(test_picref); //每次调用,克隆这幅图片frame->pts = test_pts;frame->key_frame = 1;frame->interlaced_frame = 0;frame->pict_type = AV_PICTURE_TYPE_I;frame->sample_aspect_ratio = AVRational(1,1);test_pts++;return ff_filter_frame(outlink, frame);
}

2.1.3 成员变量可以是对象或对象数组

例如 color_outputs 就是一个过滤器引脚AVFilterPad 数组,
而AVFilterPad 对象又包含函数.

//具体填充图片frame的代码,也是调用的库函数完成的,draw,color需要先初始化
//人家都写好了,不需要你再去写了.
static void color_fill_picture(AVFilterContext* ctx, AVFrame* picref)
{
//下面是ffmpeg utils提供的函数,画实体矩形. x,y,w,h; color
ff_fill_rectangle(&draw, &color, picref->data, picref->linesize, 0, 0, 640, 480);
}

//关于引脚的套路函数,你需要对你使用的变量进行初始化, 而初始化又是调用的ffmpeg库函数,
// 你自己就没干什么事. 是啊,牵着牛鼻子走,让牛干活就可以了.

static int color_config_props(AVFilterLink* inlink)
{AVFilterContext* ctx = inlink->src;TestSourceContext* test = ctx->priv;int ret;ff_draw_init(&test_draw, inlink->format, 0);ff_draw_color(&test_draw, &test_color, test_color_rgba);if ((ret = config_props(inlink)) < 0)return ret;return 0;
}static const AVFilterPad color_outputs[] = {{.name = "default",.type = AVMEDIA_TYPE_VIDEO,.config_props = color_config_props,},{ NULL }
};

代码中函数及变量的来历都说清楚了, 还要加上头文件,适当的变量声明. 搞定gcc 也需要2把刷子.
下面是编译通过后的完整代码,放到顶部资源中下载吧.

2.2. 向ffmpeg 系统添加AVFilter文件

现在看看怎样加到ffmpeg系统中进行编译的. 及如何注册给ffmpeg系统.

2.2.1 copy文件到libavfilter目录下

把我们写的文件命名为vsrc_color_screen.c文件,
为啥叫这个名字,加 "vsrc__“是什么意思? 嗯一会再说, 你看看libavfilter下的filter文件都是
“vf_”,“af_”,“vsrc_”,”asrc_"开头的文件,最起码它是为了分类.
把这个文件copy到libavfilter下.

怎样向系统注册你新建的对象.

2.2.2 修改libavfilter/allfilter.c文件,添加外部AVFilter 对象声明

打开libavfilter/allfilter.c, 添加 extern AVFilter ff_vsrc_color_screen 声明
你可以看到很多exptern AVFilter ff_xxx的声明,
其中还有extern AVFilter ff_vsrc_xxx的声明
这说明这个文件使用了很多AVFilter 对象, 这里你就能体会对象和类是不一样的,AVFilter 是类,
AVFilter xxxx, 是声明的对象, extern AVFilter xxxx 是说这个对象是在别的文件定义的.
这个文件只是使用了一下.

我们就在 ff_vsrc_xxx 的尾巴上添加一条(其实在哪填都一样),说明有那么一个对象
extern AVFilter ff_vsrc_color_screen;

2.3 重新执行configure 命令

把你编译ffmpeg时执行的configure 命令重新运行一遍.
为啥呢? 干吗要重新配置呢?
因为configure 命令要扫描这个allfilter.c 文件, 把该文件中"extern AVFilter ff_“开头的声明
重新处理生成一个文件,叫"filter_list.c”, 这个文件也是被allfilter.c 包含的文件
打开这个文件你就明白了,你写的这个对象就在这个表中

static const AVFilter * const filter_list[] = {//一堆af过滤器,copy两个说明一下就可以了.&ff_af_abench,&ff_af_acompressor,....//一堆vsrc, 少copy几个&ff_vsrc_allrgb,&ff_vsrc_allyuv,&ff_vsrc_cellauto,&ff_vsrc_color_screen  // 我们定义的过滤器//其它过滤器对象就忽略了....
}

2.3.1. ff_vsrc_color_screen名称的意义

ff_vsrc_color_screen, 这个名称是代码中的对象名称,对应一个地址
"ff_"这3个字符,是AVFilter 对象的标识.
所有的AVFilter 对象都是以"ff_"开始的,硬性规定,为什么呢?
因为configure 工具解析了allfilter.c文件,
碰到extern AVFilter "ff_"开始的代码行. 就知道它遇到了一个对象, 它会把所有对象地址形成一个文件
叫filter_list.c文件
工具对代码的改变,也算是你改变的,只是它节省了你的时间且不会改错.
由此我们知道,"ff_"开始的名称,是给configure 工具看的,告诉它这是一个AVFilter对象

vsrc 代表一种分类,视频源.
名称其它部分自由定义.

configure 命令一定要执行,而不要去手改这个filter_list.c, 因为configure 还生成其它文件,例如
我们要做的第二项改动,修改Makefile

2.4. 修改Makefile

我们先看看目前的Makefile
OBJS- ( C O N F I G G R A D I E N T S F I L T E R ) + = v s r c g r a d i e n t s . o O B J S − (CONFIG_GRADIENTS_FILTER) += vsrc_gradients.o OBJS- (CONFIGGRADIENTSFILTER)+=vsrcgradients.oOBJS(CONFIG_HALDCLUTSRC_FILTER) += vsrc_testsrc.o
OBJS- ( C O N F I G L I F E F I L T E R ) + = v s r c l i f e . o O B J S − (CONFIG_LIFE_FILTER) += vsrc_life.o OBJS- (CONFIGLIFEFILTER)+=vsrclife.oOBJS(CONFIG_MANDELBROT_FILTER) += vsrc_mandelbrot.o

我们知道,Makefile 是支持宏变量的, 宏变量是这样定义的
haha=“我很高兴”
当我们引用haha时,用$(var)来引用
$(warning $(haha)) 就会输出"我很高兴"

我们以第一项为例
OBJS-$(CONFIG_GRADIENTS_FILTER) += vsrc_gradients.o
“+=” 是把这个宏的定义又增加了一项的意思. 还是定义宏的问题
$(CONFIG_GRADIENTS_FILTER) ,是一个变量展开, 那就要看看CONFIG_GRADIENTS_FILTER是怎样定义的.
我们打开ffbuild/config.mak 查看CONFIG_GRADIENTS_FILTER的宏定义
CONFIG_GRADIENTS_FILTER=yes
我们就知道这一行的意思是
OBJS-yes += vsrc_gradients.o

在ffmpeg Makefile 中, OBJS-yes宏变量就是要生成的所有的目标文件的集合,
我们有了新编的vsrc_color_screen.c文件,当然也要把它编译成vsrc_color_screen.o文件,这样才能使用.

OBJS-$(CONFIG_VSRC_COLOR_SCREEN_FILTER) += vsrc_color_screen.o

2.4.1 CONFIG_VSRC_COLOR_SCREEN_FILTER 配置宏名称的由来? 由对象名推导来的.

宏名称CONFIG_VSRC_COLOR_SCREEN_FILTER, 为啥叫这个名?
看看别的filter中定义的, 找葫芦画瓢来配置
它的过程是在obj名称(去掉ff_)前面加上CONFIG,在后面加上FILTER,
也就是这个宏名是从object名称推导的.

###3.4.2 vsrc_color_screen.c 源代码名称的由来 ? 可以随便设.
用对象名命名文件名显得更有意义.

如果这个config宏是yes 的话, OBJS-yes 宏中就能添加vsrc_color_screen.o,
编译器gcc就能从源文件vsrc_color_screen.c 把它编译出来

好消息来了! 这个宏我们不用自己亲自定义了, 因为当你运行configure 命令时, configure给我们生成了这个宏定义
它就存放在 ffbuild/config.mak 文件中, 每次configure,这个文件都会被更新.

我知道你又有问题了,你想问config.mak这个文件是根据什么生成的?
这也难不住咱,我对它有研究. 其实绕了一圈还是configure 文件对那个allfilter.c文件进行了解析
抽取了所有extern AVFilter “ff_” 文本行, 然后定义了CONFIG_xxx_FILTER宏并书写到ffbuild/config.mak中
configure 不仅生成了config.mak 文件,还生成了config.h文件供代码调用,还生成了许多别的文件filter_list.c等等.
configure 是个脚本工具,它干了很多事情,你也可以修改它让它干更多的事如果需要的话.

那如果我修改了Makefile 和 allfilter.c 而忘记运行configure 怎么办?
没关系,你只管运行make, 它会给出提示信息:

WARNING: libavfilter/allfilters.c newer than config.h, rerun configure
连Makefile 也已经做的很贴心了.

2.5 小结

现在总结一下添加filter的过程吧.

  1. 书写代码
  2. 修改allfilters.c,用extern AVFilter ff_xxx
  3. 修改Makefile, 添加OBJS-$(CONFIG_xxx_FILTER)= new_filter.o
  4. 重新运行configure
    再执行make, 看看你的代码是否已经编译出来了.!
    都重编了,太多内容了,看不见.
    没关系, 再touch一下你的源代码,再make,这次只编译你的代码,就能看清楚了.
    代码有问题或有警告, 你可以修改代码再编译, 于时进入filter代码开发循环了.恭喜你上了正路!

3.代码验证:

验证就很简单了.
辛辛苦苦写的代码就是为了符合它的框架.
验证当然要用它的框架来验证了.

3.1 应用级验证

用ffplay 可以验证,我们可以指定ffplay 用我们的filter, 最简单的验证方式.
$ffplay -f lavfi vsrc_color_screen

没有按期望运行,那你就要检查一下了! 使用简单的东西,出了问题检查解决问题可就要凭真本事了.
如果你真要是理解了它的运行过程,那后面的就更容易理解了.

3.2 最简单代码级验证

ffmpeg filter的上层管理对象是 “lavfi” 对象, 它是一个AVInputFormat对象,是一个虚拟设备源,
让它的实现类匹配我们的filter,使它的数据直接从我们的filter来取. 就可以验证我们的filter.
这是标准的ffmpeg操控数据的流程,用avformat_open_input 打开文件,用avcodec_open2打开codec.
用av_read_frame 来读取数据, ffplay,ffprobe,ffmpeg也是这样处理过滤器的.
核心思想是把filter当文件使用.
直接给代码.都是通过调试的.

3.3 用filtergraph 创建filter验证

"lavfi"对象的执行过程其实也是创建filtrgraph,创建filter取数的过程, 如果不用lavfi虚拟设备
而是直接自己书写filtergraph,也可以.
这次代码更底层一些,也更直接一些,对其中的过程会辽解的更细致一些.
直接给代码,见附件

4. 改进意见

  1. 程序中用了很多全局变量,应该用一个结构把它们收集起来,看得会比较正规一些.
  2. 把这个结构改用AVClass 去定义,这样可以实现从外部(过滤器名+参数)直接控制这些参数.
    例如w,h,color等等

参考:
libavfilter/vsrc_color.c
doc/examples/filtering_video.c

相关文章:

全面介绍AVFilter 的添加和使用

author: hjjdebug date: 2025年 04月 22日 星期二 13:48:19 CST description: 全面介绍AVFilter 的添加和使用 文章目录 1.两个重要的编码思想1. 写代码不再是我们调用别人&#xff0c;而是别人调用我们!2. 面向对象的编程方法. 2. AVFilter 开发流程2.1 编写AVFilter 文件2.1.…...

复刻低成本机械臂 SO-ARM100 3D 打印篇

视频讲解&#xff1a; 复刻低成本机械臂 SO-ARM100 3D 打印篇 清理了下许久不用的3D打印机&#xff0c;挤出机也裂了&#xff0c;更换了喷嘴和挤出机夹具&#xff0c;终于恢复了正常工作的状态&#xff0c;接下来还是要用起来&#xff0c;不然吃灰生锈了&#xff0c;于是乎想起…...

基于微信小程序的走失儿童帮助系统-项目分享

基于微信小程序的走失儿童帮助系统-项目分享 项目介绍项目摘要管理员功能图用户功能图系统功能图项目预览首页走失儿童个人中心走失儿童管理 最后 项目介绍 使用者&#xff1a;管理员、用户 开发技术&#xff1a;MySQLJavaSpringBootVue 项目摘要 本系统采用微信小程序进行开…...

C++23 中 static_assert 和 if constexpr 的窄化布尔转换

文章目录 背景与动机C23 的改进限制与例外总结 C23 引入了一项重要的语言特性变更&#xff0c;即在 static_assert 和 if constexpr 中允许窄化按语境转换为 bool。这一特性由 Andrzej Krzemieński 提出的 P1401R5 论文推动&#xff0c;旨在使编译器的行为与标准保持一致&a…...

服务网格在DevOps中的落地:如何让微服务更智能、更稳定?

服务网格在DevOps中的落地:如何让微服务更智能、更稳定? 近年来,DevOps在企业IT架构中变得至关重要,而微服务架构的广泛应用更是加速了这一趋势。然而,随着微服务数量不断增长,我们发现自己掉入了一个运维“泥潭”: 服务之间的流量调控变得复杂可观测性不足,出现问题时…...

el-table表格既出现横向滚动条,又出现纵向滚动条?

横向滚动条 自然出现&#xff1f; 当表格所有列的宽度总和超过表格容器宽度时&#xff0c;el-table会默认出现横向滚动条。 比如&#xff0c;给每个<el-table-column>设置固定宽度&#xff0c;且他们相加超过了<el-table>宽度 就会触发 强制出现&#xff1f; 设…...

STL常用算法——C++

1.概述 2.常用遍历算法 1.简介 2.for_each 方式一&#xff1a;传入普通函数&#xff08;printf1&#xff09; #include<stdio.h> using namespace std; #include<string> #include<vector> #include<functional> #include<algorithm> #include…...

基于国产 FPGA+ 龙芯2K1000处理器+翼辉国产操作系统继电保护装置测试装备解决方案

0 引言 近年来&#xff0c;我国自主可控芯片在国家政策和政 府的支持下发展迅速&#xff0c;并在电力、军工、机械、 通信、电子、医疗等领域掀起了国产化替代之 风&#xff0c;但在芯片自主可控和国产化替代方面还有明 显的不足之处。 2022年我国集成电路进口量多 达 5 3…...

1.3 本书结构概览:从理论基础到实践案例的系统阐述

本书采用由浅入深、理论联系实践的结构设计&#xff0c;旨在为读者提供一个关于大模型与智能代理(Agent)技术的全面认知框架与实施路径。全书共分为十章&#xff0c;系统性地覆盖了从技术基础到企业落地的完整知识链条&#xff0c;现概述如下&#xff1a; 首先&#xff0c;第一…...

【FPGA开发】Vivado开发中的LUTRAM占用LUT资源吗

LUTRAM在Vivado资源报告中的解释 LUTRAM的本质与实现原理&#xff1a; LUTRAM不是一种独立的物理资源&#xff0c;而是LUT&#xff08;Look-Up Table&#xff09;的一种特殊使用方式。在Xilinx FPGA架构中&#xff0c;部分LUT单元可以被配置为小型分布式RAM&#xff08;也称为…...

【动手学强化学习】番外8-IPPO应用框架学习与复现

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明&#xff08;1&#xff09;MAPPO 与 IPPO 算法的区别在于什么地方&#xff1f;&#xff08;2&#xff09;IPPO 算法应用框架主要参考来源 2.2 应用步骤2.2.1 搭建基础环境2.2.2 IPPO 算法实例复现&am…...

C++ 的 输入输出流(I/O Streams)

什么是输入输出流 C 的输入输出操作是通过 流&#xff08;stream&#xff09; 机制实现的。 流——就是数据的流动通道&#xff0c;比如&#xff1a; 输入流&#xff1a;从设备&#xff08;如键盘、文件&#xff09;读取数据 → 程序 输出流&#xff1a;程序将数据写入设备&…...

Java 安全:如何防止 SQL 注入与 XSS 攻击?

Java 安全&#xff1a;如何防止 SQL 注入与 XSS 攻击&#xff1f; 在 Java 开发领域&#xff0c;安全问题至关重要&#xff0c;而 SQL 注入和 XSS 攻击是两种常见的安全威胁。本文将深入探讨如何有效防止这两种攻击&#xff0c;通过详细代码实例为您呈现解决方案。 一、SQL 注…...

leetcode day36 01背包问题 494

494 目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添加 - &…...

31Calico网络插件的简单使用

环境准备&#xff1a; 1、删除Flannel 2、集群所有node节点拉取所需镜像&#xff08;具体版本可以依据calico.yaml文件中&#xff09;&#xff1a; docker pull calico/cni:v3.25.0 docker pull calico/node:v3.25.0 docker pull calico/kube-controllers:v3.25.0一、安装Cali…...

进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程

进阶篇 第 5 篇&#xff1a;现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中&#xff0c;我们深入研究了经典的时间序列统计模型&#xff0c;如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛&#xff0c;但有…...

实用生活c语言脚本

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> // 清理临时文件目录 void clean_temp_directory() { const char* temp_dir "/tmp"; // 可自定义需要清理的目录 char command[1024]; …...

从零开始构建微博爬虫与数据分析系统

从零开始构建微博爬虫与数据分析系统 引言 社交媒体平台蕴含着海量的信息和数据&#xff0c;通过对这些数据的收集和分析&#xff0c;我们可以挖掘出有价值的见解。本文将详细介绍如何构建一个完整的微博爬虫和数据分析系统&#xff0c;从数据爬取、清洗、到多维度分析与可视…...

417. 太平洋大西洋水流问题

题目 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &#xff0c; heights…...

chili3d调试笔记8 打印零件属性

无效&#xff0c; 返回的是节点不是坐标啥的&#xff0c; 找他的属性 把document和selectednote&#xff08;空集&#xff09;传给handleshowproperty方法 怎么获得selectnotes和selectnotes的property值 有selectnotes运行这段就行了 明天再搞...

uniapp Vue2升级到Vue3,并发布到微信小程序的快捷方法

目录 前言&#xff1a;升级项目的两种方式步骤一、新建项目 【选择-默认模版】二、修改-pages.json三、补充-缺少的文件四、修改-Main.js按照 [官方文档-vue2升级vue3迁移指南](https://uniapp.dcloud.net.cn/tutorial/migration-to-vue3.html) 修改 五、升级-uni-ui扩展组件的…...

火山RTC 5 转推CDN 布局合成规则

实时音视频房间&#xff0c;转推CDN&#xff0c;文档&#xff1a; 转推直播--实时音视频-火山引擎 一、转推CDN 0、前提 * 在调用该接口前&#xff0c;你需要在[控制台](https://console.volcengine.com/rtc/workplaceRTC)开启转推直播功能。<br> * 调…...

Mujoco xml < sensor>

< sensor> jointposjointveljointactuatorfrcframequatgyroaccelerometerframeposframelinveltouchobjtype"site" objname"imu" 和site"imu"的区别python中与sensor有关的写法传感器名字索引第几个idid索引传感器名字传感器数量sensor中的…...

示例:spring xml+注解混合配置

以下是一个 Spring XML 注解的混合配置示例&#xff0c;结合了 XML 的基础设施配置&#xff08;如数据源、事务管理器&#xff09;和注解的便捷性&#xff08;如依赖注入、事务声明&#xff09;。所有业务层代码通过注解简化&#xff0c;但核心配置仍通过 XML 管理。 1. 项目结…...

同样的html标记,不同语言的文本,显示的字体和粗细会不一样吗

同样的 HTML 标记&#xff0c;在不同语言的文本下&#xff0c;显示出来的字体和粗细确实可能会不一样&#xff0c;原因如下&#xff1a; &#x1f30d; 不同语言默认字体不同 浏览器字体回退机制 CSS 里写的字体如果当前系统不支持&#xff0c;就会回退到下一个&#xff0c;比如…...

Linux进程6-alarm闹钟定时终止、raise发送信号、abort终止、pause挂起进程验证

目录 1.alarm函数 1.1关键点 1.2单个alarm函数定时 1.3两个alarm函数定时 2.raise函数 2.1核心行为‌ 2.2 raise与 kill 的区别 2.3程序&#xff1a; 3.abort函数 4.pause 函数 4.1 pause简单挂起 4.2父进程挂起&#xff0c;子进程发信号 1.alarm函数 函数原型&…...

SpringCloud组件—Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目&#xff0c;需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源&#xff0c;具体实现的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...

类加载器与jvm的内存

1. 类加载器与内存的关系 类加载器的字节码放在方法区&#xff08;元空间&#xff09;中&#xff0c;同时类加载器加载类后类的信息&#xff08;成员变量、成员方法及修饰符等&#xff09;存放在方法区中。类的信息所占内存的回收要同时满足两个条件&#xff1a;类的实例被回收…...

【C++】新手入门指南(下)

文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南&#xff08;上&#xff09;&#xff0c;继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…...

el-table中el-input的autofocus无法自动聚焦的解决方案

需求 有一个表格展示了一些进度信息&#xff0c;进度信息可以修改&#xff0c;需要点击进度信息旁边的编辑按钮时&#xff0c;把进度变为输入框且自动聚焦&#xff0c;当鼠标失去焦点时自动请求更新接口。 注&#xff1a;本例以vue2 element UI为例 分析 这个需求看着挺简单…...

vimplus 如何修改语言支持的版本,以及如何跳转路径

vimplus修改语言版本 默认的vimplus支持c的版本是17 如何修改我们需要修改.ycm_extra_conf.py文件&#xff0c;这个文件管理了我们的插件配置 找到 把他修改为你想要的版本 增添路径 把你安装的gcc位置提供给他&#xff0c;默认的目前比较老 这里都是他提前为我们准备的路…...

麒麟V10安装MySQL8.4

1、下载安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar2、解压 mkdir -p /opt/mysql tar -xvf mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql3、安装MySQL 3.1、卸载mariadb rpm -qa | grep mariadb rpm -e m…...

Varjo-XR3在UE5中,头显中间有一个方块一直显示

深色方块显示在屏幕中间的焦点区域中 屏幕中间的对焦区域中显示的黑色方块。 黑色方块是一个已知问题。它在 Varjo VRTemplate 中不可见&#xff0c;因为它使用具有推荐 VR 设置的前向渲染方法。 但是&#xff0c;如果你将延迟渲染方法与高级功能&#xff08;如 Lumen、Nani…...

FastText 模型文本分类实验:从零到一的实战探索

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类是一个基础而重要的任务&#xff0c;广泛应用于情感分析、主题识别、垃圾邮件过滤等多个场景。最近&#xff0c;我参与了一次基于 FastText 模型的文本分类实验&#xff0c;从数据预处理到模型构建、训练和评…...

不同经营性道路运输从业资格证申请条件全解析

在道路运输领域&#xff0c;获取相应的从业资格证是合法从事经营性运输工作的关键前提。不同类型的运输业务&#xff0c;如旅客运输、货物运输以及危险货物运输&#xff0c;对从业者有着不同的条件要求。 经营性道路旅客运输驾驶员 驾驶证年限&#xff1a;需取得相应的机动车…...

WHAT - 静态资源缓存穿透

文章目录 1. 动态哈希命名的基本思路2. 具体实现2.1 Vite/Webpack 配置动态哈希2.2 HTML 文件中动态引用手动引用使用 index.html 模板动态插入 2.3 结合 Cache-Control 避免缓存穿透2.4 适用于多环境的动态策略 总结 在多环境部署中&#xff0c;静态资源缓存穿透是一个常见问题…...

11、Refs:直接操控元素——React 19 DOM操作秘籍

一、元素操控的魔法本质 "Refs是巫师与麻瓜世界的连接通道&#xff0c;让开发者能像操控魔杖般精准控制DOM元素&#xff01;"魔杖工坊的奥利凡德先生轻抚着魔杖&#xff0c;React/Vue的refs能量在杖尖跃动。 ——以神秘事务司的量子纠缠理论为基&#xff0c;揭示DOM…...

crontab 定时备份 mysql 数据库

1、使用 mysqldump 命令备份数据 1.1 备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/backup/db.sql1.2 备份全部数据库的结构&#xff08;加 -d 参数&#xff09; mysqldump -uroot -p123456 -A -d > /data/backup/db.sql1.3 备份全部数据库的数据…...

数据库对象与权限管理-视图与索引管理

一、视图&#xff08;View&#xff09;管理 1. 视图的定义与本质 视图&#xff08;View&#xff09;是Oracle数据库中的逻辑表&#xff0c;它不直接存储数据&#xff0c;而是通过预定义的SQL查询动态生成结果集。视图的本质可以理解为&#xff1a; 虚拟表&#xff1a;用户可…...

德施曼重磅发布五大突破性技术及多款重磅新品,开启AI智能管家时代

当智能锁拥抱人文关怀&#xff0c;万物有灵便有了具象化的表达。 4月22日&#xff0c;智能锁领军品牌德施曼“万物有灵”2025全球新品发布会在乌镇隆重举行&#xff0c;为智能锁行业带来了AI时代的革新方案。 会上&#xff0c;德施曼创始人/CEO祝志凌重磅发布了五大突破性技术&…...

单元测试学习笔记(一)

自动化测试 通过测试工具/编程模拟手动测试步骤&#xff0c;全自动半自动执行测试用例&#xff0c;对比预期输出和实际输出&#xff0c;记录并统计测试结果&#xff0c;减少重复的工作量。 单元测试 针对最小的单元测试&#xff0c;Java中就是一个一个的方法就是一个一个的单…...

Rest Client插件写http文件直接发送请求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言&#x1f4cc; 插件介绍&#xff1a;&#x1f680; 安装方式&#xff1a;&#x1f4da; 使用示例&#xff1a;⚙️ 功能亮点&#xff1a; 前言 直接在 VSCode …...

LLM 论文精读(一)Scaling Laws for Neural Language Models

这篇文章是2020年发表的一篇LLM领域中非常重要的论文&#xff0c;由OpenAI发布&#xff0c;总结了LLM模型规模与训练数据token之间的比例关系&#xff0c;即我们熟知的 Scaling Laws&#xff0c;允许 通过观察小规模训练实验&#xff0c;提前预测大模型的效果表现&#xff0c;降…...

Spring AOP + Logback + MDC全链路日志追踪

1、背景 由于权限管理和安全规范&#xff0c;服务都部署到云上&#xff0c;只能通过日志系统查看日志。 然而&#xff0c;面对海量的日志数据&#xff0c;如何快速定位关键信息和调用链路是一个巨大的挑战。 2、方案调研 在 Spring Boot 中实现全链路日志追踪&#xff0c;核…...

SVT-AV1编码器初始化函数

一 函数解释 这个函数SVT-AV1编码器初始化的核心函数&#xff0c;负责配置编码器组件&#xff0c;分配资源并启动编码线程&#xff0c;以下时对每一行的详细解释。 函数签名和参数检查 EB_API EbErrorType svt_av1_enc_init(EbComponentType *svt_enc_component) { if (svt_enc…...

Unity 导出Excel表格

1.首先&#xff0c;需要导入EPPlus.dll&#xff1b;&#xff08;我这里用的是Unity 2017.3.0f3&#xff09; https://download.csdn.net/download/qq_41603955/90670669 2.代码如下&#xff1a; using UnityEngine; using UnityEditor; using System.IO; using OfficeOpenXm…...

Web前端开发技术——HTML5、CSS3、JavaScript

一、HTML 1.基本结构 <html lang "en"><head><meta charset"UTF-8"><meta name"Keywords" content""><meta name"Description" content""><title>Web网页标题</title&g…...

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

【华为HCIP | 华为数通工程师】821—多选解析—第十二页

多选727、某台路由器的输出信息如下所示,以下描述正确的有哪些选项? A、路由器Router ID为10.0.1.1 B、路由器Router ID为10.0.2.2。 C、本路由器的接口地址为10.0.12.2。 D、本路由器是DR。 解析:display ospf peer //获取的OSPF邻居信…...

Selenium 在爬取过程中,网络响应被退出的解决方案

我在使用 Selenium 爬取网站的时候&#xff0c;直接get url &#xff0c;却立马闪退&#xff0c;遇到了获取网络响应直接被退出的问题。 这通常是由于 反爬机制、浏览器检测 或 网络限制 导致的。 以下是 完整排查与解决方案&#xff1a; 1. 检查常见原因 问题类型典型表现可…...