Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播
技术背景
好多开发者,希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务,然后低延迟播放出来。简单来说,在Unity 中实现采集 Camera 场景并推送RTMP的话,先是获取 Camera 场景数据,通过创建 RenderTexture 和读取图像数据到 Texture2D。选择选择合适的RTMP推送库或SDK,并设置推流地址和初始化推流。然后说明了推送数据时需要将图像数据转换为合适格式并推送到服务器,如果需要推送音频,还可以采集unity场景的audio或麦克风、扬声器audio数据,在结束推流时要停止推流并释放资源。
技术实现
本文以大牛直播SDK的Windows平台Unity下camera场景采集,并推送RTMP服务为例,先说
创建 RenderTexture:在 Unity 中,使用 RenderTexture 类来创建一个用于捕获 Camera 图像的纹理。
Texture2D image_texture = textures_poll_.get(video_width_, video_height_);
if (null == image_texture)return;RenderTexture old_camera_rt = camera_.targetTexture;
camera_.targetTexture = render_texture_;
camera_.Render();RenderTexture old_rt = RenderTexture.active;RenderTexture.active = render_texture_;image_texture.ReadPixels(new Rect(0, 0, video_width_, video_height_), 0, 0, false);
构建FrameTexture:
/* SmartPublisherWinMono.cs* Created by daniusdk.com on 2018/05/10.* WeChat: xinsheng120*/
public class FrameTexture
{public FrameTexture(Texture2D texture, IntPtr video_buffer, int video_buffer_size,int video_width, int video_height, int is_vertical_flip, int is_horizontal_flip, int scale_width, int scale_height, bool is_alpha){texture_ = texture;video_buffer_ = video_buffer;video_buffer_size_ = video_buffer_size;video_width_ = video_width;video_height_ = video_height;is_vertical_flip_ = is_vertical_flip;is_horizontal_flip_ = is_horizontal_flip;scale_width_ = scale_width;scale_height_ = scale_height;is_alpha_ = is_alpha;}public Texture2D texture_;public IntPtr video_buffer_;public int video_buffer_size_;public int video_width_;public int video_height_;public int is_vertical_flip_;public int is_horizontal_flip_;public int scale_width_;public int scale_height_;public bool is_alpha_;
}
拿到数据后,通过SendImage()发送数据的大牛直播SDK封装后的RTMP推送模块。
private bool sendImage()
{FrameTexture frame;if (frames_.TryDequeue(out frame)){if (frame != null && frame.texture_ != null){if (frame.video_buffer_ != IntPtr.Zero){handle_.OnPostRGBXData(0, frame.video_buffer_, video_buffer_size_, frame.video_width_ * 4, frame.video_width_, -frame.video_height_, frame.is_alpha_);}pool_.add(frame.texture_);frame.texture_ = null;}frame = null;return true;}frame = null;return false;
}
如果需要同时推送多个camera场景,只要启动多个推送实例即可,需要注意的是,SmartPublisher模块,不管多少实例,仅需要调用一次Init()和UnInit()接口。
/* SmartPublisherWinMono.cs* Created by daniusdk.com on 2018/05/10.* WeChat: xinsheng120*/
private bool InitSDK()
{// 设置日志路径(请确保目录存在)//String log_path = "D:\\pulisherlog";//NTSmartLog.NT_SL_SetPath(log_path);UInt32 pub_init_ret = NTSmartPublisherSDK.NT_PB_Init(0, IntPtr.Zero);if (NTBaseCodeDefine.NT_ERC_OK == pub_init_ret){return true;}else{if (NTBaseCodeDefine.NT_ERC_OK == pub_init_ret){NTSmartPublisherSDK.NT_PB_UnInit();}is_sdk_has_inited_ = false;return false;}
}private bool UnInitSDK()
{if (is_sdk_has_inited_){NTSmartPublisherSDK.NT_PB_UnInit();is_sdk_has_inited_ = false;}return true;
}
以初始化InitSDK()为例,Awake()的时候,调一次即可:
public void Awake()
{//rtmp_pusher_url.text = "rtmp://192.168.0.211:1935/hls/stream" + (System.Environment.TickCount % 100000).ToString();rtmp_pusher_url_.text = "rtmp://192.168.0.108:1935/hls/stream1";video_width_ = camera_.pixelWidth;video_height_ = camera_.pixelHeight;btn_rtmp_pusher_.onClick.AddListener(btn_start_rtmp_pusher_Click);btn_preview_.onClick.AddListener(btn_preview_Click);video_option_sel_.onValueChanged.AddListener(SelVideoPushType);audio_option_sel_.onValueChanged.AddListener(SelAudioPushType);btn_rtsp_service_.onClick.AddListener(btn_rtsp_service_Click);btn_rtsp_publisher_.onClick.AddListener(btn_rtsp_publisher_Click);btn_get_rtsp_session_numbers_.onClick.AddListener(btn_get_rtsp_session_numbers_Click);btn_rtsp_publisher_.interactable = false;btn_record_.onClick.AddListener(btn_record_Click);btn_pause_record_.onClick.AddListener(btn_pause_record_Click);InitSDK();publisher_wrapper_ = new nt_publisher_wrapper();int w = video_width_;if ((w&1) == 1)w--;int h = video_height_;if ((h&1) == 1)h--;publisher_wrapper_.SetCaptureVesolution(w, h);publisher_wrapper_.OnLogEventMsg += OnLogHandle;Loom.Initialize();
}
推送RTMP实现如下:
/* SmartPublisherWinMono.cs* Created by daniusdk.com on 2018/05/10.* WeChat: xinsheng120*/
public void btn_start_rtmp_pusher_Click()
{if (publisher_wrapper_.is_rtmp_publishing()){StopPushRTMP();btn_rtmp_pusher_.GetComponentInChildren<Text>().text = "推送RTMP";return;}String url = rtmp_pusher_url_.text;if (url.Length < 8){publisher_wrapper_.try_close_handle();Debug.LogError("请输入RTMP推送地址");return;}if (!OpenPublisherHandle())return;SetCommonOptionToPublisherSDK();if (!publisher_wrapper_.StartPublisher(url)){Debug.LogError("调用StartPublisher失败..");return;}btn_rtmp_pusher_.GetComponentInChildren<Text>().text = "停止推送";if (!publisher_wrapper_.is_previewing() && !publisher_wrapper_.is_rtsp_publishing() && !publisher_wrapper_.is_recording()){StartCaptureAvData();coroutine_ = StartCoroutine(OnPostVideo());}
}
其中,调到的SetCommonOptionToPublisherSDK()实现如下:
private void SetCommonOptionToPublisherSDK()
{if (publisher_wrapper_.is_empty_handle())return;if (publisher_wrapper_.handle_reference_count() > 0)return;publisher_wrapper_.config_layers(false);publisher_wrapper_.SetFrameRate((uint)video_fps_);bool is_hw_encoder = false; //默认软编码bool is_h264_encoder = true;Int32 type = is_hw_encoder ? 1 : 0;Int32 encoder_id = is_hw_encoder ? 128 : 0;UInt32 codec_id = is_h264_encoder?(UInt32)NTCommonMediaDefine.NT_MEDIA_CODEC_ID.NT_MEDIA_CODEC_ID_H264: (UInt32)NTCommonMediaDefine.NT_MEDIA_CODEC_ID.NT_MEDIA_CODEC_ID_H265;Int32 param1 = is_hw_encoder ? -1 : 0;publisher_wrapper_.SetVideoEncoder(type, encoder_id, codec_id, param1);publisher_wrapper_.SetVideoQualityV2(publisher_wrapper_.CalVideoQuality(video_width_, video_height_, is_h264_encoder));publisher_wrapper_.SetVideoBitRate(publisher_wrapper_.CalBitRate(video_fps_, video_width_, video_height_));publisher_wrapper_.SetVideoMaxBitRate(publisher_wrapper_.CalMaxKBitRate(video_fps_, video_width_, video_height_, false));publisher_wrapper_.SetVideoKeyFrameInterval(key_frame_interval_);if (is_h264_encoder){publisher_wrapper_.SetVideoEncoderProfile(3);}publisher_wrapper_.SetVideoEncoderSpeed(publisher_wrapper_.CalVideoEncoderSpeed(video_width_, video_height_, is_h264_encoder));publisher_wrapper_.SetPublisherAudioCodecType(1); //1: AAC 2: Speex
}
获取到的数据,除了推送RTMP外,如果需要录像,录像设计实现如下:
public void btn_record_Click()
{if (publisher_wrapper_.is_recording()){StopRecord();btn_record_.GetComponentInChildren<Text>().text = "开始录像";return;}if (!OpenPublisherHandle())return;SetCommonOptionToPublisherSDK();if (!publisher_wrapper_.StartRecorder()){Debug.LogError("调用StartRecorder失败..");return;}btn_record_.GetComponentInChildren<Text>().text = "停止录像";if (!publisher_wrapper_.is_previewing() && !publisher_wrapper_.is_rtsp_publishing() && !publisher_wrapper_.is_rtmp_publishing()){StartCaptureAvData();coroutine_ = StartCoroutine(OnPostVideo());}
}public void StopRecord()
{if (!publisher_wrapper_.is_previewing() && !publisher_wrapper_.is_rtsp_publishing() && !publisher_wrapper_.is_rtmp_publishing()){StopCaptureAvData();if (coroutine_ != null){StopCoroutine(coroutine_);coroutine_ = null;}}publisher_wrapper_.StopRecorder();
}
Unity下采集camera场景,然后本地预览(见推送端界面左上角回显部分),并采集camera场景的audio数据,推送到RTMP服务,并通过大牛直播SDK的SmartPlayer播放器播放,整体延迟效果如下:
视频更看到的更真实:
Unity3D采集camera场景推送RTMP服务毫秒级延迟
总结
Unity 下采集 camera 场景并推送 RTMP 服务的使用场景有很多,对延迟、高性能、低功耗和稳定性,有很高的要求,数据源这块,除了采集camera场景外,还可以采集摄像头数据、屏幕数据,或设备自带的USB摄像头等,常用的使用场景比如:
虚拟现实和增强现实应用:
- VR 体验分享:在虚拟现实场景中,用户可以将自己的 VR 体验过程实时分享给其他人。例如,用户佩戴 VR 头显在一个用 Unity 开发的虚拟博物馆中参观,通过采集 camera 场景并推送 RTMP 流,其他人可以在电脑、手机或其他设备上同步观看用户的参观过程,仿佛身临其境。
- AR 导航直播:在一些特殊的应用场景中,如室内导航、户外探险等,使用 AR 技术结合 Unity 开发的应用可以将用户的视角和导航信息通过 RTMP 推流分享给其他人。比如一个探险队在野外使用 AR 导航应用进行探险,团队成员可以将自己的视角实时推送给后方的指挥中心,以便指挥中心随时了解探险队的位置和情况。
教育与培训领域:
- 虚拟实验教学:学校或教育机构可以使用 Unity 开发虚拟实验场景,如物理实验、化学实验、生物实验等。教师在进行实验教学时,通过采集虚拟实验场景中的 camera 场景并推送到 RTMP 服务器,学生可以在自己的设备上实时观看实验过程,加深对实验原理和操作方法的理解。
- 远程培训与演示:企业或培训机构在进行远程培训时,可以使用 Unity 开发培训课程的虚拟场景,如机械操作培训、软件使用培训等。培训师在虚拟场景中进行操作演示,通过 RTMP 推流让远程的学员实时观看,学员还可以通过互动功能提问和交流,提高培训效果。
建筑与设计领域:
- 建筑设计展示:建筑师和设计师可以使用 Unity 构建建筑模型和室内设计场景,通过采集 camera 场景并推送 RTMP 流,客户可以远程实时查看设计效果,提出修改意见。例如,一个建筑设计公司为客户设计了一个大型商业建筑,设计师可以将建筑的外观、内部空间布局等通过 RTMP 直播展示给客户,客户可以在不同的设备上查看,如同亲自在建筑中参观一样。
- 城市规划演示:城市规划部门可以使用 Unity 开发城市规划的虚拟模型,将城市的未来发展规划以直观的方式展示出来。通过 RTMP 推流,政府部门、专家和公众可以远程实时观看城市规划的演示,提出建议和意见,促进城市规划的科学决策。
监控与安防领域:
- 智能监控系统:在一些特殊的监控场景中,如工厂车间、仓库、建筑工地等,使用 Unity 结合监控摄像头可以实现智能监控系统。监控摄像头采集到的画面可以通过 Unity 进行处理和分析,如识别异常行为、检测物体移动等,然后将处理后的画面通过 RTMP 推流到监控中心,安保人员可以实时监控现场情况,及时发现和处理安全隐患。
- 应急指挥与救援:在应急指挥和救援场景中,现场的救援人员可以使用配备 Unity 应用的移动设备采集现场的 camera 场景,并推送到 RTMP 服务器,指挥中心可以实时了解现场的情况,制定科学的救援方案。例如,在地震、火灾等灾害现场,救援人员可以通过这种方式将现场的情况实时传输给指挥中心,以便指挥中心协调各方面的救援力量。
Unity3D下对camera场景的采集并推送RTMP,特别是高帧率的情况下,对数据采集、编码等,都有非常高的技术要求,以上是大概流程,感兴趣的开发者,可以单独跟我探讨。
相关文章:
Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播
技术背景 好多开发者,希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务,然后低延迟播放出来。简单来说,在Unity 中实现采集 Camera 场景并推送RTMP的话,先是获取 Camera 场景数据,通过创建 RenderTe…...
标记数据集生成模型助力无数据情况下的大模型指令微调
在构建大模型应用时,通常有两种方式来改进效果,一种是构建外部知识库,利用RAG来完成。但RAG并不是万能的,对于特定领域的LLM应用,以及无需示例,就能完成特定任务等场合就需要进行微调。然而,微调…...
第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展
第六届知交会暨地博会:世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日,第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…...
vue响应式原理
对于响应式原理,我们先了解vue是一个MVVM结构的框架;也就是数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新,基于响应式原理我们可以使数据驱动视图的实现变得简单而高效 一、响…...
SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
概述 在 SwiftUI 的界面布局中,列表(List)和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道:如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到:当在 List 的…...
使用Allure作为测试报告生成器(Java+Selenium)
背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时,当需要确认UI regression issue还是selenium test case自身的问题,需要去jenkins中查log,一般得到的是“Can not find element xxx…...
【论文阅读】处理器芯片敏捷设计方法:问题与挑战
作者:包云岗老师 包云岗老师是计算机体系结构方向的大牛,推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会: 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…...
系统内核自动处理 TCP 连接(自动发送 RST 数据包来重置连接)
使用原始套接字发送了一个 SYN 数据包后,对方发送了 SYN,ACK 数据包,但系统仍然会自动发送 RST 数据包。这通常是因为操作系统内核在处理 TCP 连接时的行为。 原因分析 内核处理 TCP 连接: 即使你使用了原始套接字来发送和接收数据包&#x…...
VLDB 2024 | 时空数据(Spatial-temporal)论文总结
VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据(time series data)的相关论文,主要包含如有疏漏,欢迎大家补充。 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘…...
以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
Qt初识_对象树
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 什么是对象树 为什么要引…...
规范秩相关信息搜集Day2
系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…...
【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)
文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...
交换瓶子(图论 贪心)
1224. 交换瓶子 - AcWing题库 把每一个瓶子看成一个点,从每个瓶子向他应该在的那个位置的瓶子连一条边 通过这个方式,我们就可以连出n条边 观察可以发现这些图有特点: n个点 连成n条边 因为每个点会指向它应该在的位置的那个点ÿ…...
汽车升级到底应不应该设置“可取消“功能
最近,汽车OTA(Over-the-Air)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…...
Mac电脑钓鱼到拿下核心权限
目录 一. 前言 二. PKG后门制作阶段 2.1 环境准备 2.2 制作过程 2.3 成功上线 三 . 浏览器密码抓取 四. 权限维持 1. 手动权限维持 2. MSF自动化维持 五. 参考文章 一. 前言 攻防对抗强度和难度日益演进,传统的渗透测试思路成本逐渐提高,钓鱼已经成为当下攻击者最常…...
Docker多架构镜像构建踩坑记
背景 公司为了做信创项目的亮点,需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行,整个项目通过后端Java,前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建,于是只能手工构…...
docker 架构详解
Docker架构是基于客户端-服务器(C/S)模式的,包含多个关键组件,以确保容器化应用的高效构建、管理和运行。以下是对Docker架构的详细解析: Docker 架构概述 Docker 架构采用客户端-服务器(C/S)…...
05-标准库开发-STM32-IIC协议
七、STM32中IIC协议 概述 Inter-Integrated Circuit (IIC),也常称为I2C(I squared C),是一种同步、串行、半双工通信总线协议。它主要用于连接低速外围设备到处理器或微控制器上,如MPU6050姿态传感器、OLED显示屏、存…...
vue 封装全局过滤器
1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…...
【PlantUML系列】流程图(四)
目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字;结束一般使用stop/end关键字。基础用法包括: start ... stopstart ...…...
MATLAB中的合并分类数组
目录 创建分类数组 串联分类数组 创建具有不同类别的分类数组 串联具有不同类别的数组 分类数组的并集 此示例演示了如何合并两个分类数组。 创建分类数组 创建分类数组 A,其中包含教室 A 中的 25 个学生的首选午餐饮料。 rng(default) A randi(3,[25,1]); …...
流编辑器sed(stream editor)
一.sed简介 sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处 理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复&…...
R语言的数据结构--矩阵
【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 矩阵是一个二维数组,矩阵中的元素都具有相…...
使用 Python 爬取某网站简历模板(bs4/lxml+协程)
使用 Python 爬取站长素材简历模板 简介 在本教程中,我们将学习如何使用 Python 来爬取站长素材网站上的简历模板。我们将使用requests和BeautifulSoup库来发送 HTTP 请求和解析 HTML 页面。本教程将分为两个部分:第一部分是使用BeautifulSoup的方法&am…...
19 go语言(golang) - 通过反射手动实现json序列化
一、json 在 Go 语言中,JSON 序列化和反序列化通常通过标准库 encoding/json 来实现。这个包提供了简单易用的接口来将 Go 数据结构转换为 JSON 格式字符串(序列化),以及从 JSON 字符串解析出 Go 数据结构(反序列化&a…...
Scala:隐式转换
隐式转换的定义 //隐式转换:编译器自动滴,偷偷滴,把数据A->B object test04 {def main(args: Array[String]): Unit {val i:Int1//把Int类型,转化成Double类型//Int -> Double//隐式转换失败val b:Double1//隐式转换失败v…...
UVM之寄存器模型生成
1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 (1)首先通过openpyxl读取EXCEL表格, workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 (2ÿ…...
PL/SQL批量生成数据
在PL/SQL中生成大量模拟数据,特别是当你需要生成大量记录(如1亿条)时,有几种常见的方式可以提高生成数据的效率和性能。以下是一些常用的方法和最佳实践: 1. 使用PL/SQL块批量生成数据 PL/SQL块可以通过循环生成大量…...
Xcode模拟器运行报错:The request was denied by service delegate
Xcode模拟器运行报错:The request was denied by service delegate 造成的原因: (1)新的苹果M系列芯片的Mac电脑 (2)此电脑首次安装启动Xcode的应用程序 (3)此电脑未安装Rosetta 2 解决方法: …...
2024小迪安全基础入门第十课
目录 一、传输格式&数据-类型&编码&算法 1. 传输格式: 2. 传输数据: 3. 影响与渗透测试: #传输格式 #传输数据 二、密码存储&混淆-不可逆&非对称性 1. 密码存储: 2. 密码存储的影响: 3.…...
Redisson分布式限流器
Redisson分布式限流器 一、使用1.1、方法1.2、示例 二、原理2.1、设置限流器2.2、获取令牌 三、总结 最近有需求在做分布式限流,调研的限流框架大概有: 1、spring cloud gateway集成redis限流,但属于网关层限流 2、阿里Sentinel,功能强大、带监控平台 …...
xvisor调试记录
Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…...
Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题,详情请看:Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)。我以为问题已经全部解决了…...
【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库
???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…...
家庭路由器跑PCND的优点
在当今数字化的时代,PCDN(Peer-to-Peer Content Delivery Network)技术逐渐走入人们的视野,有人考虑在家庭路由器上跑PCDN,下面是优点: 1.资源利用最大化 家庭网络在很多时候存在闲置的带宽和计算资源。通…...
ASP.NET Core API + MySql
环境 数据库: mysql8.0 后端: vs2022 ASP.NET Core API .net 8 前端: Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…...
torch.optim.lr_scheduler.ReduceLROnPlateau
torch.optim.lr_scheduler.ReduceLROnPlateau 是 PyTorch 中的一种学习率调度器,主要用于在模型训练过程中根据某些指标(如验证损失)动态调整学习率。它是一种基于性能指标动态调整学习率的策略,而不是预定义的固定时间调整。 主要…...
Dubbo
官方文档: Java SDK 手册 | Apache Dubbo 一 RPC及Dubbo 1 什么是RPC dubbo是⼀款⾼性能的rpc框架。什么是rpc呢? rpc是⼀种协议:是⼀种远程过程调⽤(remote procudure call)协议 rpc协议是在应⽤层之上的协议&…...
算法1(蓝桥杯18)-删除链表的倒数第 N 个节点
问题: 给你一个链表,删除链表的倒数第 n 个节点,并且返回链表的头节点。 输入:head 1 -> 2 -> 3 -> 4 -> 5 -> null, n 2 输出:1 -> 2 -> 3 -> 5 -> null输入:head 1 ->…...
SEC_ASA 第一天作业
拓扑: 实验需求: 注意:在开始作业之前必须先读“前言”,以免踩坑!!!(☞敢点我试试) 按照拓扑图配置VLAN连接。 注意:ASA防火墙的 Gi0/1口需要起子接口&#x…...
《C语言程序设计现代方法》note-8 指针和数组的关系
文章目录 助记提要12章 指针和数组12.1 指针的算术运算12.2 指针用于数组处理结合使用*和运算符 12.3 数组名作为指针数组名可以用作指针指针也可以当做数组名数组型实参 12.4 指针和多维数组处理每个元素处理行处理列多维数组名做指针 12.5 指针和变长数组 助记提要 指针支持…...
安科瑞电能质量治理产品在分布式光伏电站的应用-安科瑞黄安南
1.概述 随着全球对可再生能源需求的增加,分布式光伏电站的建设和发展迅速。然而,分布式光伏电站的运行过程中面临着一系列问题,比如导致企业关口计量点功率因数过低、谐波污染等。这些问题不仅影响光伏电站自身的运行效率,还会对…...
JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异主要体现在 Vue 如何追踪数组的变化,以及 Vue 如何处理数组…...
项目组件框架介绍[bRPC]
文章目录 前言bRPC安装bRPC的简单使用protobuf简单使用Echo服务远程调用Echo服务 与etcd关联 前言 bRPC是百度开源的一款工业级RPC框架,功能强大, 常用于搜索、存储、机器学习、广告、推荐等高性能系统。 bRPC安装 使用源码安装即可, 在安装前要确认依赖 sudo apt…...
基于MobileNetV3架构动物声音分类识别与应用系统实现
1.摘要 本文主要实现了一个基于MobileNetV3架构的深度学习模型用于动物声音分类识别任务。该MobileNetV3是一种轻量级的卷积神经网络,旨在实现高效分类性能,本章在猫、狗、海豚等三个动物声音(.wav数据集)上进行了训练和测试,即在…...
ragflow连ollama时出现的Bug
ragflow和ollama连接后,已经添加了两个模型但是ragflow仍然一直warn:Please add both embedding model and LLM in Settings > Model providers firstly.这里可能是我一开始拉取的镜像容器太小,容不下当前添加的模型,导…...
[大数据]Hudi编译集成
1. 编译环境准备 相关组件版本如下: Hadoop3.3.1Hive3.1.3Flink1.13.6,scala-2.12Spark3.3.1,scala-2.12 1)安装Maven (1)上传apache-maven-3.6.1-bin.tar.gz到/opt/software目录,并解压更名…...
rk3588-ubuntu22.04系统网关实现路由器功能:
rk3588-ubuntu22.04系统网关实现路由器功能: 场景需求描述: 需求背景: 场景一:通过网线eth0/(路由器wlan0)访问外网: 如果网关 和 设备所处的环境可以通过网线联网或者路由器联网,那么不需要将网关配置成…...
Python部署教程-Python项目怎样在Pycharm中运行
大家好,我是程序员徐师兄,今天为大家带来的是Python部署教程-Python项目怎样在Pycharm中运行。Python安装部署教程,包括软件的下载,软件的安装。该系统采用 Python语言开发,flask、Django 框架,MySql 作为数…...