AVFormatContext 再分析二
说明 :将 avfromatContext 的变量依次打印分析,根据ffmpeg 给的说明,猜测,结合网上的文章字节写测试代码分析二。
37 AVInputFormat *iformat;
/**
* The input container format.
*
* Demuxing only, set by avformat_open_input().
*/
ff_const59 struct AVInputFormat *iformat;
AVInputFormat 再分析-CSDN博客
38 AVFormatInternal *internal; 对开发者隐藏,但是对于阅读ffmpeg源码有用。
/**
* An opaque field for libavformat internal usage.
* Must not be accessed in any way by callers.
*/
AVFormatInternal *internal;
*libavformat内部使用的不透明字段。
*使用不得以任何方式访问。
AVFormatContext 中的 AVFormatInternal *internal
字段是 FFmpeg 内部用于存储与解封装/封装过程相关的私有状态数据的结构体7。以下是其核心特性的总结:
1. 设计目的
- 内部数据隔离:
internal
封装了AVFormatContext
运行时的临时状态和中间数据,避免用户直接操作导致的结构不稳定或版本兼容性问题7。 - 模块化扩展:通过独立结构体管理内部状态,方便 FFmpeg 在不同版本中扩展或修改内部实现逻辑,而无需修改
AVFormatContext
的公开接口7。
2. 关键特性
-
不透明性:
AVFormatInternal
的具体定义未在公共头文件(如avformat.h
)中公开,开发者无法直接访问其内部字段7。- 所有操作需通过 FFmpeg 提供的 API 完成(如
avformat_open_input()
、av_read_frame()
等)78。
-
生命周期管理:
internal
的内存分配与释放由 FFmpeg 内部自动完成,用户无需手动干预(例如在调用avformat_close_input()
时会自动清理)7。- 初始化时,
internal
通常通过avformat_alloc_context()
函数间接创建7。
3. 关联功能
- 流探测缓冲:缓存输入数据的部分内容,用于格式探测(如
avformat_find_stream_info()
中的流参数分析)8。 - 中间状态存储:
- 封装/解封装过程中的临时数据包队列3。
- 时间戳校正、流交错(interleaving)等算法所需的上下文信息38。
4. 开发者注意事项
- 禁止直接访问:由于 FFmpeg 不保证
AVFormatInternal
的跨版本二进制兼容性,直接操作其字段可能导致程序崩溃或未定义行为7。 - 调试限制:若需调试内部状态,通常需结合 FFmpeg 源码中的日志输出或使用调试器跟踪相关函数调用7。
与类似字段的对比
字段 | 作用域 | 可见性 | 管理方式 |
---|---|---|---|
priv_data | 格式私有数据 | 半公开(需API) | 由 AVInputFormat/AVOutputFormat 管理14 |
internal | 全局运行时 | 完全内部 | FFmpeg 内部自动管理7 |
此设计模式体现了 FFmpeg 对“接口稳定”和“实现灵活”的平衡,确保用户仅通过规范 API 即可安全使用核心功能78。
39.AVIOInterruptCB interrupt_callback
/**
* Custom interrupt callbacks for the I/O layer.
*
* demuxing: set by the user before avformat_open_input().
* muxing: set by the user before avformat_write_header()
* (mainly useful for AVFMT_NOFILE formats). The callback
* should also be passed to avio_open2() if it's used to
* open the file.
*/
AVIOInterruptCB interrupt_callback;
/**
* Callback for checking whether to abort blocking functions.
* AVERROR_EXIT is returned in this case by the interrupted
* function. During blocking operations, callback is called with
* opaque as parameter. If the callback returns 1, the
* blocking operation will be aborted.
*
* No members can be added to this struct without a major bump, if
* new elements have been added after this struct in AVFormatContext
* or AVIOContext.
*/
typedef struct AVIOInterruptCB {
int (*callback)(void*);
void *opaque;
} AVIOInterruptCB;
AVFormatContext 中的 interrupt_callback
字段用于实现自定义 I/O 中断控制机制,主要解决网络流处理时的阻塞问题。以下是其核心功能与使用方法的总结:
1. 功能与作用
- 阻塞中断:在
avformat_open_input()
或av_read_frame()
等操作中,若因网络延迟、设备断开或无数据导致长时间阻塞,可通过回调函数强制终止等待12。 - 超时控制:允许开发者设置最大等待时间,避免程序无响应(如 RTSP 流超时断开)48。
- 跨协议兼容:适用于 RTSP、RTMP 等网络协议,弥补某些协议(如 RTMP)不支持超时参数的缺陷16。
2. 结构体定义
interrupt_callback
是 AVFormatContext
的成员,类型为 AVIOInterruptCB
,包含两个关键字段:
-
callback
:函数指针,指向用户定义的中断检测函数。 -
opaque
:用户自定义的上下文指针(如对象实例、计时器等),传递给回调函数。
typedef struct AVIOInterruptCB {int (*callback)(void*); // 中断检测函数void *opaque; // 用户上下文数据
} AVIOInterruptCB;
3. 回调函数实现
回调函数需返回 1
(中断) 或 0
(继续等待)。典型实现逻辑:
- 通过
opaque
获取上下文数据(如超时起始时间)。 - 计算当前时间与起始时间的差值。
- 若超过预设阈值(如 5 秒),返回
1
终止操作。
// 示例:超时检测回调
int interrupt_cb(void *ctx) {int64_t start_time = *(int64_t*)ctx; // 通过 opaque 传递起始时间int64_t current_time = av_gettime(); // 获取当前时间(微秒)return (current_time - start_time > 5000000) ? 1 : 0; // 超过5秒则中断
}
4. 设置步骤
- 分配上下文:创建
AVFormatContext
实例。 - 绑定回调:设置
interrupt_callback
的callback
和opaque
。 - 启动计时:在关键操作前记录起始时间(如
av_gettime()
)。 - 打开输入流:调用
avformat_open_input()
,阻塞操作将触发回调检测。
AVFormatContext *fmt_ctx = avformat_alloc_context();
int64_t timeout_start = av_gettime(); // 记录起始时间// 设置回调函数及上下文
fmt_ctx->interrupt_callback.callback = interrupt_cb;
fmt_ctx->interrupt_callback.opaque = &timeout_start;// 打开输入流(如 RTSP)
if (avformat_open_input(&fmt_ctx, "rtsp://example.com", NULL, NULL) < 0) {// 错误处理
}
5. 注意事项
- 协议差异:对于 RTSP,可同时设置
stimeout
参数(单位:微秒)增强超时控制68:cCopy Code
AVDictionary *options = NULL; av_dict_set(&options, "stimeout", "2000000", 0); // 2秒超时 avformat_open_input(&fmt_ctx, url, NULL, &options);
- 线程安全:回调函数需确保线程安全,避免竞态条件8。
- 资源释放:无需手动释放
interrupt_callback
,其生命周期与AVFormatContext
绑定5。
6. 典型问题与调试
- 回调未触发:检查是否在
avformat_open_input()
前正确设置回调8。 - 误中断:调整超时阈值,或在回调中增加状态判断(如网络重连尝试次数)6。
40 回调函数 io_open
谨慎
/**
* A callback for opening new IO streams.
*
* Whenever a muxer or a demuxer needs to open an IO stream (typically from
* avformat_open_input() for demuxers, but for certain formats can happen at
* other times as well), it will call this callback to obtain an IO context.
*
* @param s the format context
* @param pb on success, the newly opened IO context should be returned here
* @param url the url to open
* @param flags a combination of AVIO_FLAG_*
* @param options a dictionary of additional options, with the same
* semantics as in avio_open2()
* @return 0 on success, a negative AVERROR code on failure
*
* @note Certain muxers and demuxers do nesting, i.e. they open one or more
* additional internal format contexts. Thus the AVFormatContext pointer
* passed to this callback may be different from the one facing the caller.
* It will, however, have the same 'opaque' field.
*/
int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url,
int flags, AVDictionary **options);
目前看的信息是:avformatContext 的 io_open 回调函数 在默认情况下叫 io_open_default,在解复用的 avformat_open_input 方法中一定会调用。
io_open_default
是 FFmpeg 中用于初始化输入/输出上下文 (AVIOContext
) 的关键函数,主要在解封装流程中处理协议检测与连接。以下是其核心机制与作用解析:
一、功能定位
-
协议初始化入口
在avformat_open_input()
调用流程中,io_open_default
作为默认的 I/O 上下文初始化函数,负责根据输入 URL 的协议类型(如 HTTP、HLS、文件)创建对应的AVIOContext
,并绑定底层协议实现1。 -
协议白名单校验
通过调用ffio_open_whitelist
,该函数会校验协议是否在允许范围内,防止加载未授权的协议实现(如自定义或非标准协议),确保安全性1。 -
多层封装调用链
其执行链路为:
avformat_open_input
→init_input
→io_open_default
→ffio_open_whitelist
→ffurl_open_whitelist
→ffurl_connect
→ 具体协议实现(如http_open
)1。
最终通过系统调用(如socket
)建立网络连接或打开本地文件12。
二、实现机制
-
协议适配层
io_open_default
通过协议前缀(如http://
、file://
)匹配对应的URLProtocol
实现(如ff_http_protocol
),并初始化协议上下文 (URLContext
),最终关联到AVIOContext
的opaque
字段15。 -
缓冲与回调设置
自动配置读写缓冲区大小,并设置默认的read_packet
、write_packet
等回调函数,确保数据通过协议层高效传输至解封装模块17。 -
错误处理
若协议检测失败(如 URL 无效或协议未注册),函数返回错误码并终止后续流程,触发avformat_open_input
的异常处理逻辑1。
三、应用场景
- 标准协议处理:自动处理 HTTP、RTMP、HLS 等协议连接的初始化,无需手动创建
AVIOContext
15。 - 安全限制场景:通过白名单机制限制可访问的协议类型,适用于需严格管控输入源的场景(如嵌入式设备)1。
四、扩展性
- 自定义协议支持:若需支持私有协议,需绕过
io_open_default
,通过avio_alloc_context
手动创建AVIOContext
并注册自定义协议实现37。
41 回调函数io_close
/**
* A callback for closing the streams opened with AVFormatContext.io_open().
*/
void (*io_close)(struct AVFormatContext *s, AVIOContext *pb);
42 int io_repositioned;
/**
* IO repositioned flag.
* This is set by avformat when the underlaying IO context read pointer
* is repositioned, for example when doing byte based seeking.
* Demuxers can use the flag to detect such changes.
*/
int io_repositioned;
io_repositioned
是 FFmpeg 中 AVFormatContext
结构体的一个标志字段,用于指示底层 I/O 上下文的读指针是否发生了位置重置。其核心作用与应用场景如下:
一、功能定义
-
标志位作用
io_repositioned
由 FFmpeg 的解封装模块(avformat
)自动设置,主要用于标识底层 I/O 上下文(如AVIOContext
)的读指针是否被显式重定位。例如,在基于字节的随机访问(byte-based seeking)时,该标志会被触发。 -
触发条件
当调用av_seek_frame()
或类似函数导致底层 I/O 缓冲区的读指针位置发生变化时,io_repositioned
会被设置为非零值,表示发生了位置重置。
二、应用场景
-
解封装逻辑适配
解复用器(Demuxer)可通过检查io_repositioned
标志判断是否需要重新同步内部状态(如重新解析流头信息或调整时间戳计算逻辑),以应对底层 I/O 位置突变带来的数据不一致问题。 -
性能优化
在处理网络流或大文件时,通过检测io_repositioned
标志,可避免无效的缓存数据读取,确保后续操作基于最新的 I/O 位置执行1。
三、实现关联
- 与
AVIOContext
的交互
io_repositioned
直接关联AVIOContext
的seek
操作,若用户代码通过avio_seek()
手动调整读指针位置,也会触发该标志的更新
打印值是0
avformatContext->io_repositioned;cout << "avformatContext->io_repositioned = " << avformatContext->io_repositioned << endl;
43 const uint8_t *key; 作用未知
const uint8_t *key;
int keylen;
44 int keylen;作用未知
const uint8_t *key;
int keylen;
45 int max_chunk_duration;
/**
* Max chunk time in microseconds.
* Note, not all formats support this and unpredictable things may happen if it is used when not supported.
* - encoding: Set by user
* - decoding: unused
*/
int max_chunk_duration;
用于设置流媒体传输中的最大块持续时间。在FFmpeg的RTMP协议中,这个参数定义了每个RTMP消息的最大持续时间。如果超过这个时间,FFmpeg会自动将数据分成多个块进行传输,以确保流媒体的稳定性和效率。
max_chunk_duration的作用和重要性
- 稳定性:通过限制每个数据块的大小,max_chunk_duration有助于确保流媒体的稳定性。如果数据块过大,可能会导致网络延迟或丢包,影响观看体验。
- 效率:合理设置max_chunk_duration可以提高传输效率,减少缓冲时间,提升用户体验。
- 兼容性:不同的设备和网络环境对数据块的大小有不同的要求,合理设置max_chunk_duration可以增强兼容性。
如何设置max_chunk_duration
在FFmpeg的命令行中,可以通过-max_chunk_duration
选项来设置
46
47
48
49
50
相关文章:
AVFormatContext 再分析二
说明 :将 avfromatContext 的变量依次打印分析,根据ffmpeg 给的说明,猜测,结合网上的文章字节写测试代码分析二。 37 AVInputFormat *iformat; /** * The input container format. * * Demuxing only, set by avfo…...
leetcode0096. 不同的二叉搜索树-medium
1 题目:不同的二叉搜索树 官方标定难度:中 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出…...
【科研绘图系列】R语言绘制世界地图(map plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出图片系统信息介绍 【科研绘图系列】R语言绘制世界地图(map plot) 加载R包 library(ggmap) library(RColorBrewer) library(pals) …...
【原创】风云扫描王[特殊字符]OCR识别翻译!证件照
📣文字识别,文字提取,扫描翻译,证件扫描,表格识别,PDF加水印等一体的扫描应用。扫描任何东西,包括文件、纸质笔记、收据和书籍,把它们扫描成清晰的PDF文件和图像。使用OCR技术将图像…...
Fabrice Bellard(个人网站:bellard.org)介绍
Fabrice Bellard 是法国人,国际知名程序员。 Fabrice Bellard(个人网站:bellard.org)是计算机领域最具影响力的程序员之一,其贡献跨越多个技术领域并持续推动开源生态发展。以下是其关键成就与技术贡献的梳理&…...
Linux电源管理(5)_Hibernate和Sleep功能介绍
原文:Linux电源管理(5)_Hibernate和Sleep功能介绍 1. 前言 Hibernate和Sleep两个功能是Linux PM的核心功能,它们的目的是类似的:暂停使用——>保存上下文——>关闭系统以节电>恢复系统——>恢复上下文——>继续使用。 本文…...
【C/C++】Linux的futex锁
文章目录 Linux Futex1. 概述2. 核心设计思想3. Futex 系统调用接口4. 核心操作4.1 阻塞等待 (FUTEX_WAIT)4.2 唤醒线程 (FUTEX_WAKE)4.3 进阶操作 5. Futex 的使用场景5.1 实现用户态互斥锁 (Mutex)5.2 实现条件变量 (Condition Variable) 6. Futex 的优缺点7. Futex 与传统同…...
ChatGPT:重塑人工智能交互范式的破晓之作
2022年11月30日,总部位于旧金山的研究公司OpenAI正式发布了ChatGPT——一款以病毒式传播速度席卷全球的AI聊天机器人。它不仅能像人类一样生成内容、回答问题和解决问题,更在推出后的两个月内吸引了超过1亿月活跃用户,刷新了消费级技术应用的…...
java面向对象编程【高级篇】之特殊类
目录 🚀前言🌟final关键字💯常量 🦜单例类💯饿汉式单例类💯懒汉式单例类 ✍️枚举类🐍抽象类💯应用场景💯模版方法设计模式 ⚙️接口💯实现类💯接…...
JVM 一文详解
目录 JVM 简介 JVM 中的内存区域划分 1. 堆(一个进程只有一份 ------ 线程共享) 2. 栈(一个进程可以有 N 份 ------ 线程私有) Java 虚拟机栈: 本机方法栈: 3. 程序计数器(一个线程可以…...
PVD中断检测掉电
文章目录 概述配置掉电擦写注意 概述 STM32 PVD功能具体可以检测到上电、掉电瞬间,其处理方式有中断响应及事件响应。掉电设置为上升沿触发,上电为下降沿触发 配置 1.开启PVD中断并设置其优先级 2.配置响应中断或事件的阈值电压 3.配置响应模式 生成…...
Nginx — 防盗链配置
防盗链简述 防盗链是一种保护网络资源所有者权益的技术手段,旨在防止未经授权的用户或网站通过直接链接的方式盗用资源,以下是关于防盗链的简述: 原理 基于请求头验证:服务器通过检查请求头中的特定字段,如Referer字…...
题解:P2485 [SDOI2011] 计算器
### 思路 本题是一个比较模板化的题目。 #### 一操作 考虑使用快速幂。 快速幂,只需要把 $k$ 变成二进制即可实现 $\Theta(\log k)$ 的时间复杂度。 实现方法: cpp long long qmi(long long a,long long k,long long p){ long long res 1; …...
【算法刷题笔记day one】滑动窗口(定长基础版)
前言 hello大家好呀 好久不见,上次更新是去年12月份的事情了。这段时间好好沉淀了一下,打了几场比赛,论文也写了一些,也收集了不少信息,对未来方向也有了不一样的计划。 这个算法系列可以说是接着我之前的数据结构系…...
Redis从入门到实战实战篇2
面试重点:本篇包含悲观锁,乐观锁,多线程以及分布式锁的知识 目录 3.优惠卷秒杀 3.1 -全局唯一ID 3.2 -Redis实现全局唯一Id 3.3 添加优惠卷 3.4 实现秒杀下单 3.5 库存超卖问题分析 3.6 乐观锁解决超卖问题 3.7 优惠券秒杀-一人一单 …...
代码随想录算法训练营Day43
力扣300.最长递增子序列 力扣674.最长连续递增子序列【easy】 力扣1143.最长公共子序列【medium】 力扣718.最长重复子数组【medium】 一、力扣300.最长递增子序列【medium】 题目链接:力扣300.最长递增子序列 视频链接:代码随想录 题解链接:…...
Scrapy框架之【settings.py文件】详解
settings.py 文件的主要作用是对 Scrapy 项目的全局设置进行集中管理。借助修改这个文件中的配置项,你可以对爬虫的行为、性能、数据处理等方面进行灵活调整,而无需修改爬虫代码。 ①默认英文注释settings.py # Scrapy settings for douban project # …...
Nginx发布Vue(ElementPlus),与.NETCore对接(腾讯云)
案例资料链接:https://download.csdn.net/download/ly1h1/90745660 1.逻辑说明 1.1 逻辑示意图 # 前端请求处理逻辑图浏览器请求流程: 1. 浏览器发起请求├─ 开发环境(DEV)│ ├─ 请求URL: http://192.168.0.102:3000/api/xxx│ └─ 被Vite代理处理└─ 生产…...
深入探索 AAC 编码原理与 ADTS 格式:音频世界的智慧结晶
在数字音频的广阔领域中,AAC 编码及其相关的 ADTS 格式扮演着至关重要的角色。无论是在我们日常使用的音乐 APP,还是高清视频中的音频部分,都能看到它们的身影。今天,就让我们深入探索 AAC 编码原理与 ADTS 格式的奥秘,…...
深度学习核心架构:探明四种基础神经网络
摘要 本文对多层感知机(MLP)、卷积神经网络(CNN)、循环神经网络(RNN)和注意力机制等深度学习核心架构的内部运作机制进行可视化分析。通过展示参数学习过程、激活映射和注意力分布等关键特征,揭示了"黑箱"模型的内部工作原理,为模型可解释性研…...
解析机器人 2.0.2 | 支持超过50种短视频平台的链接解析,无水印提取,多功能下载工具
解析机器人是一款功能强大的工具软件,登录即可解锁会员特权。它支持超过50种短视频平台的链接解析,包括抖音、快手、西瓜、bilibili等,并能实现无水印提取。此外,还提供P2P下载、磁力链等多种下载方式,确保用户能够快速…...
【漫话机器学习系列】237. TSS总平方和
深度理解 TSS(总平方和):公式、意义与应用 在机器学习与统计建模领域,评价模型好坏的重要指标之一就是方差与误差分析。其中,TSS(Total Sum of Squares,总平方和)扮演着非常关键的角…...
flutter3.29 build.gradle.kts设置安卓签名
1、在android目录下创建key.properties文件 storePassword密码 keyPassword密码 keyAlias别名 storeFilejks文件完整路径 2、修改android/app/build.gradle.kts 顶部插入import java.util.Properties import java.io.FileInputStreamval keystoreProperties Properties() v…...
<servlet-class>和</url-pattern>的作用
在 SpringMVC 的 web.xml 配置中,<servlet-class> 和 <url-pattern> 是两个关键配置项,分别用于指定处理请求的 Servlet 类和定义该 Servlet 拦截的请求路径规则。以下是它们的具体作用及原理分析: 一、<servlet-class> 的…...
linux部署的mysql数据库修改表名为小写配置
背景: 使用ruoyi-flowable框架初始化流程表结构时, 执行的sql语句创建的表名是大写。但mysql执行sql时大小写是敏感的 删除大写表 处理配置 使用mysql 8.0.41配置表名大小写敏感配置,需要初始化数据库 在MySQL 8.0及以上版本中,lower_case_table_names参…...
【Hot 100】94. 二叉树的中序遍历
目录 引言二叉树的中序遍历我的解题代码优化更清晰的表述建议: 🙋♂️ 作者:海码007📜 专栏:算法专栏💥 标题:【Hot 100】94. 二叉树的中序遍历❣️ 寄语:书到用时方恨少ÿ…...
基于D-Mixer与TransXNet的YOLOv8改进—融合全局-局部特征与空间降维注意力机制的CNN-ViT混合架构
随着目标检测任务对精度与效率要求的不断提升,传统的卷积神经网络(CNN)在建模长程依赖和复杂语义关系方面逐渐暴露出其局限性。而视觉Transformer(ViT)虽然在全局信息建模上表现优异,却因计算开销大、局部细节感知能力不足,在实时检测任务中难以直接部署。本文提出一种面向Y…...
《算法导论(第4版)》阅读笔记:p2-p3
《算法导论(第4版)》学习第 2 天,p2-p3 总结,总计 2 页。 一、技术总结 无。 二、英语总结(生词:1) 1.incremental (1) increase: in-(“in”) crescere “to grow” (2)increment (3)incremental: increment -al adj. incremental…...
基于Qlearning强化学习的电梯群控系统高效调度策略matlab仿真
目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 Q-learning强化学习原理 2.2 基于Q-learning的电梯群控系统建模 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作…...
嵌入式硬件篇---STM32F103C8T6STM32F103RCT6
文章目录 前言一、相同点内核与主频基础外设开发环境 二、不同点1. 存储容量2. 外设资源3. 封装与引脚 三、代码移植注意事项1. 内存与 Flash 限制Flash差异RAM调整 2. 外设差异外设缺失:GPIO 映射: 3. 中断向量表中断向量偏移 4. 时钟与总线配置APB分频…...
rhce第二次作业
任务目标 1.配置ssh实现A,B主机互相免密登录 2.配置nginx服务,通过多ip区分多网站 任务一 关闭防火墙 [rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# systemctl stop firewalld.service A主机免密登录B主机 ### A主机生成密钥 [rootlocalh…...
Linux第20节 --- inode和文件系统
一、没有被打开的文件 如果一个文件没有被打开,那么该文件存储在哪里? 该文件是存储在磁盘当中的! 文件 文件内容 文件属性! 文件的内容是按照数据块存储的;文件的属性其实就是inode(是一个128字节的…...
LeetCode - 19.删除链表的倒数第N个结点
目录 题目 解法一 双指针算法 核心思想 执行流程 具体例子 代码 解法二 两次遍历法 核心思想 执行流程 具体例子 代码 题目 19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 解法一 双指针算法 核心思想 利用双指针间隔固定距离(n1)&a…...
在 Ubuntu 上安装 cPanel
开始之前,请确保拥有一台 Ubuntu 服务器,推荐使用 Ubuntu 22.04 LTS。如果没有,可以查看免费服务器: 11个免费 VPS,够用一辈子了!(2025最新)Top 11 免费VPS推荐平台对比(…...
《Linux macOS :GCC升级方法》
GCC(GNU Compiler Collection)是广泛使用的编译器套件,升级到9以上版本可以获得更好的C17/20支持和性能优化。以下是不同Linux发行版和macOS的升级方法: Ubuntu/Debian 系统 添加工具链源 sudo apt update sudo apt install soft…...
C++ STL vector容器详解:从原理到实践
引言 亲爱的小伙伴们,今天我要和大家分享一个C编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性&#…...
[计算机网络]数据链路层
0 概论:数据链路层都干什么事,提供啥功能 比物理层再高一层就是数据链路层,咱们上一篇讲物理层,物理层直接接触传输介质,现在数据链路层是使用物理层的传输服务,然后实现更多的功能。物理层是只管把比特流…...
基于 vue-flow 实现可视化流程图
vue-flow 是一个基于 Vue.js 的强大且灵活的可视化流程图库,它允许开发者轻松创建交互式的流程图、工作流图、节点图等。 主要特点 易于使用 :提供了简洁的 API 和组件,开发者可以快速上手并创建复杂的流程图。高度可定制 :支持…...
【网络编程】HTTP(超文本传输协议)详解
🦄个人主页:修修修也 🎏所属专栏:网络编程 ⚙️操作环境:Visual Studio 2022 目录 📌HTTP定义 📌HTTP工作原理 1.客户端发起请求: 2.服务器处理请求: 3.客户端处理响应: 📌HTTP关键特性 🎏HTTP请求方法 &am…...
NuttX 与 PX4 系统开发全流程详解
NuttX 与 PX4 系统开发全流程详解 目录 1. NuttX 构建与使用2. NuttX 启动流程解析3. BootLoader 源码分析4. GPIO 驱动机制5. I2C 驱动分析6. PX4 系统架构简析7. uORB 消息机制8. PX4 应用开发示例9. 串口及 GPS 驱动解析10. MAVLink 协议与 PX4 交互 1. NuttX 构建与使用 …...
【Mytais系列】Myatis的设计模式
目录 设计模式 1. 工厂模式(Factory Pattern) 2. 建造者模式(Builder Pattern) 3. 动态代理模式(Dynamic Proxy Pattern) 4. 模板方法模式(Template Method Pattern) 5. 策略模…...
Linux:进程优先级及环境
一:孤儿进程 在Linux系统中,当一个进程创建了子进程后,如果父进程执行完毕或者提前退出而子进程还在运行,那么子进程就会成为孤儿进程。子进程就会被systemd(系统)进程收养,其pid为1 myproces…...
网络编程初识
注:此博文为本人学习过程中的笔记 1.socket api 这是操作系统提供的一组api,由传输层向应用层提供。 2.传输层的两个核心协议 传输层的两个核心协议分别是TCP协议和UDP协议,它们的差别非常大,编写代码的风格也不同,…...
疾病传播模拟 ——python实操
1、需求 疾病传播模拟 定义一个Infection类,包含初始感染人数、每日感染率等属性,以及一个simulate_spread方法用于模拟疾病传播过程。 使用numpy随机生成初始感染人数(范围1-100)和每日感染率(范围0.01-0.1)。 创建Infection对象,模拟10天的疾病传播过程,每天计算感染…...
用docker ffmpeg测试视频vmaf分数,很快不用编译
之前测试vmaf要自己编译libvmaf,自己编译ffmpeg,巨麻烦,或者用老旧不再维护的docker仓库,最近在docker hub上发现了编译了libvmaf的ffmpeg的docker,而且镜像很小,适合直接运行。 # dest.mp4 评分视频&…...
【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤
Nginx安装和配置 下载nginx-1.19.3-http-flv 模块预编译包并解压放在d盘,路径就跟安装步骤里说的一样(如下图),不然会有其他问题出现。 打开conf/nginx.conf,查看RTMP和http相关的配置,确认端口号和路由名称 ffpemg推流视频…...
SQL笔记——左连接、右连接、内连接
前言:总是忘记表连接的区别,在面试的时候也容易被问到,因此就好记性不如烂笔头吧 集合运算 有并集、交集、差集 联合查询*(针对行合并的)* union为关键字,就是将两个select的结果求并集(此时重…...
iOS启动优化:从原理到实践
前言 在iOS应用开发中,启动速度是影响用户体验的重要因素之一。研究表明,启动时间每增加1秒,用户留存率就会下降约7%。本文将深入探讨iOS启动优化的各个方面,从底层原理到具体实践,帮助开发者打造更快的应用启动体验。…...
202553-sql
目录 一、196. 删除重复的电子邮箱 - 力扣(LeetCode) 二、602. 好友申请 II :谁有最多的好友 - 力扣(LeetCode) 三、176. 第二高的薪水 - 力扣(LeetCode) 一、196. 删除重复的电子邮箱 - 力扣…...
Socket-TCP
在TCP/ip协议中,用源IP、源端口号、目的IP、目的端口号、协议号这样一个五元组来标识一个通信! 端口号范围划分 0 - 1023: 知名端口号,HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。…...