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

AVFormatContext 再分析

说明 :将 avfromatContext 的变量依次打印分析,根据ffmpeg 给的说明,猜测,结合网上的文章字节写测试代码分析。

从常用到不常用依次分析

1. unsigned int nb_streams;

代表 avfromatContext 中 AVStream **streams 的个数

    /**
     * Number of elements in AVFormatContext.streams.
     *
     * Set by avformat_new_stream(), must not be modified by any other code.
     */
    unsigned int nb_streams;

//打印在解复用时候,avformatContext的主要参数
void PrintfDeMuxingAVFormatContextMainParamter(AVFormatContext* avformatContext) {if (avformatContext == NULL) {cout << "func PrintfDeMuxingAVFormatContextMainParamter error because AVFormatContext == nullptr  " << endl;return;}cout << "avformat中有的avstream的个数为:avformatContext->nb_streams = " << avformatContext->nb_streams << endl;}

2. int64_t bit_rate;

在 AVFormatContext 结构体中,‌bit_rate 字段表示媒体文件的全局平均比特率‌(单位为 bps,即 bits per second)

    /**
     * Total stream bitrate in bit/s, 0 if not
     * available. Never set it directly if the file_size and the
     * duration are known as FFmpeg can compute it automatically.
     */
    int64_t bit_rate;

2.1 含义再说明1

从说明中可以看出来,代表的是所有 stream 的 平均比特率。啥意思呢?比如这是一个mp4文件,既有视频也有音频,我们假设有一个视频两个音频(粤语和普通话),假设视频是300kbps,普通话音频是128kbps,粤语音频是100kbps。那么 AVFormatContext 中的 bit_rate就应该等于 300 +128+100 = 628kbps,注意单位是kbps。

// 遍历所有流,计算总比特率
int64_t total_bit_rate = 0;
for (int i = 0; i < avformat_ctx->nb_streams; i++) {AVStream *stream = avformat_ctx->streams[i];total_bit_rate += stream->codecpar->bit_rate;
}

2.2 含义再说明2,在TS下无效

0 if not available

这个意思是说,这个值有可能是0,代表不可使用。

部分封装格式(如 TS 流)可能不记录全局比特率,此时 bit_rate 字段无效

2.3 含义再说明3,当文件大小和duration都知道的时候,user不要设置,ffmepg会自动计算

Never set it directly if the file_size and the duration are known as FFmpeg can compute it automatically.

2.5 动态码率场景


VBR 编码的文件中,该字段仅代表平均值,无法反映瞬时码率波动

CBR 是 (恒定比特率)

VBR(可变比特率),

mp4文件只能是 VBR。

也就是说:如果我们解析的是mp4文件,那么这个值是平均值。无法反映瞬时码率波动

2.6 典型应用场景

  • 带宽估算‌:
    结合容器和流的比特率,判断网络传输是否满足实时播放需求56。
  • 文件分析工具‌:
    统计媒体文件的码率分布,辅助编码参数优化6。

3. int64_t duration

只能用于解复用,

是 ‌AVFormatContext 结构体‌的关键成员,用于表示 ‌媒体文件的总时长‌。其数据类型为 int64_t,单位为 ‌AV_TIME_BASE‌(即微秒的倒数,通常为 1,000,000)。

该字段在 ‌成功解析媒体文件流信息后‌(调用 avformat_find_stream_info())才会被正确赋值

    /**
     * Duration of the stream, in AV_TIME_BASE fractional
     * seconds. Only set this value if you know none of the individual stream
     * durations and also do not set any of them. This is deduced from the
     * AVStream values if not set.
     *
     * Demuxing only, set by libavformat.
     */
    int64_t duration;

主要使用场景,通过 duration 计算文件时长。

换算为秒‌:

double duration_sec = (double)avformatContext->duration / AV_TIME_BASE;
 

转换为时分秒格式‌:

int64_t total_us = avformatContext->duration + 5000;  // 四舍五入修正
int hours = total_us / (3600 * AV_TIME_BASE);
int mins = (total_us % (3600 * AV_TIME_BASE)) / (60 * AV_TIME_BASE);
int secs = (total_us % (60 * AV_TIME_BASE)) / AV_TIME_BASE;

常见问题与解决方案

问题原因解决方案
返回负值或极大值未正确解析流信息或文件不完整调用 avformat_find_stream_info() 前设置 max_analyze_duration 参数
单位换算错误未使用 AV_TIME_BASE 进行转换确保除以 AV_TIME_BASE(或使用 av_rescale_q() 函数)
时间精度丢失直接截断未四舍五入添加 5000 微秒偏移(如 +5000)后再计算

AVFormatContext *fmt_ctx = NULL;
avformat_open_input(&fmt_ctx, filename, NULL, NULL);  // 打开文件
fmt_ctx->max_analyze_duration = 5 * AV_TIME_BASE;     // 限制解析时长避免卡顿
avformat_find_stream_info(fmt_ctx, NULL);              // 解析流信息if (fmt_ctx->duration != AV_NOPTS_VALUE) {int64_t duration = fmt_ctx->duration + 5000;      // 修正精度int hours = duration / (3600 * AV_TIME_BASE);int mins = (duration % (3600 * AV_TIME_BASE)) / (60 * AV_TIME_BASE);int secs = (duration % (60 * AV_TIME_BASE)) / AV_TIME_BASE;printf("Duration: %02d:%02d:%02d\n", hours, mins, secs);
} else {printf("Duration unavailable\n");
}
avformat_close_input(&fmt_ctx);                       // 释放资源

适用场景

  • 媒体信息分析工具‌:如 ffprobe 使用该字段输出文件时长。
  • 播放器开发‌:用于显示进度条总时长。
  • 流媒体处理‌:结合 AVStream 中各流时长进行同步控制。

注意‌:在网络流或实时流中,duration 可能无法获取(值为 AV_NOPTS_VALUE),需动态计算

cout << "avformat中duration为:avformatContext->duration = " << avformatContext->duration << endl;double duration_sec = (double)avformatContext->duration / AV_TIME_BASE;
cout << "avformat中秒数为:duration_sec = " << duration_sec << endl;if (avformatContext->duration != AV_NOPTS_VALUE) {int64_t duration = avformatContext->duration + 5000;      // 修正精度int hours = duration / (3600 * AV_TIME_BASE);int mins = (duration % (3600 * AV_TIME_BASE)) / (60 * AV_TIME_BASE);int secs = (duration % (60 * AV_TIME_BASE)) / AV_TIME_BASE;printf("Duration: %02d:%02d:%02d\n", hours, mins, secs);
}else {printf("Duration unavailable\n");
}avformat中duration为:avformatContext->duration = 60024000
avformat中秒数为:duration_sec = 60.024
Duration: 00:01:00

4. char *url;

    /**
     * input or output URL. Unlike the old filename field, this field has no
     * length restriction.
     *
     * - demuxing: set by avformat_open_input(), initialized to an empty
     *             string if url parameter was NULL in avformat_open_input().
     * - muxing: may be set by the caller before calling avformat_write_header()
     *           (or avformat_init_output() if that is called first) to a string
     *           which is freeable by av_free(). Set to an empty string if it
     *           was NULL in avformat_init_output().
     *
     * Freed by libavformat in avformat_free_context().
     */
    char *url;

和之前的filename不同,url是没有长度限制的。

在解码时,通过 avformat_open_input 方法 会将url 记录到 AVFormatContext ,可能会nullptr。

在编码时,需要在 调用 avformat_write_header 方法之前设置。

   char * url =  avformatContext->url;cout << "avformat中duration为 url = " << url << endl;结果为:avformat中duration为 url = ./120/400_300_25.mp4

5. int64_t start_time;

    /**
     * Position of the first frame of the component, in
     * AV_TIME_BASE fractional seconds. NEVER set this value directly:
     * It is deduced from the AVStream values.
     *
     * Demuxing only, set by libavformat.
     */
    int64_t start_time;

组件第一帧的位置,以AV_TIME_BASE  为单位。 
切勿直接设置此值:它是从AVStream值推断出来的。

这玩意有啥用呢?表示该avformatContext 第一帧的开始时间,那么应该都是0。

可能的点:todo

如果我们从文件的中间位置读取的,那么这个值就不是0?

在网络流的时候用?

   int64_t starttime = avformatContext->start_time;cout << "avformat中duration为 starttime = " << starttime << endl;avformat中duration为 starttime = 0

6. 接下来都是非重点 AVCodec* audio_codec;

    /**
     * Forced audio codec.
     * This allows forcing a specific decoder, even when there are multiple with the same codec_id.
     * Demuxing: Set by user
     */
    AVCodec *audio_codec;

这里从翻译来看,意思是该变量是为了 音频的编解码。

允许在解码的时候,允许强制使用特定的解码器,即使存在多个具有相同codec_id的解码器

/**
 * Forced audio codec.
 * This allows forcing a specific decoder, even when there are multiple with the same codec_id.
 * Demuxing: Set by user
 * AVCodec* audio_codec;
 * 在 音频 编解码器 的时候使用,
 * 在解复用的时候,允许强制使用特定的解码器,即使存在多个具有相同codec_id的解码器
 * 我们使用test02测试
 */

avformatContext->audio_codec;cout << "avformatContext->audio_codec = " << avformatContext->audio_codec << endl;


 * 在 音频 编解码器 的时候使用,
 * 在解复用的时候,允许强制使用特定的解码器,即使存在多个具有相同codec_id的解码器

   AVCodec* audioavcodec = avformatContext->audio_codec;if (audioavcodec == nullptr) {cout << "audioavcodec == nullptr" << endl;}else {cout << "audioavcodec != nullptr  audioavcodec->id = " << audioavcodec->id << endl;}log 为:audioavcodec == nullptr

last

相关文章:

AVFormatContext 再分析

说明 &#xff1a;将 avfromatContext 的变量依次打印分析&#xff0c;根据ffmpeg 给的说明&#xff0c;猜测&#xff0c;结合网上的文章字节写测试代码分析。 从常用到不常用依次分析 1. unsigned int nb_streams; 代表 avfromatContext 中 AVStream **streams 的个数 /** …...

力扣hot100,739每日温度(单调栈)详解

时隔多久又遇到单调栈的题了&#xff0c;上次记得是接雨水的题&#xff0c;简单讲一下单调栈的适用场景和定义。 意义:看名字就知道单调栈是一个栈里面的数据是单调的 。 解决问题: 单调栈主要用于解决需要**快速找到某个元素附近更大或更小的元素**的问题&#xff0c;其核心…...

怎么检测代理IP延迟?如何选择低延迟代理?

在跨境电商、数据采集以及社交媒体管理等活动中&#xff0c;代理IP的延迟是评估其性能的关键指标之一。高延迟的代理IP可能显著影响任务效率&#xff0c;特别是在需要高并发或大量请求的情况下。本文将介绍几种测试海外代理IP延迟的方法。 一、使用Ping命令测试延迟 Ping命令…...

QEMU 10.0 发布

QEMU 10.0 于 2025 年 4 月 23 日发布。此版本包含 2800 多个提交&#xff0c;来自 211 位作者。以下是一些主要的更新内容&#xff1a; CPU 和主板支持增强 x86 架构&#xff1a;优化了字符串操作指令&#xff0c;显著缩短启动时间。新增了 Intel Clearwater Forest 和 Sierra…...

C++和Java该如何选择?

我真诚的建议你选择C。因为国内Java程序员内卷太严重了&#xff0c;某些公司发布一个Java岗位&#xff0c;立刻就有几百人打招呼&#xff1b;而发布一个C岗位&#xff0c;打招呼的人数就那么十几个。 要知道&#xff0c;无论什么时候&#xff0c;只要你能够学得动C&#xff0c…...

Javase 基础入门 —— 06 final + 单例

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 final 关…...

web 开发中,前端部署更新后,该怎么通知用户刷新

web 开发中&#xff0c;前端部署更新后&#xff0c;该怎么通知用户刷新&#xff1f; 浏览器为什么存在刷新按钮&#xff1f;&#x1f518; 因为需要重新加载js&#xff0c;css&#xff0c;html。但为何需要重新加载这些东西&#xff1f;直白点说这些东西其实就是一个文档&…...

LaTex、pdfLaTex、XeLaTex和luaLaTex的区别和联系

之前一直搞不懂这些乱七八糟的Tex到底有啥区别&#xff0c;不同引擎不同编译器换来换去&#xff0c;查了些资料又问了下AI&#xff0c;总算是搞懂了。 大概是这样&#xff0c;很久以前有人写了个Tex排版引擎&#xff0c;输入一些代码命令&#xff0c;输出dvi文件&#xff08;设…...

深入解析 npm 与 Yarn:Node.js 包管理工具对比与选型指南

在 Node.js 生态中&#xff0c;依赖管理是项目开发的核心环节。npm&#xff08;Node Package Manager&#xff09;和 Yarn 作为两大主流包管理工具&#xff0c;虽目标一致但各有特色。本文将从技术实现、使用场景、生态整合等维度深度对比&#xff0c;助你选择更适合的工具。​…...

PDF嵌入图片

所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>9.0.0</version><type>pom</type> </dependency>源码 /*** PDF工具*/ public class PdfUtils {/*** 嵌入图…...

Coding Practice,48天强训(24)

Topic 1&#xff1a;判断是不是平衡二叉树&#xff08;递归&#xff09; 判断是不是平衡二叉树_牛客题霸_牛客网 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&…...

技术分享 | Oracle-RAC修改IP信息

本文为墨天轮数据库管理服务团队第61期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问胡振兴&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 在生产中有时候会遇到网络变更&#xff0c;Oracle RAC IP信息更换等情况&…...

北京工业大学25计专上岸经验分享

1.个人情况介绍 本科就读于河北双非&#xff0c;专业为计算机科学与技术&#xff0c;四级三次498&#xff0c;六级两次460&#xff0c;拿过几次校级奖学金&#xff0c;竞赛经历有蓝桥杯国三、数学竞赛省二。本科成绩排名靠前&#xff0c;保研保7排8&#xff0c;遗憾选择考研继…...

rabbitmq常用命令

目录 1.查看集群状态 2.查看消息对列的堆积 3.重启mq服务 4.清理mq队列消息 1.查看集群状态 rabbitmqctl cluster_status 2.查看消息对列的堆积 rabbitmqctl list_queues rabbitmqctl list_queues | grep -v 0$ 3.重启mq服务 systemctl status rabbitmq-server.servic…...

Spring Cloud Alibaba 整合 Sentinel:实现微服务高可用防护

一、Sentinel 简介 Sentinel 是阿里巴巴开源的面向分布式服务架构的流量控制组件&#xff0c;主要提供以下核心功能&#xff1a; 流量控制&#xff1a;针对不同的调用关系&#xff0c;以不同的运行指标&#xff08;如 QPS、线程数、系统负载等&#xff09;为基准&#xff0c;对…...

机器人抓取位姿检测——GRCN训练及测试教程(Pytorch)

机器人抓取位姿检测——GRCN训练及测试教程(Pytorch) 这篇文章主要介绍了2020年IROS提出的一种名为GRCN的检测模型,给出了代码各部分的说明,并给出windows系统下可以直接复现的完整代码,包含Cornell数据集。 模型结构图 github源码地址:https://github.com/skumra/robo…...

《一键式江湖:Docker Compose中间件部署108式》开篇:告别“配置地狱”,从此笑傲云原生武林!》

&#xff08;&#x1f5e1;️江湖险恶&#xff0c;少侠可曾受困&#xff1f;&#xff09; 深夜&#x1f319;&#xff0c;你盯着屏幕泛红的终端报错&#xff0c;第3次从GitHub某个无名仓库扒下残缺的docker-compose.yaml&#xff0c; 却发现&#xff1a; RabbitMQ连不上&#…...

C语言内敛函数

目录 1、内敛函数的定义 2、内敛函数的特点 2.1 减少函数调用开销 2.2 代码膨胀 2.3 编译器决定 2.4 适用于小型函数 3、示例 4、注意事项 在C语言中&#xff0c;内敛函数&#xff08;Inline Function&#xff09;是一种通过编译器优化来减少函数调用开销的机制。它通过…...

DAY8-GDB调试及打桩

GDB打桩 1.类成员函数打桩 // example1.cpp #include <iostream>class Calculator { public:int add(int a, int b) {return a b;} };int main() {Calculator calc;std::cout << "Result: " << calc.add(2, 3) << std::endl;return 0; }(…...

三、UI自动化测试03--操作方法API

目录 一、元素操作⽅法二、浏览器操作⽅法1. Part1: 设置最⼤化/⼤⼩/位置扩展: Web/APP 项⽬⻚⾯布局坐标系示意2. Part2: 后退/前进/刷新3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址 三、获取元素信息⽅法1. Part1: 获取⼤⼩/⽂本/属性值2. Part2: 判断元素是否可⻅/可⽤/可…...

人工智能—— K-means 聚类算法

目录 摘要 16 K-means 聚类算法 16.1 本章工作任务 16.2 本章技能目标 16.3 本章简介 16.4 编程实战 16.5 本章总结 16.6 本章作业 本章已完结&#xff01;&#xff01;&#xff01; 摘要 本章实现的工作是&#xff1a;首先采用Python语言读取样本数据(学生的语文、数…...

使用XMLSpy校验xml是否合法

# 背景说明 近期大部分地区都在做或将要做数据迁移&#xff0c;基本所有产品的迁移工具底层都依赖了XSD文件对迁移的结构化数据对应XML文件进行初步校验&#xff0c;但有些XSD的问题提示不太容易理解&#xff0c;正好N年前我做XX数据上报时用过XMLSpy可以直接校验每个xml是否合…...

游戏引擎学习第248天:清理数据块显示

启动代码&#xff0c;构建游戏&#xff0c;回顾并为今天的工作做好准备 今天还需要做一些额外的调整。具体来说&#xff0c;我们希望能编辑一些调试值&#xff0c;而这个结构在当前的调试系统中已经有了&#xff0c;所以今天主要是清理一些无关的部分&#xff0c;并进行一些连…...

基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、基于pytest单元测试框架的规则 1.1 模块名&#xff08;即文件名&#xff09;必须以test_开头或者_test结尾 1.2 类名必须以Test开头且不能有init方法 1.3 用…...

腾讯 Kuikly 正式开源,了解一下这个基于 Kotlin 的全平台框架

在 3月的时候通过 《腾讯 TDF 即将开源 Kuikly 跨端框架&#xff0c;Kotlin 支持全平台》 我们大致知道了 Kuikly 的基本情况&#xff0c;Kuikly 是一个面向终端技术栈的跨端开发框架&#xff0c;完全基于kotlin语言开发&#xff0c;提供原生的性能和体验。 按照官方的说法&…...

【c++】AVL树模拟实现

简介 AVL树是最先被发明出来的自平衡二叉查找树&#xff0c;在1962由前苏联科学家G. M. Adelson-Velsky和E. M. Landis在论文中发表。AVL树中引入了平衡因子&#xff0c;每一个节点都有一个平衡因子&#xff08;一般是右子树高度 - 左子树高度&#xff09;&#xff1b;AVL树要…...

具身智能模型开发训练技法之仿真平台动捕数据重定向

具身智能大模型的开发与训练高度依赖大量的数据输入&#xff0c;形象地说&#xff0c;如同需要持续的“数据喂养”。只有经过不断地进行数据积累和模型训练&#xff0c;具身智能大模型才能够实现自主感知、自主决策以及自主执行的完整进程。在多样化的数据形态中&#xff0c;真…...

手撕——贪吃蛇小游戏(下)

引言 上一章介绍了实现贪吃蛇小游戏必备的知识点。 这章&#xff0c;让我们一起开启手搓核弹之旅吧。 先附上贪吃蛇代码的git&#xff1a;贪吃蛇小游戏_4_23 Shown_shuai/learn_c - 码云 - 开源中国 (gitee.com) 上一章的窗口&#xff1a; 手撕——贪吃蛇小游戏&#xff0…...

C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载

在 C 中&#xff0c;类的默认成员函数是编译器自动生成的重要机制&#xff0c;合理利用这些函数可以简化代码编写&#xff0c;同时避免资源管理错误。本文将从构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心内容展开&#xff0c;结合具体案例深入解析。 一、默认成员…...

【Jupyter 启动时如何指定目录】

你在 Windows 系统下运行 jupyter notebook 时&#xff0c;遇到了 Jupyter Notebook 打开的目录不是你想要的 E:\desktop\yolo-study&#xff0c;而是其他路径。这可能是由于 Jupyter 的默认配置问题 或 启动路径问题 导致的。 &#x1f50d; 原因分析 Jupyter 默认根目录设置错…...

PostSwigger Web 安全学习:CSRF漏洞2

CSRF 漏洞学习网站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF 漏洞&#xff1a;SameSite相关绕过 当浏览器访问服务器时&#xff0c;服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他…...

openharmony—4.1 softbus_tool 工具编译使用测试笔记(持续更新)

​ 相关资料&#xff1a; 1.communication_dsoftbus: 暂无描述 - Gitee.com 2.dsoftbus_tool: OpenHarmony 分布式软总线样例 3.OpenAtom OpenHarmony​ 4.OpenAtom OpenHarmony 编译该demo之前需要大家搭建拉取openharmony源码&#xff0c;搭建开发环境&#xff0c;同时全…...

关于 Web 服务器的五个案例

一、案例题目&#xff1a; 1.多 IP 访问多网站&#xff08;在 RHCE 练习二中的实验二&#xff09; 2.多端口访问多网站 3.多域名访问多网站 4.虚拟目录和用户控制 5.https/443 二、案例实验 2.多端口访问多网站 ① 开始还是先关闭我们的防火墙以及 selinux [rootserve…...

第十二章-PHP文件上传

第十二章-PHP文件上传 一&#xff0c;文件上传原理 一、HTTP协议与文件上传 1. 请求体结构 当表单设置enctype"multipart/form-data"时&#xff0c;浏览器会将表单数据编码为多部分&#xff08;multipart&#xff09;格式。 Boundary分隔符&#xff1a;随机生成的…...

shell脚本部署disu博客

#!/bin/bash #关闭防火墙 systemctl status firewalld &>/dev/null if [ $? -ne 0 ];then systemctl stop firewalld &>/dev/null else echo “firewalld is disabled” fi #关闭selinux filegetenforce if [ “$fine” “Disabled” ];then echo “firewalld…...

NdrpPointerUnmarshallInternal函数分析之pFormatPointee指针的确定

第一部分&#xff1a; 0: kd> p RPCRT4!NdrPointerUnmarshall0x29: 001b:77c46ce4 e8b6f6ffff call RPCRT4!NdrpPointerUnmarshall (77c4639f) 0: kd> t Breakpoint 4 hit RPCRT4!NdrpPointerUnmarshall: 001b:77c4639f 55 push ebp 0: kd> …...

STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)

第 1 章 延时&#xff1a;嵌入式系统的时间控制基石 1.1 延时基础&#xff1a;从概念到硬件实现 1.1.1 什么是延时&#xff1f; 定义&#xff1a;延时是通过软件或硬件手段&#xff0c;使程序执行过程中暂停指定时间&#xff0c;再继续后续操作的技术。本质是对时间的精确或…...

2025 FIC wp

这次比赛计算机和手机大部分题目都比较常规 第一和第四部分有点让人摸不着头脑 比赛的时候第一部分有四个题没出 第四部分基本都没怎么出 现在复盘一下 把我当时做题的心得和获取的新知识记录一下 互联网取证的部分就先学习一下别的师傅 检材 链接&#xff1a;https://pan.bai…...

STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换

1、标准库SPI初始化 这是标准库的SPI初始化配置 2、HAL库SPI初始化 这是HAL库函数的SPI初始化配置 可以看出&#xff0c;基本一直&#xff0c;除了 基本的io口配置区别&#xff0c;其他主要的读写函数不用动的。 3、SPI发送函数_替换对比 /* SPI写入一个字节 */ void SP…...

Cesium 三维场景中通过自定义着色器实现多种特效(纹理、光带、点光源、反射)

整体功能概述 构建一个基于 Cesium 的三维场景&#xff0c;加载三维瓦片集模型&#xff0c;同时提供多种特效&#xff0c;像夜景纹理、上下扫光、点光源以及反射纹理等&#xff0c;利用 dat.gui 库创建交互界面。 代码详解 白膜特效 nightFs.glsl void fragmentMain(Fragm…...

Java学习--HashMap

HaspMap是Java集合框架中最重要、最常用的数据结构之一。其基于哈希表实现了Map接口&#xff0c;在Java1.8的版本中&#xff0c;其采用了“数组链表红黑树”的混合结构&#xff0c;底层代码如下&#xff1a; transient Node<K,V>[] table; // 哈希桶数组 static class N…...

Monorepo、Lerna、Yarn Workspaces、pnpm Workspaces 用法

Monorepo 介绍 Monorepo是一种方案&#xff0c;而非具体的工具。 Monorepo指的是将多个相关的项目或模块放在同一个代码仓库中进行管理的方式。这种方案有以下优点&#xff1a; 方便代码共享&#xff1a;不同项目或模块之间可以方便地共享代码、组件、工具函数等&#xff0c…...

JVM指令手册:深入理解字节码执行机制

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 Java虚拟机&#xff08;JVM&#xff09;作为Java生态的核心执行引擎&#xff0c;其指令系统是理解程序底层运行机制的关键。本手册将系统解析JVM指令集…...

springboot logback 默认加载配置文件顺序

在 Spring Boot 应用中&#xff0c;Logback 默认加载配置文件的顺序遵循特定的规则。以下是详细的加载顺序和优先级说明&#xff1a; 1. 默认配置文件加载顺序 Logback 在 Spring Boot 中会按以下顺序查找并加载配置文件&#xff08;优先级从高到低&#xff09;&#xff1a; l…...

用 Nodemon 解决 npm run serve 频繁重启服务

Nodemon 是一个基于 Node.js 构建的开发工具&#xff0c;专为帮助开发者自动监控项目文件的更改而设计。每当文件发生变更时&#xff0c;Nodemon 会自动重启 Node.js 服务器&#xff0c;无需手动停止并重启。这对于提升开发速度、减少人工操作非常有帮助&#xff0c;尤其适用于…...

WEB安全--社会工程--SET钓鱼网站

1、选择要钓鱼的网站 2、打开kali中的set 3、启动后依次选择&#xff1a; 4、输入钓鱼主机的地址&#xff08;kali&#xff09;和要伪装的网站域名&#xff1a; 5、投放钓鱼网页&#xff08;服务器域名:80&#xff09; 6、获取账号密码...

系统架构师---基于规则的系统架构

引言 在业务规则高度动态且需快速响应的系统中&#xff0c;‌基于规则的系统架构风格&#xff08;Rule-Based System Architecture Style&#xff09;‌提供了一种将业务逻辑与代码解耦的标准化范式。从保险理赔的自动化审核到金融风控的实时拦截&#xff0c;规则引擎已成为企…...

嵌入式软件--stm32 DAY 4 中断系统

1.课后练习 学了这么长时间&#xff0c;现在让我们第一次做练习。 1.1往返流水灯 1.1.1 LED1-LED2-LED3-LED2-LED1循环 &#xff08;1&#xff09;工程准备 复制上一个寄存器实现的工程文档&#xff0c;删减修改我们正要实现的工程。为了区别练习和学习工程&#xff0c;我们…...

android开发制作aosp系统签名文件给普通apk签名使用

platform.pk8和platform.x509.pem复制出来放在同一目录下 将AOSP源码路径下build\target\product\security\platform.pk8和platform.x509.pem复制出来放在同一目录下 新开一个ternimal窗口执行下面命令&#xff0c;生成platform.pem文件 openssl pkcs8 -in platform.pk8 -info…...

AVL树的介绍与学习

目录 1.前言 2.AVL树 3.AVL树的插入 平衡因子的更新 更新停止的条件 旋转 1.前言 在学习了二叉搜索树&#xff0c;set和map之后&#xff0c;我们接下来趁热打铁&#xff0c;继续学习AVL树。 2.AVL树 1.AVL树具有二叉搜索树的性质&#xff0c;但是它的左右子树的高度差不…...