通过多线程分别获取高分辨率和低分辨率的H264码流
目录
一.RV1126 VI采集摄像头数据并同时获取高分辨率码流和低分辨率码流流程
编辑
1.1初始化VI模块:
1.2初始化RGA模块:
1.3初始化高分辨率VENC编码器、 低分辨率VENC编码器:
1.4 VI绑定高分辨率VENC编码器,VI绑定RGA模块,伪代码如下:
1.5 创建多线程获取高分辨率编码数据:
1.6 创建多线程获取低分辨率数据并传输到编码器:
1.7.创建多线程获取低分辨率编码数据:
三.运行的效果:
一.RV1126 VI采集摄像头数据并同时获取高分辨率码流和低分辨率码流流程
RV1126利用多线程同时获取高分辨率编码文件、低分辨率编码文件,一般要分为上图8个步骤:VI模块初始化、RGA图像模块初始化、高分辨率编码器的初始化、低分辨率编码器的初始化、VI绑定高分辨率VENC编码器、创建多线程获取高分辨率编码数据、创建多线程获取低分辨率数据并传输到编码器、创建多线程获取低分辨率编码数据。
1.1初始化VI模块:
VI模块的初始化实际上就是对VI_CHN_ATTR_S的参数进行设置、然后调用RK_MPI_VI_SetChnAttr设置VI模块并使能RK_MPI_VI_EnableChn,伪代码如下:
VI_CHN_ATTR_S vi_chn_attr;
。。。。。。。。。。。。。。。(这里是设置VI的属性)
ret = RK_MPI_VI_SetChnAttr(CAMERA_ID, 0, &vi_chn_attr);
ret |= RK_MPI_VI_EnableChn(CAMERA_ID, 0);
1.2初始化RGA模块:
RGA主要的作用是缩放VI模块的分辨率,比方说:VI模块的分辨率1920 * 1080,经过RGA缩放后分辨率为1280 * 720,并利用RK_MPI_RGA_CreateChn创建RGA模块,伪代码如下:
RGA_ATTR_S rga_attr;
rga_attr.stImgIn.u32Width = 1920;
rga_attr.stImgIn.u32Height = 1080;
。。。。。。。。。
rga_attr.stImgOut.u32Width = 1280;
rga_attr.stImgOut.u32Height = 720;
。。。。。。。。。。。
RK_MPI_RGA_CreateChn(RGA_CHN_ID, &rga_attr);
这段代码的核心是输入图像(输入分辨率是原分辨率和VI模块一致)和输出分辨率(输出分辨率是自己设置的分辨率)的设置。比方说输入的分辨率是 : 1920*1080,那stImgIn.u32Width = 1920 、stImgIn.u32Height = 1080,输出图像成:1280 * 720,stImgOut.u32Width = 1280、stImgOut.u32Height = 720。
1.3初始化高分辨率VENC编码器、 低分辨率VENC编码器:
高分辨率编码器的初始化
VENC_CHN_ATTR_S high_venc_chn_attr;
high_venc_chn_attr.stVencAttr.u32PicWidth = 1920;
high_venc_chn_attr.stVencAttr.u32PicHeight = 1080;
high_venc_chn_attr.stVencAttr.u32VirWidth = 1920;
high_venc_chn_attr.stVencAttr.u32VirHeight = 1080;
................................
RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &high_venc_chn_attr);
低分辨率编码器的初始化
VENC_CHN_ATTR_S low_venc_chn_attr;
low_venc_chn_attr.stVencAttr.u32PicWidth = 1280;
low_venc_chn_attr.stVencAttr.u32PicHeight = 720;
low_venc_chn_attr.stVencAttr.u32VirWidth = 1280;
low_venc_chn_attr.stVencAttr.u32VirHeight = 720;
................................
RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &low_venc_chn_attr);
高分辨率和低分辨率最核心的设置就是分辨率的设置,高分辨率u32PicWidth = 1920、u32PicHeight = 1920,低分辨率u32PicWidth = 1280、u32PicHeight = 720
1.4 VI绑定高分辨率VENC编码器,VI绑定RGA模块,伪代码如下:
//VI模块绑定RGA模块
MPP_CHN_S vi_chn_s;
vi_chn_s.enModId = RK_ID_VI;
vi_chn_s.s32ChnId = CAMERA_CHN;
MPP_CHN_S rga_chn_s;
rga_chn_s.enModId = RK_ID_RGA;
rga_chn_s.s32ChnId = RGA_CHN_ID;
RK_MPI_SYS_Bind(&vi_chn_s, &rga_chn_s);
//VI模块绑定高分辨率VENC模块
MPP_CHN_S high_venc_chn_s;
high_venc_chn_s_s.enModId = RK_ID_VENC;
high_venc_chn_s_s.s32ChnId = HIGH_VENC_ID;
RK_MPI_SYS_Bind(&vi_chn_s, &high_venc_chn_s);
1.5 创建多线程获取高分辨率编码数据:
开启一个线程去采集每一帧高分辨率的VENC模块数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_VENC,通道号ID是高分辨率VENC创建的ID号:
while(1)
{
.........................
mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, HIGH_VENC_ID, -1);
fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1,high_venc_id);
.......................
}
1.6 创建多线程获取低分辨率数据并传输到编码器:
开启一个线程去采集每一帧RGA低分辨率的数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_RGA,通道号ID是RGA的通道ID,采集完每一帧RGA数据则使用RK_MPI_SYS_SendMediaBuffer传输到低分辨率编码器。这个API伪代码如下:
while (1)
{
.........................................
mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, 0, -1);
RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_ID, mb);
................................
}
下面我们来看看RK_MPI_SYS_SendMediaBuffer的具体实现:
RK_S32 RK_MPI_SYS_SendMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, MEDIA_BUFFER buffer);
enModID:开发者需要传输的目的模块的ID号,比方说VI模块的数据传输到VENC模块,那么目的模块就是VENC,ID号就是RK_ID_VENC;比方说VI模块的数据传输到RGA模块,那么目的模块就是RGA,ID号就是RK_ID_RGA。
s32ChnID:目的模块的通道号
buffer:缓冲区数据MediaBuffer
1.7.创建多线程获取低分辨率编码数据:
开启一个线程去采集每一帧低分辨率的编码数据,使用的API是RK_MPI_SYS_GetMediaBuffer, 模块ID是RK_ID_VENC,通道号ID是低分辨率VENC创建的ID号。这个API伪代码如下:
while (1)
{
.........................................
mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, LOW_VENC_ID, -1);
fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, low_venc_file);
................................
}
二.代码实战
#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>// #include "common/sample_common.h"
#include "rkmedia_api.h"#define PIPE_ID 0
#define VI_CHN_ID 0#define RGA_CHN_ID 0#define HIGH_VENC_CHN 0
#define LOW_VENC_CHN 1//创建多线程获取高分辨率的编码码流
void *get_high_venc_thread(void *args)
{pthread_detach(pthread_self());FILE *high_venc_file = fopen("test_high_venc.h264", "w+");MEDIA_BUFFER mb;while (1){//获取每一帧高分辨率编码码流数据mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, HIGH_VENC_CHN, -1);if (!mb){printf("Get High Venc break.....\n");}printf("Get High Venc Success.....\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, high_venc_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}//创建多线程获取RGA码流并发送到低分辨率编码器
void *rga_handle_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb;while (1){//获取每一帧RGA码流数据mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, RGA_CHN_ID, -1);if (!mb){printf("Get RGA break.....\n");}printf("Get RGA Success.....\n");//发送每一帧RGA数据到低分辨率编码器RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, mb);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}//创建多线程获取低分辨率编码码流
void *get_low_venc_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb;FILE * low_venc_file = fopen("test_low_venc.h264", "w+");while (1){//获取每一帧低分辨率编码码流mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, -1);if (!mb){printf("Get LOW VENC break.....\n");}printf("Get LOW VENC Success.....\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, low_venc_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}int main(int argc, char *argv[])
{int ret;RK_MPI_SYS_Init();// VI Init......VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = "rkispp_scale0";//设置视频设备节点路径vi_chn_attr.u32Width = 1920;//设置分辨率的宽度vi_chn_attr.u32Height = 1080;//设置分辨率的高度vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;//设置图像类型vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;//设置VI获取类型vi_chn_attr.u32BufCnt = 3;//设置缓冲数量vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;//设置VI工作类型ret = RK_MPI_VI_SetChnAttr(PIPE_ID, VI_CHN_ID, &vi_chn_attr);if (ret){printf("VI_CHN_ATTR Set Failed.....\n");return -1;}else{printf("VI_CHN_ATTR Set Success.....\n");}ret = RK_MPI_VI_EnableChn(PIPE_ID, VI_CHN_ID);if (ret){printf("VI_CHN_ATTR Enable Failed.....\n");return -1;}else{printf("VI_CHN_ATTR Enable Success.....\n");}// RGARGA_ATTR_S rga_info;/**Image Input ..............*/rga_info.stImgIn.u32Width = 1920;//设置RGA输入分辨率宽度rga_info.stImgIn.u32Height = 1080;//设置RGA输入分辨率高度rga_info.stImgIn.u32HorStride = 1920;//设置RGA输入分辨率虚宽rga_info.stImgIn.u32VirStride = 1080;//设置RGA输入分辨率虚高rga_info.stImgIn.imgType = IMAGE_TYPE_NV12;//设置ImageType图像类型rga_info.stImgIn.u32X = 0;//设置X坐标rga_info.stImgIn.u32Y = 0;//设置Y坐标/**Image Output......................*/rga_info.stImgOut.u32Width = 1280;//设置RGA输出分辨率宽度rga_info.stImgOut.u32Height = 720;//设置RGA输出分辨率高度rga_info.stImgOut.u32HorStride = 1280;//设置RGA输出分辨率虚宽rga_info.stImgOut.u32VirStride = 720;//设置RGA输出分辨率虚高rga_info.stImgOut.imgType = IMAGE_TYPE_NV12;//设置输出ImageType图像类型rga_info.stImgOut.u32X = 0;//设置X坐标rga_info.stImgOut.u32Y = 0;//设置Y坐标// RGA Public Parameterrga_info.u16BufPoolCnt = 3;//缓冲池计数rga_info.u16Rotaion = 0;//rga_info.enFlip = RGA_FLIP_H;//水平翻转rga_info.bEnBufPool = RK_TRUE;ret = RK_MPI_RGA_CreateChn(RGA_CHN_ID, &rga_info);if (ret){printf("RGA Set Failed.....\n");}else{printf("RGA Set Success.....\n");}// High Venc ParameterVENC_CHN_ATTR_S high_venc_attr;high_venc_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;//设置编码器类型high_venc_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;//设置编码图像类型high_venc_attr.stVencAttr.u32PicWidth = 1920;//设置编码分辨率宽度high_venc_attr.stVencAttr.u32PicHeight = 1080;//设置编码分辨率高度high_venc_attr.stVencAttr.u32VirWidth = 1920;//设置编码分辨率虚宽high_venc_attr.stVencAttr.u32VirHeight = 1080;//设置编码分辨率虚高high_venc_attr.stVencAttr.u32Profile = 66;//设置编码等级high_venc_attr.stVencAttr.enRotation = VENC_ROTATION_0;//设置编码的旋转角度//********* 设置码率控制属性 *******************//high_venc_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//设置H264的CBR码率控制模式high_venc_attr.stRcAttr.stH264Cbr.u32Gop = 25;//设置GOP关键帧间隔high_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;//设置源帧率分子high_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;//设置源帧率分母high_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;//设置目标帧率分子high_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;//设置目标帧率分母high_venc_attr.stRcAttr.stH264Cbr.u32BitRate = 8388608;//设置码率大小ret = RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &high_venc_attr);if (ret){printf("Set High Venc Attr Failed.....\n");}else{printf("Set High Venc Attr Success.....\n");}// Low Venc ParameterVENC_CHN_ATTR_S low_venc_attr;low_venc_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;//设置编码器类型low_venc_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;//设置编码图像类型low_venc_attr.stVencAttr.u32PicWidth = 1280;//设置编码分辨率宽度low_venc_attr.stVencAttr.u32PicHeight = 720;//设置编码分辨率高度low_venc_attr.stVencAttr.u32VirWidth = 1280;//设置编码分辨率虚宽low_venc_attr.stVencAttr.u32VirHeight = 720;//设置编码分辨率虚高low_venc_attr.stVencAttr.u32Profile = 66;//设置编码等级low_venc_attr.stVencAttr.enRotation = VENC_ROTATION_0;//设置编码的旋转角度//********* 设置码率控制属性 *******************//low_venc_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//设置H264的CBR码率控制模式low_venc_attr.stRcAttr.stH264Cbr.u32Gop = 25;//设置GOP关键帧间隔low_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;//设置源帧率分子low_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;//设置源帧率分母low_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;//设置目标帧率分子low_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;//设置目标帧率分母low_venc_attr.stRcAttr.stH264Cbr.u32BitRate = 8388608;//设置码率大小ret = RK_MPI_VENC_CreateChn(LOW_VENC_CHN, &low_venc_attr);if (ret){printf("Set Low Venc Attr Failed.....\n");}else{printf("Set Low Venc Attr Success.....\n");}MPP_CHN_S vi_chn_s;vi_chn_s.enModId = RK_ID_VI;vi_chn_s.s32ChnId = VI_CHN_ID;MPP_CHN_S high_chn_s;high_chn_s.enModId = RK_ID_VENC;high_chn_s.s32ChnId = HIGH_VENC_CHN;//VI绑定高分辨率VENC模块ret = RK_MPI_SYS_Bind(&vi_chn_s, &high_chn_s);if (ret){printf("VI Bind High Venc Failed.....\n");return -1;}else{printf("VI Bind High Venc Success.....\n");}MPP_CHN_S rga_chn_s;rga_chn_s.enModId = RK_ID_RGA;rga_chn_s.s32ChnId = RGA_CHN_ID;//VI绑定RGA模块ret = RK_MPI_SYS_Bind(&vi_chn_s, &rga_chn_s);if (ret){printf("VI Bind RGA Failed.....\n");return -1;}else{printf("VI Bind RGA Success.....\n");}pthread_t high_venc_pid;pthread_t rga_pid;pthread_t low_venc_pid;pthread_create(&high_venc_pid, NULL, get_high_venc_thread, NULL); //创建多线程获取高分辨率的编码码流 pthread_create(&rga_pid, NULL, rga_handle_thread, NULL);//创建多线程获取RGA码流并发送到低分辨率编码器pthread_create(&low_venc_pid, NULL, get_low_venc_thread, NULL);//创建多线程获取低分辨率编码码流while (1){sleep(1);}RK_MPI_SYS_UnBind(&vi_chn_s, &high_chn_s);RK_MPI_SYS_UnBind(&vi_chn_s, &rga_chn_s);RK_MPI_RGA_DestroyChn(RGA_CHN_ID);RK_MPI_VENC_DestroyChn(HIGH_VENC_CHN);RK_MPI_VENC_DestroyChn(LOW_VENC_CHN);RK_MPI_VI_DisableChn(PIPE_ID, VI_CHN_ID);return 0;
}
三.运行的效果:
分别用ffplay播放器分别播出高分辨率H264文件(test_high_venc.h264),低分辨率(test_rga_venc.h264)
ffplay test_high_venc.h264
ffplay test_rga_venc.h264

相关文章:
通过多线程分别获取高分辨率和低分辨率的H264码流
目录 一.RV1126 VI采集摄像头数据并同时获取高分辨率码流和低分辨率码流流程 编辑 1.1初始化VI模块: 1.2初始化RGA模块: 1.3初始化高分辨率VENC编码器、 低分辨率VENC编码器: 1.4 VI绑定高分辨率VENC编码器,VI绑定RGA模块…...
智慧农业中光谱相机对土壤成分的无损检测应用
可浏览之前发布的一篇文章:光谱相机在农业中的具体应用案例 一、土壤成分定量分析 养分检测 光谱相机通过捕捉土壤反射的特定波长光线,可精准检测氮、磷、钾等主要养分含量,以及有机质和水分比例。例如,不同养分对近红外波段…...
Muduo + OpenSSL 网络交互完整流程
🔥 Muduo OpenSSL 网络交互完整流程 这套架构结合了 Muduo(网络库) OpenSSL(TLS/SSL 加密) BIO(缓存),整个数据流动过程如下: 🌍 1. 网络通信的基本流程 M…...
2025年能源工作指导意见重点内容
一、总体目标 能源供应保障 全国发电总装机容量达到36亿千瓦以上,新增新能源发电装机2亿千瓦以上,发电量目标10.6万亿千瓦时,跨省跨区输电能力持续提升。 煤炭稳产增产,原油产量保持2亿吨以上,天然气产量较快增长&am…...
DNS 详细过程 与 ICMP
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 DNS (Domain Name System) 快速了解🦋 DNS 背景🦋 域名简介🦋 真实地址查询 —— DNS🎀 域名的层级关系&am…...
学到什么记什么(25.3.3)
Upload-labs 今日重新做了一下文件上传漏洞,这里第一题之前采用直接抓包改后缀名.jpg为.php,再写入一句话<?php phpinfo();?>然后放行,得到图片地址(可复制),本来直接访问图片地址即可得到敏感信息…...
阿里云服务器部署项目笔记 实操 centos7.9
阿里云服务器部署项目笔记 实操 centos7.9 springboot vue elementUImysqlredis 相关的redis,mysql,nginx镜像,jdk 通过网盘分享的文件:docker镜像 链接: https://pan.baidu.com/s/15VwcWBP4Jy07xADuvylgQw?pwdm2g9 提取码: m2g9 配置环境 连接云服务器 安装…...
完全背包变体-排列和组合的循环顺序问题
排列,区分顺序:内层循环物品{1,2},可以让3-2->1-1和3-1->2-2都计算一遍。 组合不区分顺序:外层循环物品{1,2},只会按照物品顺序填充 总结:排列问题中,每个容量的状态更新时,允…...
华为飞腾D2000芯片(基于ARM架构)的欧拉操作系统(openEuler)上部署MySQL
一、环境准备 确认系统架构 uname -m # 应输出 aarch64(即ARM64)更新系统 sudo dnf update -y安装基础依赖 sudo dnf install -y libaio numactl openssl-devel tar wget二、安装MySQL 方案1:通过openEuler官方仓库安装(推荐&am…...
C#开发——日期操作类DateTime
在C#中,日期和时间的操作主要通过 System.DateTime 类来实现。 DateTime 提供了丰富的属性和法,用于处理日期和时间的创建、格式化、比较和计算等操作。以下是一些常用的日期函数和特性: 一、创建日期和时间 1、直接指定日期和时间&…...
win32汇编环境,窗口程序中使控件子类化的示例一
;运行效果 ;win32汇编环境,窗口程序中使编辑框控件子类化的示例一 ;窗口子类化,就是把某种控件,自已再打造一遍,加入自已的功能。比如弄个特殊形状的按钮,或只能输入特殊字符的编辑框 ;当然,一般来说,这都是…...
多镜头视频生成、机器人抓取、扩散模型个性化 | Big Model weekly第58期
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 GLM-4-Voice: Towards Intelligent and Human-Like End-to-End Spoken Chatbot 本文介绍了一种名为GLM-4-Voice的智能且类人化的端到端语音聊天机器人。它支持中文和英文,能够进行实时语音对话&a…...
iOS实现一个强大的本地状态记录容器
我们开发中经常会遇到这样的场景,就是我们客户端用户进行了某个操作,这个操作影响了数据的状态,但是我们又不方便重新请求一次数据, 这个时候,就需要我们记录一下本地状态在内存中,随着业务越来越复杂&…...
第十四届蓝桥杯:(二分算法)字串简写
这道题我们的做法是开两个vector,分别把a和b字符的下标存进去,然后遍历a字符,我们要求长度必须大于等于k,我们可以画个图,也就是说b的下标减a的下标必须大于等于k-1 也就是b的下标必须大于等于a的下标k-1 我们用二分找…...
制服小程序的“滑手”:禁用页面左右滑动全攻略
哈哈,看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为!😄 没错,我们可以通过设置 disableScroll 属性来“管教”它,同时结合 CSS 样式让页面既禁得住横向“乱跑”,又能顺畅地上下滚动。你的方案已…...
java 实现xxl-job定时任务自动注册到调度中心
xxl-job 自动注册(执行器和任务) 前言 xxl-job是一个功能强大、简单易用、高可用且可扩展性强的分布式定时任务框架/分布式任务调度平台。它适用于各种需要定时任务调度的场景,并可根据业务需求进行灵活配置和扩展。 xxl-job简介 xxl-job是一个开源的分布式定时任务框架,…...
ZK Rollup
ZK Rollup 通过生成零知识证明来确保所有提交的交易都是有效的。生成零知识证明的过程涉及复杂的密码学运算,通常使用的是 zk-SNARK(零知识简洁非互动知识论证)或 zk-STARK(零知识可扩展透明知识论证)。以下是 ZK Roll…...
webstorm的Live Edit插件配合chrome扩展程序JetBrains IDE Support实现实时预览html效果
前言 我们平时在前端网页修改好代码要点击刷新再去看修改的效果,这样比较麻烦,那么很多软件都提供了实时预览的功能,我们一边编辑代码一边可以看到效果。下面说的是webstorm。 1 Live Edit 首先我们需要在webstorm的settings里安装插件Live …...
02 HarmonyOS Next仪表盘案例详解(一):基础篇
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 1. 项目概述2. 技术架构2.1 文件结构2.2 ArkTS 语言特性装饰器的使用 3. 数据结构设计3.1 接口定义3.2 数据初始化 4. 生命周期与页面路由…...
张岳教授:语言模型推理与泛化研究 | ICLR 2025 特邀报告与团队专场
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! AITIME 01 ICLR 2025预讲会特邀报告 AITIME 02 ICLR 2025预讲会西湖大学张岳老师实验室专场 01 AI生成文本的自动化检测 Glimpse: Enabling White-Box Methods to Use Proprietary Models for Zero-Shot LLM-Ge…...
离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用
离散傅里叶变换(DFT)及其在图像处理中的应用 什么是离散傅里叶变换? 离散傅里叶变换(Discrete Fourier Transform, DFT)是一种强大的数学工具,用于将离散信号从时域(或空间域)转换…...
记一次误禁用USB导致键盘鼠标失灵的修复过程
背景说明 在电脑上插入了一个USB hub,然后弹窗提示:“集线器端口上出现电涌”,点开让选择“重置”或者“关闭”,不小心点了关闭,结果这个usb口就被关了,再插任何东西都没反应,找了很多办法都恢…...
Apache nifi demo 实验
Apache nifi 是个数据流系统,可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程,读取数据库里的数据,再转换,最后保存到本地文件。 这样可以来实现一些数据转换的操作,而不用特地编写程序来导入导出。…...
Leetcode 57-插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…...
SpringCloud之Eureka、Ribbon、OpenFeign
目录1. SpringCloud Eureka(服务注册与发现组件)2. SpringCloud Ribbon(负载均衡与服务调用组件)3. SpringCloud OpenFeign(负载均衡与服务调用组件)SpringCloud:用于开发高度可扩展、高性能的分…...
如何在MacOS 10.15上安装Docker Desktop
前文提到MacOS 10.15上无法通过Homebrew安装最新版本的docker,自然想到了去安装更早版本的docker。在MacOS上安装Docker Desktop比安装Docker Engine要更方便一些,具体原因可以自己搜索。通过Docker Desktop的Release notes得知最后一个支持MacOS 10.15的…...
Moticon智能鞋垫传感器OpenGo:经济实用的运动科学研究与临床评估工具
Moticon智能鞋垫传感器OpenGo是运动科学研究领域的一款高性能工具,其无线设计和精准传感器为步态分析、平衡评估以及疾病诊断提供了稳定的数据支持。通过实时捕捉足底压力分布、动态变化及平衡状态,OpenGo 为研究人员和临床医生提供了深入洞察个体运动模…...
打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天)
打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天) 前言最后 前言 说真的,用Unity工作这几年,经历的项目大大小小,对于场景的渲染算是有一定的经验,但涉及到HDRP高清渲染管线的了解࿰…...
nlp第十节——LLM相关
一、模型蒸馏技术 本质上是从一个大模型蒸馏出小模型,从小模型训练出来的概率分布(如自回归模型预测下一个字的概率分布)分别与大模型预测的概率分布和ground label求loss。与大模型预测的概率分布用KL散度求loss,与ground label用…...
Flutter管理项目实战
目录: 1、项目的构建和介绍 1、项目的构建和介绍 登录官网下载flutter的zip压缩包,解压到某个文件夹下即可,里面自带sdk的文件,无需再下载;创建项目时选定flutter的sdk的路径即可创建项目完成。 后续待完善࿰…...

