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

obs video-io.c

video_frame_init 讲解

/* messy code alarm
video_frame_init 函数用于初始化视频帧。它接受一个指向 struct video_frame 结构体的指针 frame,
视频格式 format,以及宽度 width 和高度 height。该函数根据视频格式的不同,计算出每个视频帧的大小,
并在堆上为帧数据分配内存空间。然后,根据视频格式的不同,设置帧数据的偏移量和行大小,并将这些信息填充到 frame 结构体中。
*/void video_frame_init(struct video_frame *frame, enum video_format format,uint32_t width, uint32_t height)
{size_t size;size_t offsets[MAX_AV_PLANES];int alignment = base_get_alignment();if (!frame)return;memset(frame, 0, sizeof(struct video_frame));memset(offsets, 0, sizeof(offsets));switch (format) {case VIDEO_FORMAT_NONE:return;case VIDEO_FORMAT_I420: {/* 计算 Y 分量的大小,基于帧的宽度和高度 */size = width * height;/* 根据指定的对齐方式对大小进行对齐 */ALIGN_SIZE(size, alignment);/* 设置 Y 分量的偏移量 */offsets[0] = size;/* 计算 U 和 V 分量的宽度和高度 */const uint32_t half_width = (width + 1) / 2;const uint32_t half_height = (height + 1) / 2;/* 计算 U 和 V 分量的区域大小 */const uint32_t quarter_area = half_width * half_height;/* 将 U 分量的大小添加到总大小中 */size += quarter_area;/* 根据指定的对齐方式对大小进行对齐 */ALIGN_SIZE(size, alignment);/* 设置 U 分量的偏移量 */offsets[1] = size;/* 将 V 分量的大小添加到总大小中 */size += quarter_area;/* 根据指定的对齐方式对大小进行对齐 */ALIGN_SIZE(size, alignment);/* 为 YUV 数据分配内存 */frame->data[0] = bmalloc(size);/* 设置 U 和 V 分量的指针 */frame->data[1] = (uint8_t *)frame->data[0] + offsets[0];frame->data[2] = (uint8_t *)frame->data[0] + offsets[1];/* 设置 YUV 数据的行大小 */frame->linesize[0] = width;frame->linesize[1] = half_width;frame->linesize[2] = half_width;break;}}

init_cache

/*
这段代码是用于初始化视频输出缓存的函数。函数名为 init_cache,它接受一个指向 struct video_output 结构体的指针作为参数。

函数首先检查 video->info.cache_size 是否大于最大缓存大小 MAX_CACHE_SIZE,如果是,则将 video->info.cache_size 设置为
MAX_CACHE_SIZE。接下来,通过一个 for 循环,对 video->info.cache_size 次迭代,分别初始化缓存中的每个视频帧。在每次循环中,
函数会创建一个 video_frame 结构体指针 frame,该指针指向 video->cache[i],并使用 video_frame_init 函数初始化该帧。
初始化时,会将视频格式、宽度和高度信息填入帧中。最后,函数将 video->available_frames 设置为 video->info.cache_size,
表示缓存中有多少帧可用。
*/

static inline void init_cache(struct video_output *video)
{if (video->info.cache_size > MAX_CACHE_SIZE)video->info.cache_size = MAX_CACHE_SIZE;for (size_t i = 0; i < video->info.cache_size; i++) {struct video_frame *frame;frame = (struct video_frame *)&video->cache[i];video_frame_init(frame, video->info.format, video->info.width,video->info.height);}video->available_frames = video->info.cache_size;
}

video_output_open

/*
这段代码是一个视频输出组件的初始化函数 video_output_open。它接受一个指向 video_t 指针的指针(用于返回视频输出对象的地址)和一个 video_output_info 结构体指针作为参数。

首先,函数会检查传入的 info 参数是否有效,如果无效则返回 VIDEO_OUTPUT_INVALIDPARAM,表示初始化失败。

接着,函数会动态分配内存以创建一个 video_output 结构体对象,并将 info 中的信息复制到这个对象中。如果内存分配失败,则函数会返回 VIDEO_OUTPUT_FAIL。

然后,函数会根据 info 中的帧率信息计算每一帧的时间间隔,并将结果存储在 frame_time 中。

接下来,函数会初始化两个递归互斥锁 data_mutex 和 input_mutex 以及一个信号量 update_semaphore。如果初始化失败,则函数会释放之前分配的资源,并返回 VIDEO_OUTPUT_FAIL。

紧接着,函数会创建一个线程 thread,并将其入口函数设置为 video_thread。如果线程创建失败,则函数会释放之前分配的资源,并返回 VIDEO_OUTPUT_FAIL。

最后,函数会调用 init_cache 函数对 out 进行初始化,并将 out 赋值给 *video,以便将视频输出对象的地址返回给调用者。最后,函数返回 VIDEO_OUTPUT_SUCCESS 表示初始化成功。

总的来说,video_output_open 函数的作用是根据传入的 video_output_info 初始化一个视频输出对象,并将其地址存储在 *video 中,同时返回初始化的结果。

*/

int video_output_open(video_t **video, struct video_output_info *info)
{struct video_output *out;if (!valid_video_params(info))return VIDEO_OUTPUT_INVALIDPARAM;out = bzalloc(sizeof(struct video_output));if (!out)goto fail0;memcpy(&out->info, info, sizeof(struct video_output_info));out->frame_time =util_mul_div64(1000000000ULL, info->fps_den, info->fps_num);if (pthread_mutex_init_recursive(&out->data_mutex) != 0)goto fail0;if (pthread_mutex_init_recursive(&out->input_mutex) != 0)goto fail1;if (os_sem_init(&out->update_semaphore, 0) != 0)goto fail2;if (pthread_create(&out->thread, NULL, video_thread, out) != 0)goto fail3;init_cache(out);*video = out;return VIDEO_OUTPUT_SUCCESS;fail3:os_sem_destroy(out->update_semaphore);
fail2:pthread_mutex_destroy(&out->input_mutex);
fail1:pthread_mutex_destroy(&out->data_mutex);
fail0:bfree(out);return VIDEO_OUTPUT_FAIL;
}

video_thread

/** 视频线程函数,用于处理视频输出** param: 指向视频输出结构体的指针*/
static void *video_thread(void *param)
{/* 将参数转换为视频输出结构体 */struct video_output *video = param;/* 设置线程名称为 "video-io: video thread" */os_set_thread_name("video-io: video thread");/* 获取视频线程的名称 */const char *video_thread_name =profile_store_name(obs_get_profiler_name_store(),"video_thread(%s)", video->info.name);/* 在视频信号量上等待 */while (os_sem_wait(video->update_semaphore) == 0) {/* 如果视频已停止,则退出循环 */if (video->stop)break;/* 启动性能分析 */profile_start(video_thread_name);/* 在当前帧输出之前不断增加总帧数,直到当前帧输出成功 */while (!video->stop && !video_output_cur_frame(video)) {os_atomic_inc_long(&video->total_frames);}/* 当前帧输出成功后增加总帧数 */os_atomic_inc_long(&video->total_frames);/* 结束性能分析 */profile_end(video_thread_name);/* 重新启用线程性能分析 */profile_reenable_thread();}return NULL;
}

video_output_cur_frame

// 动态数组结构体,用于存储动态数组的信息
struct darray {void *array;    // 指向数组数据的指针size_t num;     // 数组中当前元素的数量size_t capacity; // 数组当前的容量
};/** 用于存储有关缓存视频帧的信息的结构。*/
struct cached_frame_info {struct video_data frame; // 视频帧数据int skipped;             // 被跳过的帧数int count;               // 总帧数计数
};/** 视频输入结构体,用于描述视频输入设备的信息。*/
struct video_input {struct video_scale_info conversion;  // 视频转换信息video_scaler_t *scaler;              // 视频缩放器struct video_frame frame[MAX_CONVERT_BUFFERS]; // 视频帧缓冲区int cur_frame;                        // 当前帧索引// 允许以主合成 FPS 的分数输出,例如,60 FPS 的 frame_rate_divisor = 1 变为 30 FPS//// 使用单独的计数器而不是使用余数计算,// 以便允许同时启动的“inputs”在相同的帧上启动,// 而使用余数计算则会使帧对齐取决于编码器启动时的总帧数uint32_t frame_rate_divisor;          // 帧率除数uint32_t frame_rate_divisor_counter;  // 帧率除数计数器void (*callback)(void *param, struct video_data *frame); // 回调函数指针void *param;                           // 参数
};/** 检查当前视频输出是否包含完* 整的帧并处理当前帧** video: 视频输出结构体指针** 返回值:如果当前帧完整则返回true,否则返回false*/
static inline bool video_output_cur_frame(struct video_output *video)
{struct cached_frame_info *frame_info;bool complete;bool skipped;/* 获取视频数据前先锁定数据互斥锁 */pthread_mutex_lock(&video->data_mutex);/* 获取当前视频输出中第一个添加的帧信息 */frame_info = &video->cache[video->first_added];/* 解锁数据互斥锁 */pthread_mutex_unlock(&video->data_mutex);/* 锁定输入互斥锁以处理视频输入 */pthread_mutex_lock(&video->input_mutex);/* 遍历视频输入并处理帧数据 */for (size_t i = 0; i < video->inputs.num; i++) {struct video_input *input = video->inputs.array + i;struct video_data frame = frame_info->frame;// 使用显式计数器而不是求余来允许在相同时间启动的多个编码器// 在同一帧上启动uint32_t skip = input->frame_rate_divisor_counter++;if (input->frame_rate_divisor_counter == input->frame_rate_divisor)input->frame_rate_divisor_counter = 0;if (skip)continue;if (scale_video_output(input, &frame))input->callback(input->param, &frame);}/* 解锁输入互斥锁 */pthread_mutex_unlock(&video->input_mutex);/* 处理当前帧信息 */pthread_mutex_lock(&video->data_mutex);/* 更新当前帧的时间戳并检查当前帧是否已经完整 */frame_info->frame.timestamp += video->frame_time;complete = --frame_info->count == 0;skipped = frame_info->skipped > 0;/* 如果当前帧完整则更新视频输出的相关信息 */if (complete) {if (++video->first_added == video->info.cache_size)video->first_added = 0;if (++video->available_frames == video->info.cache_size)video->last_added = video->first_added;}/* 如果当前帧被跳过,则更新相关信息并增加跳过帧的计数 */else if (skipped) {--frame_info->skipped;os_atomic_inc_long(&video->skipped_frames);}/* 解锁数据互斥锁 */pthread_mutex_unlock(&video->data_mutex);/* 返回当前帧是否完整的标志 */return complete;
}

相关文章:

obs video-io.c

video_frame_init 讲解 /* messy code alarm video_frame_init 函数用于初始化视频帧。它接受一个指向 struct video_frame 结构体的指针 frame&#xff0c; 视频格式 format&#xff0c;以及宽度 width 和高度 height。该函数根据视频格式的不同&#xff0c;计算出每个视频帧…...

简述 tcp 和 udp的区别?

简述 tcp 和 udp的区别&#xff1f; TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种不同的传输层协议&#xff0c;用于在计算机网络中进行数据传输。以下是它们的主要区别&#xff1a; 区别&#xff1…...

信息收集 - 谷歌hack

搜索引擎 FOFA网络空间测绘:https://fofa.info/ FOFA(FOcus on Assets)是一个网络空间搜索引擎,可以帮助用户快速定位和收集特定目标的信息。 ZoomEye:https://www.zoomeye.org ZoomEye 是一个网络空间搜索引擎,可以用于发现和收集特定目标的网络设备、Web应用程序、开放…...

英飞凌TC3xx之一起认识DSADC系列(七)应用实战项目二(实现旋变软解码)

英飞凌TC3xx之一起认识DSADC系列(七) 1 项目要求2 项目实现2.1 内部时钟配置2.2 输入信号配置2.3 调制器配置2.4 滤波器链路配置2.5 整流器配置3 总结本文写一篇关于DSADC的resover的载波信号生成的应用,刚刚接触DSADC的开发者很容易被手册中简短的文字描述弄的迷惑,它到底…...

【浏览器】同源策略和跨域

1. 什么是跨域 在说跨域之前,先说说同源策略,什么是同源策略呢?同源策略是浏览器的一种安全机制,减少跨站点脚本攻击(XSS,Cross Site Scripting)、跨站点请求伪造(CSRF,Cross Site Request Forgery)攻击等,因为非同源的请求会被浏览器拦截掉。 同源就是协议、域名(…...

云计算与大数据之间的羁绊(期末不挂科版):云计算 | 大数据 | Hadoop | HDFS | MapReduce | Hive | Spark

文章目录 前言&#xff1a;一、云计算1.1 云计算的基本思想1.2 云计算概述——什么是云计算&#xff1f;1.3 云计算的基本特征1.4 云计算的部署模式1.5 云服务1.6 云计算的关键技术——虚拟化技术1.6.1 虚拟化的好处1.6.2 虚拟化技术的应用——12306使用阿里云避免了高峰期的崩…...

基于jdk11和基于apache-httpclient的http请求工具类

1.基于apache-httpclient 需要引入依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.5</version></dependency> 工具类如下&#xff1a; package com.bw.e…...

Node.js(二)-模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…...

ARM AArch64的TrustZone架构详解(上)

目录 一、概述 1.1 在开始之前 二、什么是TrustZone? 2.1 Armv8-M的TrustZone 2.2 Armv9-A Realm Management Extension(RME)...

从源PC上一次性p2v(qcow2)的构想

磁盘分区表&#xff0c;虚拟硬盘文件&#xff0c;操作系统引导 1. 基本概念和术语 源硬盘&#xff1a;一般就是客户的PC机的硬盘&#xff0c;硬盘里面包含了Windows分区。 源Windows&#xff1a;以源硬盘启动的Windows环境。 虚拟磁盘文件&#xff1a;文件格式有qcow2、vhd…...

数据结构:KMP算法

1.何为KMP算法 KMP算法是由Knuth、Morris和Pratt三位学者发明的&#xff0c;所以取了三位学者名字的首字母&#xff0c;叫作KMP算法。 2.KMP的用处 KMP主要用于字符串匹配的问题&#xff0c;主要思想是当出现字符串不匹配时&#xff0c;我们可以知道一部分之前已经匹配过的的文…...

小程序真机如何清除订阅数据

在做小程序订阅消息开发的过程中发现&#xff0c;真机上如果是选择了‘总是保持以上选择’&#xff0c;一旦用户授权后&#xff0c;后面就不会再弹出申请改订阅消息的授权弹窗&#xff0c;这对于开发过程中是很不方便的。 曾试过清除缓存&#xff0c;重进小程序也不能清除掉 解…...

基于ssm出租车管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本出租车管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…...

音视频转码

音视频转码是指&#xff1a; 容器中音视频数据编码方式转换&#xff0c;如由H.264编码转成mpeg-4编码&#xff0c;mp3转成AAC&#xff1b;音视频码率的转换&#xff0c;如4Mb视频码率降为2Mb&#xff0c;视频分辨率的转换&#xff0c;如1080P转换为720P&#xff0c;音频重采样…...

编解码异常分析

前言 最近在做的项目&#xff0c;有H264解码的需求。部分H264文件解码播放后&#xff0c;显示为绿屏或者花屏。 分析 如何确认是否是高通硬解码的问题 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…...

APISpace 热门好用的API推荐,含免费次数

短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可达&#xff0c;99.99&#xff05;到达率&#xff0c;支持大容量高并发。通知短信&#xff1a;短信通知支持三大运营商以及虚拟运营商&#xff0c;我们提供电信级运维…...

Qt/QML编程学习之心得:一个.qml文件调用另一个.qml文件(十七)

在c++中,一个文件调用另外一个文件最直接最快捷的方式就是#incldue<头文件>的使用,那么在元数据描述性语言QML中,如何从一个界面描述调用另外一个界面描述,一个.qml文件调用另外一个.qml呢?QML虽然有个import,但是用法可以说完全不同于#include。 引用方法1:直接…...

C++_单列模式介绍

介绍 (1)…什么是单例 1.只能有一个实例化的对象的类(2).单例有什么用 1.多线程的线程池的设计 2.系统中只需要一个窗口时才使用单例(无法重复创建) 3.一个操作系统只能有一个文件系统(3).单例怎么用 1.隐藏所有构造函数 2.静态成员内部调用构造函数实例化 3.提供一个静态函数来…...

油烟净化器如何做到高效净化?科技力量,清新餐饮生活

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 油烟净化器的出现&#xff0c;为我们的餐饮生活注入了一抹清新的色彩。然而&#xff0c;它究竟是如何工作的&#xff1f;为何能…...

【HTML5】HTML5 语音合成

一、前言 前一段时间在项目中需要用到播报文字语音。找到了 HTML 5 有这样的功能。 现在有时间进行总结下。 二、SpeechSynthesis SpeechSynthesis 接口是语音服务的控制接口。它可以用于获取设备上关于可用的合成声音的信息&#xff0c; 开始、暂停语音&#xff0c;或者别…...

顺序表的实现

目录 一. 数据结构相关概念​ 二、线性表 三、顺序表概念及结构 3.1顺序表一般可以分为&#xff1a; 3.2 接口实现&#xff1a; 四、基本操作实现 4.1顺序表初始化 4.2检查空间&#xff0c;如果满了&#xff0c;进行增容​编辑 4.3顺序表打印 4.4顺序表销毁 4.5顺…...

深度学习中的池化

1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…...

Java面试整理-Java设计模式

Java中的设计模式通常是从更广泛的面向对象设计模式中借鉴而来的,这些模式旨在解决特定的设计问题和改善代码的可维护性、灵活性和可扩展性。设计模式大致可以分为三类:创建型、结构型和行为型。以下是这三类中一些常见的设计模式: 创建型模式 单例模式(Singleton):确保一…...

用CHAT了解更多知识点

问CHAT&#xff1a;什么是硅基生命和碳基生命&#xff1f; CHAT回复&#xff1a;硅基生命和碳基生命是两种理论性的生物体类型&#xff0c;这些生物体主要是由硅或碳元素以及其他元素构成的。 碳基生命是我们当前所熟知的生命形式。碳元素能够形成稳定且复杂的分子&#xff0c;…...

一个利用摸鱼时间背单词的软件

大家好&#xff0c;我是 Java陈序员。 最近进入了考试季&#xff0c;各种考试&#xff0c;英语四六级、考研、期末考等。不知道大家的英语四六级成绩怎么样呢&#xff1f; 记得大学时&#xff0c;英语四级都是靠高中学习积累的老本才勉强过关。 而六级则是考了多次&#xff…...

Matlab/Simulink的一些功能用法笔记(3)

01--引言 最近加入到一个项目组&#xff0c;有一些测试需要去支持&#xff0c;通过了解原先团队的测试方法后&#xff0c;自己作了如下改善&#xff0c;大大提高了工作效率。这也许就是软件开发的意义吧&#xff0c;能够去除一些重复的机械的人工操作并且结果还非常不可靠。 …...

Wafer晶圆封装工艺介绍

芯片封装的目的&#xff08;The purpose of chip packaging&#xff09;: 芯片上的IC管芯被切割以进行管芯间连接&#xff0c;通过引线键合连接外部引脚&#xff0c;然后进行成型&#xff0c;以保护电子封装器件免受环境污染&#xff08;水分、温度、污染物等&#xff09;&…...

Mac OS 13+,Apple Silicon,删除OBS虚拟摄像头(virtual camera),

原文链接: https://www.reddit.com/r/MacOS/comments/142cv OBS为了捕获摄像头视频,将虚拟摄像头插件内置为系统插件了.如下 直接删除没有权限的,要删除他,在mac os 13以后,需要关闭先关闭苹果系统的完整性保护(SIP) Apple 芯片(M1,....)的恢复模式分为两种,回退恢复模式,和…...

精解 ES6 Promise 用法

&#x1f431; 个人主页&#xff1a;SHOW科技&#xff0c;公众号&#xff1a;SHOW科技 &#x1f64b;‍♂️ 作者简介&#xff1a;2020参加工作&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;优质专栏&#x…...

Linux之基础I/O

目录 一、C语言中的文件操作 二、系统文件操作I/O 三、文件描述符fd 1、文件描述符的引入 2、对fd的理解 3、文件描述符的分配规则 四、重定向 1、重定向的原理 2、重定向的系统调用dup2 五、Linux下一切皆文件 一、C语言中的文件操作 1、打开和关闭 在C语言的文…...

Linux开发工具——gcc篇

gcc的使用 文章目录 gcc的使用 历史遗留问题&#xff08;普通用户sudo&#xff09; gcc编译过程 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&a…...

C#通讯——关于Winform中的简单的Http服务器与客户端

C#通讯——关于Winform中的简单的Http服务器与客户端 前言一、Http是什么&#xff1f;二、简单的Http服务器三、简单的Http客户端四、实际调用五、Winform中Http服务器和WebApi的区别&#xff1f; 前言 在实际项目中通讯的交互的过程中&#xff0c;遇见数据传输时同事和我说用…...

Mendelson AS2 介绍下载和配置

最近与一家国外公司做EDI对接&#xff0c;并且EDI通讯工具是基于AS2协议的。目前开源的as2的开源项目有openas2,Mendelson AS2&#xff0c;和国人写的freeas2但是&#xff0c;现在freeas2已经被从开源中国不能下载了&#xff0c;变为收费的版本了。 如果你需要使用基于AS2协议…...

旅游海报图怎么做二维码展示?扫码即可查看图片

现在旅游攻略的海报可以做成二维码印刷在宣传单单页或者分享给用户来了解目的地的实际情况&#xff0c;出行路线、宣传海报等。用户只需要扫描二维码就可以查看内容&#xff0c;更加的方便省劲&#xff0c;那么旅游海报的图片二维码制作的技巧有哪些呢&#xff1f;使用图片二维…...

常用git指令

初始化Git仓库:git init 添加文件到暂存区:git add <file> 提交更改到本地仓库:git commit -m "commit message" 查看本地仓库的提交历史:git log 创建分支:git branch <branch_name> 切换分支:git checkout <branch_name> 查看所有分支:git…...

【FPGA】分享一些FPGA协同MATLAB开发的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…...

幺模矩阵-线性规划的整数解特性

百度百科:幺模矩阵 在线性规划问题中&#xff0c;如果A为幺模矩阵&#xff0c;那么该问题具有最优整数解特性。也就是说使用单纯形法进行求解&#xff0c;得到的解即为整数解。无需再特定使用整数规划方法。 m i n c T x s . t . { A x ≥ b x ≥ 0 \begin{align*} min \quad…...

数据分析思维

Why&What 数据分析是为了驱动决策赋能业务。在数据分析过程中需要对目标进行拆解量化&#xff0c;如何拆解量化目标便是数据分析思维。 在任务拆解过程中使用的软件、统计模型、分析方法等为分析工具和手段&#xff0c;如何在恰当的场景合理的使用这些工具、模型、方法、手…...

C++ boost planner_cond_.wait(lock) 报错1225

1.如下程序段 boost unique_lock doesn’t own the mutex: Operation not permitted 问题&#xff1a; 其中makePlan是一个线程。这里的unlock导致错误这个报错 boost unique_lock doesn’t own the mutex: Operation not permitted bool navigation::makePlan(){ //cv::named…...

LeetCode刷题--- 字母大小写全排列

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回…...

165. 小猫爬山(DFS之剪枝与优化)

165. 小猫爬山 - AcWing题库 翰翰和达达饲养了 N 只小猫&#xff0c;这天&#xff0c;小猫们要去爬山。 经历了千辛万苦&#xff0c;小猫们终于爬上了山顶&#xff0c;但是疲倦的它们再也不想徒步走下山了&#xff08;呜咕>_<&#xff09;。 翰翰和达达只好花钱让它们…...

【Linux系统基础】(6)在Linux上大数据NoSQL数据库HBase集群部署、分布式内存计算Spark环境及Flink环境部署详细教程

大数据NoSQL数据库HBase集群部署 简介 HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。 和Redis一样&#xff0c;HBase是一款KeyValue型存储的数据库。 不过和Redis设计方向不同 Redis设计为少量数据&#xff0c;超快检索HBase设计为海量数据&#xff0c;…...

多维时序 | MATLAB实CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现CNN-BiGRU-Mutilhead-Attention卷积网络结合双向门控循环单元网络融合多头注意力机制多变量时间序列预测预测效果基本介…...

vs快捷键

ctrlMo 折叠代码块 ctrlML 打开代码块...

linux 内核时间计量方法

定时器中断由系统定时硬件以规律地间隔产生; 这个间隔在启动时由内核根据 HZ 值来编 程, HZ 是一个体系依赖的值, 在 <linux/param.h>中定义或者它所包含的一个子平台文 件中. 在发布的内核源码中的缺省值在真实硬件上从 50 到 1200 嘀哒每秒, 在软件模拟 器中往下到 24.…...

循环神经网络中的梯度消失或梯度爆炸问题产生原因分析(二)

上一篇中讨论了一般性的原则&#xff0c;这里我们具体讨论通过时间反向传播&#xff08;backpropagation through time&#xff0c;BPTT&#xff09;的细节。我们将展示目标函数对于所有模型参数的梯度计算方法。 出于简单的目的&#xff0c;我们以一个没有偏置参数的循环神经…...

JWT signature does not match locally computed signature

1. 问题背景 最近在协助团队小盆友调试一个验签问题&#xff0c;结果还“节外生枝”了&#xff0c;原来不是签名过程的问题&#xff0c;是token的问题。 当你看到“JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not…...

vitepress项目使用github的action自动部署到github-pages中,理论上可以通用所有

使用github的action自动部署到github-pages中 创建部署的deploy.yml文件&#xff0c;在项目的根目录下面 .github\workflows\deploy.yml 完整的代码&#xff1a;使用的是pnpm进行依赖安装。 name: 部署VitePresson:push:branches:- docs # 这段是在推送到 docs 分支时触发该…...

Python爬虫---解析---JSONPath

Xpath可以解析本地文件和服务器响应的文件&#xff0c;JSONPath只能解析本地文件 1. 安装jsonpath&#xff1a;pip install jsonpath 注意&#xff1a;需要安装在python解释器相同的位置,例如&#xff1a;D:\Program Files\Python3.11.4\Scripts 2. 使用步骤 2.1 导入&…...

路由器介绍和命令操作

先来回顾一下上次的内容&#xff1a; ip地址就是由32位二进制数组 二进位数就是只有数字0和1组成 网络位&#xff1a;类似于区号&#xff0c;表示区域作用 主机位&#xff1a;类似于号码&#xff0c;表示区域中编号 网络名称&#xff1a;网络位不变&#xff0c;主机位全为0 …...