Hi3518E官方录像例程源码流程分析(三)
文章目录
- 第二阶段,初始化第一阶段计算好的参数
- SAMPLE_COMM_SYS_Init
- 第三阶段,启动VI和chn捕获
- SAMPLE_COMM_VI_StartVi()
- SAMPLE_COMM_VI_StartBT656
- 小阶段1 SAMPLE_COMM_VI_StartMIPI_BT1120()
- 小阶段1 SAMPLE_COMM_VI_StartDev()
- HI_MPI_ISP_GetWDRMode
- HI_MPI_VI_SetWDRAttr
- HI_MPI_VI_EnableDev
- 小阶段二 配置和启动VI捕获通道
- SAMPLE_COMM_VI_StartChn()
- HI_MPI_VI_SetRotate
- HI_MPI_VI_EnableChn
源码地址 + 文档资料 – 提取码: chmr
本专栏分析的是mpp\venc\sample\sample_venc.c
第二阶段,初始化第一阶段计算好的参数
/******************************************step 2: mpp system init. ******************************************/s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);//VB_CONF_S stVbConf;if (HI_SUCCESS != s32Ret){SAMPLE_PRT("system init failed with %d!\n", s32Ret);goto END_VENC_1080P_CLASSIC_0;}
第二阶段的内容还是很简单的,就是把第一阶段计算好的参数都初始化进系统
SAMPLE_COMM_SYS_Init
先是函数SAMPLE_COMM_SYS_Init
里面的内容也很简单,调用到的函数都是海思官方提供的库函数,我们也没办法看到函数的内部实现,在我给的链接里也有官方的数据手册,里面也有写每个API都是干嘛的
MPP_SYS_CONF_S stSysConf = {0};HI_S32 s32Ret = HI_FAILURE;//In case there are things left behind before that have not been cleaned up.HI_MPI_SYS_Exit();//firstHI_MPI_VB_Exit(); //lastif (NULL == pstVbConf){SAMPLE_PRT("input parameter is null, it is invaild!\n");return HI_FAILURE;}s32Ret = HI_MPI_VB_SetConf(pstVbConf);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("HI_MPI_VB_SetConf failed!\n");return HI_FAILURE;}s32Ret = HI_MPI_VB_Init();if (HI_SUCCESS != s32Ret){SAMPLE_PRT("HI_MPI_VB_Init failed!\n");return HI_FAILURE;}stSysConf.u32AlignWidth = SAMPLE_SYS_ALIGN_WIDTH;s32Ret = HI_MPI_SYS_SetConf(&stSysConf);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("HI_MPI_SYS_SetConf failed\n");return HI_FAILURE;}s32Ret = HI_MPI_SYS_Init();if (HI_SUCCESS != s32Ret){SAMPLE_PRT("HI_MPI_SYS_Init failed!\n");return HI_FAILURE;}
这里进来先是调用了两个清理函数
HI_MPI_SYS_Exit();//firstHI_MPI_VB_Exit(); //last
应该是用来防止之前留下的内容没被清理或释放
然后再需要注意一下的就是函数的调用顺序
先清理SYS空间,再是VB(缓存池)
后面的函数是用来设置第一阶段计算好的参数和缓存池,调用顺序是先设置VB,再是SYS
第二阶段的内容就这些,比较简单
第三阶段,启动VI和chn捕获
视频输入(VI)模块实现的功能:VI 可以对接收到的原始视频图像数据进行裁剪(Crop)等处理,并实现一路原始视频图像输入,输出一路视频图像功能。
虽然阶段三看着只有一个函数,但是里面的内容就多了
/******************************************step 3: start vi dev & chn to capture******************************************/stViConfig.enViMode = SENSOR_TYPE;stViConfig.enRotate = ROTATE_NONE;stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO;stViConfig.enViChnSet = VI_CHN_SET_NORMAL;stViConfig.enWDRMode = WDR_MODE_NONE;s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("start vi failed!\n");goto END_VENC_1080P_CLASSIC_1;}
第三阶段前面先是设置了一些视频参数
stViConfig.enViMode = SENSOR_TYPE;这个是传感器类型,前面提到过的我用的传感器是AR0130
stViConfig.enRotate = ROTATE_NONE;这个参数决定了输出的视频是否需要旋转,如输出的视频是原视频旋转90度或180度这种
stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO;这个再上一章节也有提到,就是PAL和NTSC两种格式,这里选的是AUTO自动选择
stViConfig.enViChnSet = VI_CHN_SET_NORMAL;这个参数决定输出的视频是否翻转或镜像
stViConfig.enWDRMode = WDR_MODE_NONE;WDR(Wide Dynamic Range),宽动态
SAMPLE_COMM_VI_StartVi()
HI_S32 SAMPLE_COMM_VI_StartVi(SAMPLE_VI_CONFIG_S* pstViConfig)
{HI_S32 s32Ret = HI_SUCCESS;SAMPLE_VI_MODE_E enViMode; if(!pstViConfig){SAMPLE_PRT("%s: null ptr\n", __FUNCTION__);return HI_FAILURE;}enViMode = pstViConfig->enViMode;//Determine whether the image source is a sensorif(!IsSensorInput(enViMode)){s32Ret = SAMPLE_COMM_VI_StartBT656(pstViConfig);}else{ //sansor choices32Ret = SAMPLE_COMM_VI_StartIspAndVi(pstViConfig);}return s32Ret;
}
进来以后会先进入这个if判断
这里面就是判断是否支持之前定义过的视频格式
if(!IsSensorInput(enViMode)){........}IsSensorInput()
{switch(enViMode){case SAMPLE_VI_MODE_1_D1:case SAMPLE_VI_MODE_BT1120_1080P:case SAMPLE_VI_MODE_BT1120_720P:bRet = HI_FALSE;break;default:break;}
}
然后我们命中到这个函数
SAMPLE_COMM_VI_StartBT656
这里面的内容就多了
VI_DEV ViDev;VI_CHN ViChn;HI_U32 u32DevNum = 1;HI_U32 u32ChnNum = 1;
进来先是设备数和通道数初始化
小阶段1 SAMPLE_COMM_VI_StartMIPI_BT1120()
HI_S32 SAMPLE_COMM_VI_StartMIPI_BT1120(SAMPLE_VI_MODE_E enViMode)
{HI_S32 fd;combo_dev_attr_t *pstcomboDevAttr = NULL;fd = open("/dev/hi_mipi", O_RDWR);if (fd < 0){printf("warning: open hi_mipi dev failed\n");return -1;}if( (enViMode == SAMPLE_VI_MODE_BT1120_720P)||(enViMode == SAMPLE_VI_MODE_BT1120_1080P) ){pstcomboDevAttr = &MIPI_BT1120_ATTR;}else{}if (NULL == pstcomboDevAttr){printf("Func %s() Line[%d], unsupported enViMode: %d\n", __FUNCTION__, __LINE__, enViMode);close(fd);return HI_FAILURE; }if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)){printf("set mipi attr failed\n");close(fd);return HI_FAILURE;}close(fd);return HI_SUCCESS;
}
这里面就是打开vi驱动设备了
fd = open("/dev/hi_mipi", O_RDWR);
ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)
打开设备以后在根据设备数量启动设备
由手册可知Hi3518EV200只有一个vi设备
小阶段1 SAMPLE_COMM_VI_StartDev()
进来先是开辟内存空间?
根据我的传感器会定位到这个
case APTINA_AR0130_DC_720P_30FPS:memcpy(&stViDevAttr,&DEV_ATTR_9M034_DC_720P_BASE,sizeof(stViDevAttr));break;
然后就是把前面设置的参数真正写入硬件处理,调用到的也是海思官方提供的库函数
就是之前这些
stViConfig.enViMode = SENSOR_TYPE;stViConfig.enRotate = ROTATE_NONE;stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO;stViConfig.enViChnSet = VI_CHN_SET_NORMAL;stViConfig.enWDRMode = WDR_MODE_NONE;
然后是海思官方的宽动态(WDR)设置
HI_MPI_ISP_GetWDRMode
HI_MPI_VI_SetWDRAttr
设备启动
HI_MPI_VI_EnableDev
小阶段二 配置和启动VI捕获通道
由手册得3518EV支持一个物理通道和两个扩展通道
视频物理通道负责将输入设备解析后得到的视频数据输出到 DDR。在真正将数据
输出到 DDR 之前,它可以实现裁剪等功能,
扩展通道是物理通道的扩展,主要实现缩放功能,其数据来源于物理通道。
Hi3516A/Hi3518EV200/Hi3519V100 最多支持 16 个扩展通道。
物理通道Chn0和扩展通道Chn1,Chn2
阶段二先是对各个通道输出的视频尺寸大小做了设置
switch (enViMode){case SAMPLE_VI_MODE_BT1120_720P: stCapRect.u32Width = 1280;stCapRect.u32Height = 720;break;case SAMPLE_VI_MODE_BT1120_1080P: stCapRect.u32Width = 1920;stCapRect.u32Height = 1080;break; default:stCapRect.u32Width = 1920;stCapRect.u32Height = 1080;break;}
然后进入这个函数
SAMPLE_COMM_VI_StartChn()
进来以后就是设置每个通道输出的视频的大小,是否旋转,是否镜像,是否翻转,是什么格式YUV420 \ 422
if(pstViConfig){enViChnSet = pstViConfig->enViChnSet;enRotate = pstViConfig->enRotate;}/* step 5: config & start vicap dev */memcpy(&stChnAttr.stCapRect, pstCapRect, sizeof(RECT_S));stChnAttr.enCapSel = VI_CAPSEL_BOTH;/* to show scale. this is a sample only, we want to show dist_size = D1 only */stChnAttr.stDestSize.u32Width = pstTarSize->u32Width;stChnAttr.stDestSize.u32Height = pstTarSize->u32Height;stChnAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420; /* sp420 or sp422 */stChnAttr.bMirror = HI_FALSE;stChnAttr.bFlip = HI_FALSE;switch(enViChnSet){case VI_CHN_SET_MIRROR:stChnAttr.bMirror = HI_TRUE;break;case VI_CHN_SET_FLIP:stChnAttr.bFlip = HI_TRUE;break;case VI_CHN_SET_FLIP_MIRROR:stChnAttr.bMirror = HI_TRUE;stChnAttr.bFlip = HI_TRUE;break;default:break;}
默认的帧率控制
stChnAttr.s32SrcFrameRate = -1;stChnAttr.s32DstFrameRate = -1;
然后是海思的设置通道参数的库函数
HI_MPI_VI_SetRotate
打开通道
HI_MPI_VI_EnableChn
相关文章:
Hi3518E官方录像例程源码流程分析(三)
文章目录 第二阶段,初始化第一阶段计算好的参数SAMPLE_COMM_SYS_Init 第三阶段,启动VI和chn捕获SAMPLE_COMM_VI_StartVi()SAMPLE_COMM_VI_StartBT656小阶段1 SAMPLE_COMM_VI_StartMIPI_BT1120()小阶段1 SAM…...
37.Java 异步回调(CompletableFuture 概述、CompletableFuture 使用)
一、CompletableFuture 概述 CompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞,可以使得任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是…...
数学建模AI智能体(4.16大更新)
别的不说就说下面这几点,年初内卷到现在,就现阶段AI水平,卷出了我比较满意的作品,这里分享给各位同学,让你们少走弯路: 1.轻松辅导学生 2.帮助学习 3.突破知识壁垒,缩短与大佬的差距 4.打破…...
Python 第三节 流程控制
目录 1.分支结构 条件控制 2.循环语句 3.循环控制语句 4.嵌套循环 控制代码执行的顺序 顺序结构分支结构循环结构 1.分支结构 条件控制 让代码有自主选择的能力, 当满足某个条件的时候执行对应的操作 1.1 if语句 语法格式 if 判断条件:执行语句(当判断条件为真的时候执…...
深入探究Linux编译器gcc/g++:从基础到进阶
目录 一、编译的幕后流程 (一)预处理:宏与文件的魔法融合 (二)编译:代码规范性的严格审视 (三)汇编:迈向机器语言的关键一步 (四)连接&a…...
用户态网络缓冲区
用户态网络缓冲区 缓冲区作用 用于临时存储数据以便高效地进行读写操作。用户态缓冲区位于用户空间中,与内核空间中的缓冲区(内核缓冲区)相对。 用户态接受缓存区 粘包问题,缓存非完整数据包 生产者的速度 > 消费者的速…...
解决Flutter 2.10.5在升级Xcode 16后的各种报错
Flutter 环境 Flutter version 2.10.5Dart version 2.16.2DevTools version 2.9.2CocoaPods version 1.16.2Xcode 16.3 问题一:XCResult parsing error: Error: This command is deprecated and will be removed in a future release, --legacy flag is required t…...
【学习笔记】计算机网络(八)—— 音频/视频服务
第8章 互联网上的音频/视频服务 文章目录 第8章 互联网上的音频/视频服务8.1概述8.2 流式存储音频/视频8.2.1 具有元文件的万维网服务器8.2.2 媒体服务器8.2.3 实时流式协议 RTSP 8.3 交互式音频/视频8.3.1 IP 电话概述8.3.2 IP电话所需要的几种应用协议8.3.3 实时运输协议 RTP…...
OpenCv高阶(三)——图像的直方图、图像直方图的均衡化
目录 一、直方图 1、计算并显示直方图 2、使用matplotlib方法绘制直方图(不划分小的子区间) 3、使用opencv的方法绘制直方图 (划分16个小的子亮度区间) 4、绘制彩色图像的直方图,将各个通道的直方图值都画出来 二、…...
OpenCV 图形API(39)图像滤波----同时计算图像在 X 和 Y 方向上的一阶导数函数SobelXY()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::gapi::SobelXY 函数是 OpenCV 的 G-API 模块中用于同时计算图像在 X 和 Y 方向上的一阶导数(即 Sobel 边缘检测)的一…...
领麦微:电炖锅红外测温传感器应用,告别糊锅干烧
领麦微红外测温传感器在电炖锅中的应用,特别是在应对高温环境、实现精准测温以保留食材营养、有效防止干烧与糊锅现象,以及提供安全烹饪新保障等方面,展现出了其独特的技术优势和应用价值。以下是对这些应用特点的深入剖析: 一、高…...
(Linux操作系统)自定义shell的实现
讲自定义shell之前我们先看一个东西,那就是进程替换,我们想要父进程fork之后的子进程之后运行一个全新的程序那该怎么办呢? 这里就要用一个叫做进程替换的一个东西了,程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的…...
安卓jks提取pem和pk8文件
你需要安装: Java Keytool OpenSSL 系统要求:Mac/Linux/Windows 都可以。 keytool -importkeystore -srckeystore holder-keystore.jks -destkeystore holder-keystore.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass yzhafzKPj4 -dest…...
人脸检测-人脸关键点-人脸识别-人脸打卡-haar-hog-cnn-ssd-mtcnn-lbph-eigenface-resnet
链接:https://pan.baidu.com/s/1VhGdyIW5GWuTNkfbCEc5eA?pwdz0eo 提取码:z0eo --来自百度网盘超级会员V2的分享 创建环境 conda create -n 环境名称python3.8 conda activate 环境名称 然后配置环境 pip install requirements.txt 运行程序&…...
Gobuster :dir、dns、vhost
Gobuster 及其相关技术知识必须用于法律明确允许的场景!!! 1. dir 模式:目录/文件枚举 用途:扫描目标网站的目录和文件,常用于发现隐藏资源或敏感文件。 关键参数: -u URL&am…...
Vue+Threejs项目性能优化
使用Vue和Three.js开发的项目,但运行一段时间后电脑内存就满了,导致性能下降甚至崩溃,分析内存泄漏的原因优化如下: 资源释放管理 手动释放Three.js资源: 在Vue组件的beforeDestroy或destroyed生命周期中࿰…...
Leetcode - 双周赛135
目录 一、3512. 使数组和能被 K 整除的最少操作次数二、3513. 不同 XOR 三元组的数目 I三、3514. 不同 XOR 三元组的数目 II四、3515. 带权树中的最短路径 一、3512. 使数组和能被 K 整除的最少操作次数 题目链接 本题实际上求的就是数组 nums 和的余数,代码如下&…...
[特殊字符] PostgreSQL MCP 开发指南
简介 🚀 PostgreSQL MCP 是一个基于 FastMCP 框架的 PostgreSQL 数据库交互服务。它提供了一套简单易用的工具函数,让你能够通过 API 方式与 PostgreSQL 数据库进行交互。 功能特点 ✨ 🔄 数据库连接管理与重试机制🔍 执行 SQL…...
等离子体浸没离子注入(PIII)
一、PIII 是什么?基本原理和工艺 想象一下,你有一块金属或者硅片(就是做芯片的那种材料),你想给它的表面“升级”,让它变得更硬、更耐磨,或者有其他特殊功能。怎么做呢?PIII 就像是用…...
TinyEngine 2.4版本正式发布:文档全面开源,实现主题自定义,体验焕新升级!
本文由体验技术团队李璇原创。 前言 TinyEngine低代码引擎使开发者能够定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过cli创建个人工程进行二次开发,实时定制出自己的低…...
gemini讲USRP
您好!USRP (Universal Software Radio Peripheral) 是一种软件无线电 (SDR) 设备系列,由 Ettus Research (现为 National Instruments 旗下公司) 开发和销售。USRP 提供了一个灵活且可配置的平台,用于设计、原型开发和部署各种无线通信系统。…...
智能超表面通信控制板--通道电压并行控制版
可重构智能超表面(Reconfigurable Intelligent Surface, RIS)技术是一种新兴的人工电磁表面技术,它通过可编程的方式对电磁波进行智能调控,从而在多个领域展现出巨大的应用潜力。超表面具有低成本、低能耗、可编程、易部署等特点&…...
Spring Task(笔记)
介绍: 应用场景: cron表达式: cron表达式在线生成器: 入门案例:...
YOLOv3的改进思路与方法:解析技术难点与创新突破
YOLOv3作为目标检测领域的经典算法,凭借其出色的速度和性能平衡获得了广泛应用。然而,随着计算机视觉技术的不断发展,YOLOv3在某些场景下的局限性也逐渐显现。本文将深入分析YOLOv3的不足之处,并系统介绍常见的改进策略和方法&…...
【解锁元生代】ComfyUI工作流与云原生后端的深度融合:下一代AIGC开发范式革命
## 从单机到云原生的认知跃迁 当2023年Stable Diffusion WebUI还在争夺本地显卡性能时,ComfyUI已悄然开启工作流模块化革命;当2024年AI绘画工具陷入"参数调优内卷",云原生技术正重塑AI开发的基础设施层。二者的深度融合࿰…...
shell 编程之正则表达式与文本处理器
目录 一、正则表达式 1. 概念 2. 作用 3. 分类 二、基础正则表达式(BRE) grep 命令选项 三、扩展正则表达式(ERE) 与 BRE 的区别 四、文本处理器 1. sed 工具 2. awk 工具 五、总结 总结对比 元字符总结 工具对比与…...
Shell编程之正则表达式与文本处理器
目录 一、引言 二、正则表达式 2.1 定义与用途 2.2 基础正则表达式 2.2.1 查找特定字符 2.2.2 利用中括号 “[]” 查找集合字符 2.2.3 查找行首 “^” 与行尾字符 “$” 2.2.4 查找任意一个字符 “.” 与重复字符 “*” 2.2.5 查找连续字符范围 “{}” 2.3 元字符总结…...
TMDOG——语言大模型进行意图分析驱动后端实践
语言大模型进行意图分析驱动后端实践 项目概述 项目地址:https://github.com/TMDOG666/AI_Backend_Demo 该项目通过语言大模型,通过分析用户意图、拆分任务、构建API调用链来驱动后端实践。 以一个简单的教务系统后端为例,将教务系统后端…...
未启用CUDA支持的PyTorch环境** 中使用GPU加速解决方案
1. 错误原因分析 根本问题:当前安装的PyTorch是CPU版本,无法调用GPU硬件加速。当运行以下代码时会报错:model YOLO("yolov8n.pt").to("cuda") # 或 .cuda()2. 解决方案步骤 步骤1:验证CUDA可用性 在Pyth…...
【mysql】Mac 通过 brew 安装 mysql 、启动以及密码设置
Mac 通过 brew 安装 mysql 、启动以及密码设置 使用 brew 安装 mysqlmysql 启动mysql密码设置参考文章: 使用 brew 安装 mysql brew install mysqlmysql 启动 下载完毕,终端告诉我们mysql数据库没有设置密码的,我们可以直接执行 mysql -u r…...
Vue2 nextTick
核心源码位置 Vue 2 的 nextTick 实现主要在 src/core/util/next-tick.js 文件中。 完整源码结构 import { noop } from shared/util import { handleError } from ./error import { isIE, isIOS, isNative } from ./envexport let isUsingMicroTask falseconst callbacks …...
Ubuntu 安装 NVIDIA显卡驱动、CUDA 以及 CuDNN工具
文章目录 一、简介二、查看显卡设备三、安装显卡驱动四、安装CUDA工具箱五、安装CuDNN小结 一、简介 NVIDIA 驱动:操作系统与 NVIDIA 显卡硬件之间的桥梁,负责驱动显卡硬件的运行,显卡的“底层操作系统”,一切的基础。CUDA&#…...
LeetCode算法题(Go语言实现)_50
题目 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。 实现 SmallestInfiniteSet 类: SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。 int popSmallest() 移除 并返回该无限集中的最小整数。 void addBack(int num) 如果正整数 …...
idea报错java: 非法字符: ‘\ufeff‘解决方案
解决方案步骤以及说明 BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题? 最后重新编译,即可运行!!! BOM是什么? \ufeff 是 Unicode 中的 BOM࿰…...
WPF依赖注入IHostApplicationLifetime关闭程序
WPF依赖注入IHostApplicationLifetime关闭程序 使用Application.Current.Shutdown();退出会报异常 应该使用 app.Dispatcher.InvokeShutdown(); Application.Current.Shutdown();app.Dispatcher.InvokeShutdown();static App app new();[STAThread]public static void Main(…...
如何在 IntelliJ IDEA 中安装通义灵码 - AI编程助手提升开发效率
随着人工智能技术的飞速发展,AI 编程助手已成为提升开发效率和代码质量的强大工具。在众多 AI 编程助手之中,阿里云推出的通义灵码凭借其智能代码补全、代码解释、生成单元测试等丰富功能,脱颖而出,为开发者带来了全新的编程体验。…...
【力扣】两两交换链表中的节点
两两交换链表中的节点 代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *n…...
数据共享交换平台之文件交换
数据共享交换平台的文件交换管理功能提供部门与部门之间的文件交换通道,满足跨部门之间文件交换需求。文件交换需要能够按照交换业务场景对交换通道进行分类管理。文件交换管理需满足如下要求: 1.文件交换统计:支持查看本部门与其他部门之间…...
什么是全球代理?如何选择全球代理服务?
在全球化不断深化的今天,互联网已经成为人类沟通、工作和学习的重要纽带。而全球代理则是这一纽带上的关键技术之一,它赋予了我们探索不同地区网络资源的能力。今天,我们来聊聊什么是全球代理、它能做什么,以及如何选择合适的全球…...
Spring Boot整合Kafka的详细步骤
1. 安装Kafka 下载Kafka:从Kafka官网下载最新版本的Kafka。 解压并启动: 解压Kafka文件后,进入bin目录。 启动ZooKeeper:./zookeeper-server-start.sh ../config/zookeeper.properties。 启动Kafka:./kafka-server-…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——USB WIFI测试 #WIFI蓝牙二合一 #RTL8733BU
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——USB…...
Doip功能寻址走UDP协议
目前使用 connect()函数的UDP客户端 ,这里接收数据 解析的地方 查看一下。 如果使用 bind()、sendto()、recvfrom() 组合 那么返回值 和发送要在做调整,,根据业务需要后续在调整 其余的 和原来的 逻辑都是一样的,只是协议变了而已。 if serv…...
硬件电路设计之51单片机(2)
声明:绘制原理图和PCB的软件为嘉立创EDA。根据B站尚硅谷嵌入式之原理图&PCB设计教程学习所作个人用笔记。 目录 一、原理图详解 1、TypeC接口 (1)TypeC接口介绍 (2)TypeC原理图 2、5V转3.3V 3、单片机电源开…...
Deeplizard 深度学习课程(一)—— Pytorch 和 Tensor 简介
前言 该pytorch笔记参考deeplizard官方网站课程,有相应视频和博客,链接如下: deeplizardhttps://deeplizard.com/learn/video/v5cngxo4mIg 1.Pytorch 简介 PyTorch 是一个深度学习框架和一个科学计算包。PyTorch 的科学计算方面主要是 PyTo…...
Delphi HMAC算法
1. 前言 今天做一个三方接口,接口文档描述签名采用MD5,但是实际测试过程中,始终校验不通过,经过和三方沟通,才知道采用的是HMAC-MD5。由于Delphi7没有对HMAC的支持,则采用XE版本来支持。本次使用Delphi XE …...
Ubuntu服务器性能调优指南:从基础工具到系统稳定性提升
一、性能监控工具的三维应用 1.1 监控矩阵构建 通过组合工具搭建立体监控体系: # 实时进程监控 htop --sort-keyPERCENT_CPU# 存储性能采集 iostat -dx 2# 内存分析组合拳 vmstat -SM 1 | awk NR>2 {print "Active:"$5"MB Swpd:"$3"…...
深度解析C++开源OCR引擎:架构、编译优化与工业级部署指南
1. 引言:OCR技术演进与现状分析 光学字符识别(OCR)技术经历了从传统模式识别到深度学习的三代发展: 第一代:基于模板匹配(1970s-1990s) 第二代:特征提取+分类器(1990s-2010s) 第三代:端到端深度学习(2010s-至今) 当前工业界主流方案呈现"双轨制"发展态势…...
关于Newtonsoft.Json
历史 Newtonsoft.Json(也称为 Json.NET)是由 James Newton - King 开发的一个开源的 JSON 处理库,它于 2007 年首次发布。在早期,.NET 平台缺乏一个强大且灵活的 JSON 处理工具,Newtonsoft.Json 应运而生,…...
Spark-Sql编程(三)
一、数据加载与保存 通用方式:使用spark.read.load和df.write.save,通过format指定数据格式(如csv、jdbc、json等),option设置特定参数(jdbc格式下的url、user等),load和save指定路…...
CTF--好像需要管理员
一、原网页: 二、步骤: 1.扫描: 发现:robots.txt 2.打开robots.txt: 3.打开resul.php: 4.代码解析: if ($_GET[x]$password) //检查通过 URL 参数 x 传递的值是否等于变量 $password 的值 详…...