【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )
文章目录
- 一、解封装
- 1、封装与解封装流程
- 2、解封装 常用函数
- 二、解封装函数简介
- 1、avformat_alloc_context 函数
- 2、avformat_free_context 函数
- 3、avformat_open_input 函数
- 4、avformat_close_input 函数
- 5、avformat_find_stream_info 函数
- 6、av_read_frame 函数
- 7、avformat_seek_file 函数
- 8、av_seek_frame 函数
- 三、查找码流标号和参数信息
- 1、码流标号
- 2、查找码流标号 - av_find_best_stream 函数
- 3、查找码流参数信息 - avformat_find_stream_info 函数
- 4、查找码流参数信息延迟分析
- 四、视频文件解封装示例
- 1、使用 MediaInfo 分析视频文件
- 2、使用 MediaInfo 分析视频文件的每个字节的信息
FFmpeg 4.0 版本源码地址 :
- GitHub : https://github.com/FFmpeg/FFmpeg/tree/release/4.0
- GitCode : https://gitcode.com/gh_mirrors/ff/FFmpeg/tree/release/4.0
- FFmpeg/libavcodec/avpacket.c 源码 : https://gitcode.com/gh_mirrors/ff/FFmpeg/blob/release/4.0/libavcodec/avpacket.c
一、解封装
1、封装与解封装流程
" 封装 " 是 将 音频流 / 视频流 / 字幕流 等多媒体流 , 按照一定的规则 组合成 特定格式的 视频文件 ;
- 封装 主要是由 " 复用器 " 完成的 ;
- 封装示例 : 将 AAC 格式的 音频流 和 H.264 格式的 视频流 封装成一个 .mp4 文件 ;
" 解封装 " 是 将 特定格式的 视频文件 , 按照一定的规则 拆分成 音频流 / 视频流 / 字幕流 等多媒体流 ;
- 解封装 主要是由 " 解复用器 " 完成的 ;
- 解封装示例 : 将 .mp4 文件 拆分成 AAC 格式的 音频流 和 H.264 格式的 视频流 ;
2、解封装 常用函数
解封装 常用函数 简介 :
- avformat_alloc_context 函数 : 用于 申请 AVFormatContext 结构体内存 , 并 对 结构体的字段 进行简单初始化操作 ;
- avformat_free_context 函数 : 释放 AVFormatContext 结构体 及其 关联的资源 ;
- avformat_open_input 函数 : 使用 解复用器 打开 视频文件 / 媒体流 ;
- avformat_close_input 函数 : 关闭 解复用器 ;
- avformat_find_stream_info 函数 : 获取 媒体流信息 ;
- av_read_frame 函数 : 读取 媒体流 中的 AVPacket 数据包 ;
- avformat_seek_file 函数 : 根据 时间戳 跨多个流 定位文件 中的位置 ;
- av_seek_frame 函数 : 根据 时间戳 跳转到指定流的指定位置 ;
二、解封装函数简介
下面的 解封装 函数 可 参考 【FFmpeg】FFmpeg 函数简介 ② ( 封装格式相关函数解析 | 封装格式与解复用器 | avformat_alloc_context 函数 | avformat_open_input函数 ) 博客 ;
解封装流程如下 :
1、avformat_alloc_context 函数
avformat_alloc_context 函数原型 :
AVFormatContext *avformat_alloc_context(void);
- 函数作用 : 该函数用于 分配并初始化一个 AVFormatContext 结构体 ;
- 函数参数 : 函数参数为空 ;
- 函数返回值 : 函数 返回一个 AVFormatContext 指针 , 指向分配的结构体 ; 如果分配失败 , 则返回 NULL ;
AVFormatContext 结构体 用于 存储 文件格式相关信息 , 其中包括文件中 各个媒体流 的参数信息 ;
2、avformat_free_context 函数
avformat_free_context 函数 用于 释放 AVFormatContext 结构体 以及相关的资源 , 包括 流信息 / IO 资源 / 解码器 / 格式上下文 等数据 ,
avformat_free_context 函数原型如下 :
void avformat_free_context(AVFormatContext *s);
avformat_free_context 函数 与 avformat_alloc_context 函数 一般都要成对使用 , 防止内存泄漏 ;
如果 之前调用过 avformat_alloc_context 函数 , 则必须调用 avformat_free_context 函数 释放内存 ;
如果 之前没有调用过 avformat_alloc_context 函数 , 则不必调用 avformat_free_context 函数 ;
3、avformat_open_input 函数
avformat_open_input 函数 使用 " 解复用器 " 打开 视频文件 , 该函数 在内部会调用 avformat_alloc_context 函数 用于为 AVFormatContext 结构体分配内存 ;
avformat_open_input 函数原型如下 :
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);
- 函数参数 :
- AVFormatContext **ps : 指向 AVFormatContext 指针的指针 ;
- const char *url : 输入流的地址或文件名 , 文件路径 或 网络流的 URL ;
- AVInputFormat *fmt : 设置输入格式 , 一般都是 NULL , FFmpeg 自动选择输入格式 ;
- AVDictionary **options : 附加参数 , 设置解码器 , 网络连接 等参数 ;
- 函数返回值 : 关闭成功 返回 0 , 关闭失败 返回 负值错误码 ;
注意 : avformat_open_input 函数 要与 avformat_close_input 函数 成对使用 ;
4、avformat_close_input 函数
avformat_close_input 函数 用于 关闭 " 解复用器 " , 该函数 在内部会调用 avformat_free_context 函数 ;
avformat_close_input 函数原型如下 :
int avformat_close_input(AVFormatContext **ps);
- 函数参数 : 其中的参数 ps 是 指向 AVFormatContext 指针的指针 ;
- 函数返回值 : 关闭成功 返回 0 , 关闭失败 返回 负值错误码 ;
注意 : avformat_open_input 函数 要与 avformat_close_input 函数 成对使用 ;
5、avformat_find_stream_info 函数
avformat_find_stream_info 函数 用于获取 媒体流 信息 ;
一般情况下 , 调用 avformat_open_input 函数 就可以获取到 视频文件的 媒体流信息 ;
如果调用 avformat_open_input 函数 无法获取 媒体流信息 , 此时 需要 开发者 手动调用 avformat_find_stream_info 函数 用于获取媒体流信息 ;
函数原型如下 :
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
- 函数参数 :
- AVFormatContext *ic : 指向 AVFormatContext 的指针 ;
- AVDictionary **options : 可选附加参数 , 设置解码器 , 网络连接 等参数 ;
- 函数返回值 : 关闭成功 返回 0 , 关闭失败 返回 负值错误码 ;
6、av_read_frame 函数
av_read_frame 函数 用于 读取 音视频流 中的 数据包 , 这是压缩后的数据 , 不能直接播放 , 需要经过解码后才能播放 ;
AAC 格式的 音频流 数据包 , 需要转为 PCM 格式 才能播放 ;
H.264 格式的 视频流 数据包 , 需要转为 YUV 或 RGB 格式 才能播放 ;
av_read_frame 函数 原型 :
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
- 函数参数 :
- AVFormatContext *s : 指向 AVFormatContext 的指针 , 这是已经打开的 多媒体流 的格式上下文 ;
- AVPacket *pkt : 指向 AVPacket 的指针 , 用于存储读取的 一帧 音视频数据 ;
- 函数返回值 : 关闭成功 返回 0 , 关闭失败 返回 负值错误码 ;
7、avformat_seek_file 函数
avformat_seek_file 函数 参考 【FFmpeg】FFmpeg 函数简介 ② ( 封装格式相关函数解析 | 封装格式与解复用器 | avformat_alloc_context 函数 | avformat_open_input函数 ) 一、FFmpeg 音视频文件 封装格式相关函数 8、avformat_seek_file 函数 博客章节 ;
8、av_seek_frame 函数
av_seek_frame 函数 参考 【FFmpeg】FFmpeg 函数简介 ② ( 封装格式相关函数解析 | 封装格式与解复用器 | avformat_alloc_context 函数 | avformat_open_input函数 ) 一、FFmpeg 音视频文件 封装格式相关函数 9、av_seek_frame 函数 博客章节 ;
avformat_seek_file 函数 与 av_seek_frame 函数 对比 :
- 跳转粒度 :
- avformat_seek_file : 支持 视频文件 跨多个媒体流 定位跳转 到 指定时间戳 , 并且 可以控制最小、最大时间戳范围 ;
- av_seek_frame : 跳转到 特定流 的 指定时间戳 ;
- 跳转控制 :
- avformat_seek_file : 可以 精细控制时间戳范围 , 设置最小时间戳和最大时间戳 ;
- av_seek_frame : 跳转到关键帧 , 灵活性较低 ;
- 常用场景 :
- avformat_seek_file : 适用于 跨多个媒体流 的文件 的 精准跳转 ;
- av_seek_frame : 适用于 单个媒体流操作 , 通常用于快速定位到 视频流、音频流 或 字幕流 的 关键帧 ;
三、查找码流标号和参数信息
1、码流标号
在 FFmpeg 中 , 每个 多媒体文件 可能 包含 多个多媒体流 , 如 : 视频流、音频流、字幕流 等 ;
这些 媒体流都 会 被分配 一个 唯一的索引号 来标识 , 称为 " Stream index " , 用于区分文件中的不同流 ;
上述 流索引号 可以称为 " 码流标号 " , 从 0 开始进行递增编号 , 其中 标号为 0 的码流 可能是 视频流 / 音频流 / 字幕流 ;
2、查找码流标号 - av_find_best_stream 函数
av_find_best_stream 函数 用于查找 媒体文件 中的 最佳流 ;
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream, int related_stream, AVCodec **decoder_ret, int flags);
- 函数参数 :
- AVFormatContext *ic : 指向已打开媒体文件的 AVFormatContext 结构体的指针 , 其中封装了 媒体信息 包括 流的数量 以及 每个流的详细信息 ;
- enum AVMediaType type : 要查找的 媒体流的类型 , 可选的媒体流类型如下 :
- AVMEDIA_TYPE_VIDEO : 视频流类型 ;
- AVMEDIA_TYPE_AUDIO : 音频流类型 ;
- AVMEDIA_TYPE_DATA : 数据流类型 ;
- AVMEDIA_TYPE_SUBTITLE : 字幕流类型 ;
- AVMEDIA_TYPE_UNKNOWN : 未知类型 ;
- AVMEDIA_TYPE_ATTACHMENT : 附件类型 ;
- int wanted_stream : 用户期望的流索引 , 默认设置 -1 ;
- int related_stream : 与之相关的最佳流的索引 , 默认设置 -1 ;
- AVCodec **decoder_ret : 指向找到的流的对应解码器 , 默认设置 NULL ;
- int flags : 指定额外的查找选项 , 默认设置 0 ;
- 函数返回值 : 查找成功返回流索引 , 查找失败返回 AVERROR_STREAM_NOT_FOUND 或 错误码 ;
查找视频流示例 :
int video_index = av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0)
查找音频流示例 :
int audio_index = av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0)
3、查找码流参数信息 - avformat_find_stream_info 函数
视频文件 在 播放前 , 必须要进行解码 , 解码的前提就是要知道 文件中的如下信息 :
- 媒体流数量
- 媒体流类型 : 视频流、音频流、字幕流 等 ;
- 每个流的详细信息 : 编码格式、比特率、分辨率 等 ;
获取到这些信息后 , 都设置到 AVFormatContext 结构体中 ;
avformat_open_input 函数 在 打开 输入媒体文件 后 , 会读取 文件的头部信息 , 函数执行过程中会 初始化 AVFormatContext 结构体 , 并将读取到的文件流信息填充到该结构体中 ;
有些类型的文件 , 如 : FLV 文件 / H.264 文件 / 网络直播流 , 文件的 头部信息 中并没有完整的流信息 , 甚至就没有头部信息 ;
此时就需要 调用 avformat_find_stream_info 函数 , 获取每个媒体流的完整流信息 , 包括流的 编码参数、比特率、分辨率 等信息 ;
avformat_find_stream_info 函数 可以 在 信息缺失的情况下 , 通过分析 数据包 格式 , 探测并分析 流 的 缺失参数信息 ;
4、查找码流参数信息延迟分析
avformat_find_stream_info 函数会尝试读取足够的数据 , 来确定每个流的参数 , 如 : 编解码器、比特率、采样率 等 ;
读取数据 , 分析数据 , 然后获取流的参数信息 , 这个过程 需要花费一定的时间 , 这就会造成延迟 , 设置的 读取数据越多 , 造成的延迟越大 ;
开发者 通过 AVFormatContext 相关结构设置的一些参数 , 设置 avformat_find_stream_info 函数 读取数据的多少 ;
四、视频文件解封装示例
视频文件 封装在 文件容器中 , 将容器中的数据提取出来 , 就是解封装过程 ;
在本章节中 使用 MediaInfo 分析视频文件 提取视频文件的信息 , 之后在下一篇博客中自己编写代码提取视频文件中的数据 , 并在 输出日志 中展示出来 ;
1、使用 MediaInfo 分析视频文件
MediaInfo 软件 可 用于 提取 视频文件 的 技术信息和元数据 , 支持多种格式和编码 , 可以快速显示文件的详细信息 ;
下面我们使用 MediaInfo 软件 分析 mp4 格式的 视频文件 ;
MediaInfo 软件 默认显示的 文件内容细节是 Details - 0 级别 , 在 " 菜单栏 / 调试 " 选项中可以查看当前的 调试级别 ;
在 Details - 0 调试级别下 , 只能看到 文件的 容器格式 一般信息 , 有几个文件流 , 每个文件流都是什么格式的 , 具体的文件流的内容是无法看到的 ;
下图就是 mp4 文件的 Details - 0 调试级别 显示的文件的容器信息 , 很简略 ;
2、使用 MediaInfo 分析视频文件的每个字节的信息
在 " 菜单栏 / 调试 " 选项中 , 设置 调试级别为 Details - 10 级别 , 这样就可以分析文件中每个字节的信息 ;
此时再打开上个章节中的 mp4 文件 , 就会显示如下信息 , MediaInfo 会将文件的每个字节的数据都解析出来 , 同时将每个字节的含义也展出出来 ;
相关文章:
【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )
文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…...
#渗透测试#红队全栈 powshell基础使用
声明! 学习视频来自B站up主 泷羽sec,任何违法事件与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!! 目录标题 认识powsehll打开方式 使用方式美化自己的powershell简单…...
Qt之自定义标题栏拓展(十)
Qt开发 系列文章 - user-defined-titlebars(十) 目录 前言 一、方式一 1.效果演示 2.创建标题栏类 3.可视化UI设计 4.定义相关函数 5.使用标题栏类 二、方式二 1.效果演示 2.创建标题栏类 3.定义相关函数 1.初始化函数 2.功能函数 3.窗口关…...
设计模式之创建型
1、What 关注对象的创建过程,旨在通过不同的方式来创建对象,以解耦对象的创建与其使用过程。这些模式提供了创建对象的灵活性和可扩展性,使得代码更加易于维护和管理。 1.1 单例模式 确保一个类只有一个实例,并提供一个全局访问…...
记录一下自己对网络安全法的笔记
仅记录一下自己对网络安全法的笔记 文章来源(https://www.cac.gov.cn/2016-11/07/c_1119867116_2.htm)(2016年11月7日第十二届全国人民代表大会常务委员会第二十四次会议通过)该法自2017年6月1日起施行。《网络安全法》是我国第一…...
Mybatis-plus-Join--分页查询
数据表四张: user: id,username,create_time,update_time product: id,name,price,number(库存),create_time,update_times order: id,quantity,order_time(下单时间),update_time order_detail:id,product_id,order_id,quant…...
EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 5
Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 5_Day9-Day10 (12.19-12.20)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Gui…...
【AI日记】24.12.19 kaggle 比赛 2-8 | 睡眠质量提高
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加:kaggle 比赛 Regression with an Insurance Dataset时间:8 小时 读书 书名:富兰克林自传时间:0.5 小时阅读原因:100 美元纸币上的人物 …...
string
1.对象创建 // // Created by 徐昌真 on 2024/12/15. // #include <iostream> #include <string>using namespace std;int main() {string s "意思是不要沉迷于空洞的幻想 也不要追求无用的虚名 强调了做事要脚踏实地 专注于实际的目标与行动";// 1. 无…...
观龙鱼之态,察疾病之征
龙鱼,以其独特的外形、优雅的游姿,成为众多养鱼爱好者的心头好。然而,这些水中的 “精灵” 一旦患病,其状态会发生明显变化。了解龙鱼患病的表现,对于鱼主人及时发现并治疗至关重要。 当龙鱼出现食欲不振的情况时&…...
【NLP 16、实践 ③ 找出特定字符在字符串中的位置】
看着父亲苍老的白发和渐渐老态的面容 希望时间再慢一些 —— 24.12.19 一、定义模型 1.初始化模型 ① 初始化父类 super(TorchModel, self).__init__(): 调用父类 nn.Module 的初始化方法,确保模型能够正确初始化。 ② 创建嵌入层 self.embedding n…...
一.photoshop导入到spine
这里使用的是 photoshoptospine脚本 下载地址:https://download.csdn.net/download/boyxgb/90156744 脚本的使用,可以通过文件的脚本的浏览,浏览该脚本使用该脚本,也可以将该脚本放在photoshop安装文件夹里的script文件夹下,具体路径:Photoshop\Presets\Scripts,重启photosho…...
docsify
macos ➜ ~ node -v v16.20.2➜ ~ npm --version 8.19.4全局安装 docsify-cli 工具 npm i docsify-cli -g➜ ~ docsify -vdocsify-cli version:4.4.4初始化项目 docsify init ./docsls -ah docs . .. .nojekyll README.md index.htmlindex.html 入口文件README.md 会…...
在Windows Server路由和远程访问服务中启用L2TP/IPsec VPN
背景 路由和远程访问服务(Routing and Remote Access Services,RRAS)是Windows Server上的一个角色,包含很多功能,可以用来搭建VPN。然而,在什么也不做的初始配置中,它只允许PPTP协议连接。然而…...
感知机收敛性定理证明
1. 问题描述 感知机收敛性定理假设: 存在一个参数向量 θ(被归一化为单位向量,,以及一个正数 ,使得对所有训练样本 满足: 这是线性可分的假设,意味着每个样本点与正确超平面之间有一个至少为的…...
监控易平台:提升IDC 数据中心运维效率与质量
一、引言 随着信息技术的飞速发展,IDC 数据中心作为信息存储、处理和传输的核心枢纽,其规模和复杂性不断增加。数据中心的稳定运行对于企业业务的连续性和发展至关重要,然而,传统的运维方式在面对日益增长的运维需求时,…...
WordPress 资源展示型下载类主题 CeoMax-Pro_v7.6 开心版
WordPress 资源展示型下载类主题 CeoMax-Pro_v7.6 开心版; CeoMax-Pro是一款极致美观强大的WordPress付费资源下载主题,它能满足您所有付费资源下载的业务需求! 你的想法与业务不能被主题所限制!CeoMax-Pro强大的功能࿰…...
java数据类型(补充-引用类型)
Java还提供了引用数据类型(Reference Types)。这些类型的变量存储的是对象的引用,而不是直接存储值。引用数据类型主要包括以下几类: 类型描述类(Class)每个对象都有自己的状态(属性或字段)、行为…...
【WRF教程第四期】WRF 初始化概述:以4.5版本为例
WRF 初始化(WRF Initialization) Building Initialization Programs编译方式 理想案例初始化(Initialization for Idealized Cases)理想化案例的输入可用的理想化案例 现实案例初始化(Initialization for Real Data Ca…...
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
本篇将带你实现一个虚拟音乐控制台。用户可以通过界面控制音乐的播放、暂停、切换歌曲,并查看当前播放的歌曲信息。页面还支持调整音量和动态显示播放进度,是音乐播放器界面开发的基础功能示例。 关键词 UI互动应用音乐控制播放控制动态展示状态管理按钮…...
Navicat 17 功能简介 | SQL 美化
SQL美化 本期,我们将深入挖掘 Navicat 的实用的SQL代码美化功能。你只需简单地点击“SQL 美化”按钮,即可轻松完成 SQL 的格式化。 随着 17 版本的发布,Navicat 也带来了众多的新特性,包括兼容更多数据库、全新的模型设计、可视化…...
C++ 只出现一次的数字 - 力扣(LeetCode)
点击链接即可查看题目:136. 只出现一次的数字 - 力扣(LeetCode) 一、题目 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间…...
Unity3D仿星露谷物语开发5之角色单例模式
1、目的 使用单例模式创建角色对象,保证整个游戏中只有一个角色,并且让游戏对象具有全局可访问性。 2、流程 (1)创建SingletonMonobehaviour脚本 Assets下创建Scripts目录用于存放所有的脚本,再创建Misk子目录&…...
解析在OceanBase创建分区的常见问题|OceanBase 用户问题精粹
在《分区策略和管理分区计划的实践方案》这篇文章中,我们介绍了在ODC中制定分区策略及有效管理分区计划的经验。有不少用户在该帖下提出了使用中的问题,其中一个关于创建分区的限制条件的问题,也是很多用户遭遇的老问题。因此本文以其为切入&…...
python学习路径(一)
学习 Python 的完整大纲应该从基础知识到高级应用层层递进,并以构建自己的项目为目标,最终形成自己的知识体系。以下是一个完整、详细且逻辑清晰的学习路径: 第一部分:Python 基础 1. 环境配置与工具 Python 安装与版本管理&…...
【Nginx-5】Nginx 限流配置指南:保护你的服务器免受流量洪峰冲击
在现代互联网应用中,流量波动是常态。无论是突发的用户访问高峰,还是恶意攻击,都可能导致服务器资源耗尽,进而影响服务的可用性。为了应对这种情况,限流(Rate Limiting)成为了一种常见的保护措施…...
OpenCV(python)从入门到精通——运算操作
加法减法操作 import cv2 as cv import numpy as npx np.uint8([250]) y np.uint8([10])x_1 np.uint8([10]) y_1 np.uint8([20])# 加法,相加最大只能为255 print(cv.add(x,y))# 减法,相互减最小值只能为0 print(cv.subtract(x_1,y_1))图像加法 import cv2 as…...
MFC 自定义网格控件
一、什么是 Custom Control? Custom Control(自定义控件) 是 MFC(Microsoft Foundation Classes)框架中提供的一种控件类型,用于实现自定义的外观和功能。当标准控件(例如 CEdit、CButton、CLi…...
什么是卷积?卷积的意义
卷积是一种在数学和信号处理中广泛应用的运算方法,它通常被用于描述两个函数之间的关系。在信号处理中,卷积可以将两个信号进行组合,以得到一个新的信号,该信号反映了这两个原始信号之间的关系。 具体来说,假设有两个…...
μC/OS-Ⅱ源码学习(7)---软件定时器
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 μC/OS-Ⅱ源码学习(6)---事件标志组 本文进一…...
3D和AR技术在电商行业的应用有哪些?
3D展示和AR技术在电商行业的应用为消费者带来了更为直观、沉浸式的购物体验,显著提升了商品展示效果和销售转化率。以下是3D和AR技术在电商行业的具体应用: 1、商品3D展示: 通过3D技术,商品可以在电商平台上以三维形式呈现&…...
数据增强的几大方式
1. 随机擦除(Random Erasing) 说明 随机在图像中选取一个矩形区域,将其像素值随机化或设为零,以增加模型对部分缺失信息的鲁棒性。 import numpy as np import cv2def random_erasing(image, sl0.02, sh0.2, r10.3):h, w, _ image.shapearea h * wta…...
GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法
GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法 论文大纲理解为什么大模型和知识图谱不够?还要多智能体 设计思路数据分析解法拆解全流程核心模式提问为什么传统的长文本处理方法会随着文本长度增加而…...
VTK 模型封闭 closeSurface 补洞, 网格封闭性检测
网格封闭性检测 见: vtk Edges 特征边 提取 网格封闭性检测_vtkfeatureedges-CSDN博客 由于以前做过3D打印模型,要求模型必须是封闭的,原来对模型封闭有研究过,不过没有记录;现在又遇到,整理一下ÿ…...
【译】仅有 Text2SQL 是不够的: 用 TAG 统一人工智能和数据库
原文地址:Text2SQL is Not Enough: Unifying AI and Databases with TAG 摘要 通过数据库为自然语言问题提供服务的人工智能系统有望释放出巨大的价值。此类系统可让用户利用语言模型(LM)的强大推理和知识能力,以及数据管理系统…...
Java:链接redis报错:NoSuchElementException: Unable to validate object
目录 前言报错信息排查1、确认redis密码设置是否有效2、确认程序配置文件,是否配置了正确的redis登录密码3、检测是否是redis持久化的问题4、确认程序读取到的redis密码没有乱码 原因解决 前言 一个已经上线的项目,生产环境的redis居然没有设置密码&…...
每日一题 334. 递增的三元子序列
334. 递增的三元子序列 使用贪心来找到三个数字 class Solution { public:bool increasingTriplet(vector<int>& nums) {int first INT_MAX;int second INT_MAX;for(int num : nums){if(num < first){first num;}else if(num < second){second num;}els…...
金仓 Kingbase 日常运维 SQL 汇总
金仓 Kingbase 日常运维 SQL 汇总 1 单机启停 sys_ctl start|stop|restart 或指定data路径和端口等 sys_ctl start|stop|restart -D /data/kingbase/data -p 543222 集群启停 sys_monitor start|stop|restart3 修改配置后重新加载 sys_ctl reload4 初始化实例 initdb -E ut…...
JAVA开发ERP时在 PurchaseOrderServiceImpl.java 中添加日志记录进行调试
在 PurchaseOrderServiceImpl.java 中添加日志记录,以便在保存订单时输出参数进行调试。可以使用 Spring 的日志框架(SLF4J 和 Logback)来实现这一点。 添加日志记录 引入 SLF4J 依赖: 确保项目中已经包含了 SLF4J 和 Logback 的依赖。通常在…...
36.3 grafana-dashboard看图分析
kube-prometheus中的grafana总结 db使用 sqlit,volume类型为emptydir 无法持久化,pod扩缩就重新创建通过configMap设置的prometheus DataSource 通过 prometheus-k8s svc对应的 域名访问下面对应两个prometheus容器,有HA 各个dashboard通过 …...
面试题整理5----进程、线程、协程区别及僵尸进程处理
面试题整理5----进程、线程、协程区别及僵尸进程处理 1. 进程、线程与协程的区别1.1 进程(Process)1.2 线程(Thread)1.3 协程(Coroutine)2. 总结对比 3. 僵尸进程3.1 什么是僵尸进程?3.2 僵尸进…...
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录😋 <第1关:顺序结构的应用> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: <第2关:交换变量值> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: <第…...
LLM大语言模型私有化部署-OpenEuler22.03SP3上容器化部署Dify与Qwen2.5
背景 Dify 是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI 工作流、 RAG 管道、 Agent 、模型管理、可观测性功能等,让您可以快速从原型到生产。相比 LangChain 这类有着锤子、钉子的工具箱开发库, Dify 提供了更接近生产需要的完整…...
C语言中的转义字符
C语言中的转义字符 常见字符ASCII码表...
ilqr算法原理推导及代码实践
目录 一. ilqr原理推导1.1 ilqr问题描述1.2 ilqr算法原理1.3 ilqr算法迭代过程 二. ilqr实践代码 一. ilqr原理推导 1.1 ilqr问题描述 本文参考知乎博主: LQR与iLQR:从理论到实践【详细】 基础LQR只能处理线性系统 (指可以使用 x ( k 1 ) A x ( k ) B u ( k )…...
系列1:基于Centos-8.6部署Kubernetes (1.24-1.30)
每日禅语 “木末芙蓉花,山中发红萼,涧户寂无人,纷纷开自落。”这是王维的一首诗,名叫《辛夷坞》。这首诗写的是在辛夷坞这个幽深的山谷里,辛夷花自开自落,平淡得很,既没有生的喜悦ÿ…...
finereport新的数据工厂插件使用场景一 通过accessToken获取数据
1 有两个接口,一个接口获取一个accessToken,一个接口根据accessToken来获取数据。代码示例为: @RequestMapping(value = {"df_test/getAccessToken"},method = {RequestMethod.GET})@ResponseBodypublic String getAccessToken(HttpServletRequest req, HttpServ…...
matlab绘图时设置左、右坐标轴为不同颜色
目录 一、需求描述 二、实现方法 一、需求描述 当图中存在两条曲线,需要对两条曲线进行分别描述时,应设置左、右坐标轴为不同颜色,并设置刻度线,且坐标轴颜色需要和曲线颜色相同。 二、实现方法 1.1、可以实现: 1…...
魏裕雄的JAVA学习总结
JAVA学习总结 Java面向对象程序设计知识总结第1章 初识Java与面向对象程序设计JAVA概述面向对象程序设计思想JAVA开发环境搭建第一个JAVA程序JAVA常用开发工具 第2章 Java编程基础变量与常量运算符与表达式选择结构循环结构方法数组JVM中的堆内存与栈内存 第3章 面向对象程序设…...
深度学习从入门到精通——图像分割实战DeeplabV3
DeeplabV3算法 参数配置关于数据集的配置训练集参数 数据预处理模块DataSet构建模块测试一下数据集去正则化模型加载模块DeepLABV3 参数配置 关于数据集的配置 parser argparse.ArgumentParser()# Datset Optionsparser.add_argument("--data_root", typestr, defa…...