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

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言

在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求实时性,那就只有一种方案,就是转码,强制转成264,然后用webrtc显示。当然,如果用户觉得后台修改摄像头配置改成264可以接受,那又是另外一回事了。

为什么webrtc不支持265?据说是因为专利的原因,近些年说是解决了专利问题,现在谷歌浏览器直接内置了265的解码,在新版的浏览器已经支持了265的webrtc,目前谷歌浏览器默认还未开启265,需要手动设置启动参数,官网说未来这个参数默认开启。
如何设置呢?找到桌面快捷方式,右键属性,目标加上 --enable-features=PlatformHEVCEncoderSupport,WebRtcAllowH265Receive,WebRtcAllowH265Send --force-fieldtrials=WebRTC-Video-H26xPacketBuffer/Enabled

完整内容如下 “C:\Program Files\Google\Chrome\Application\chrome.exe” --enable-features=PlatformHEVCEncoderSupport,WebRtcAllowH265Receive,WebRtcAllowH265Send --force-fieldtrials=WebRTC-Video-H26xPacketBuffer/Enabled

如何确定设置后是否真正支持265?打开网页 https://jsfiddle.net/v24s8q1f/ 右下角看到列表中有H265表示成功。

二、效果图

在这里插入图片描述

三、相关地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_push。

四、功能特点

  1. 支持各种本地音视频文件和网络音视频文件,格式包括mp3、aac、wav、wma、mp4、mkv、rmvb、wmv、mpg、flv、asf等。
  2. 支持各种网络音视频流,网络摄像头,协议包括rtsp、rtmp、http等。
  3. 支持本地摄像头设备推流,可指定分辨率、帧率、格式等。
  4. 支持本地桌面采集推流,可指定屏幕索引、采集区域、起始坐标、帧率等,也支持指定窗口标题进行采集。
  5. 可实时切换预览视频文件,可切换音视频文件播放进度,切换到哪里就推流到哪里。预览过程中可以切换静音状态和暂停推流。
  6. 可指定重新编码推流,任意源头格式可选强转264或265格式。
  7. 可转换分辨率推流,设置等比例缩放或者指定分辨率进行转换。
  8. 推流的清晰度、质量、码率都可调,可以节约网络带宽和拉流端的压力。
  9. 音视频文件自动循环不间断推流。
  10. 音视频流有自动掉线重连机制,重连成功自动继续推流。
  11. 支持各种流媒体服务程序,包括但不限于mediamtx、ZLMediaKit、srs、LiveQing、nginx-rtmp、EasyDarwin、ABLMediaServer。
  12. 通过配置文件自动加载对应流媒体程序的协议和端口,自动生成推流地址和各种协议的拉流地址。可以通过配置文件自己增加流媒体程序。
  13. 可选rtmp、rtmp格式推流,推流成功后,支持多种格式拉流,包括但不限于rtsp、rtmp、hls、flv、ws-flv、webrtc等。
  14. 在软件上推流成功后,可以直接单击网页预览,实时预览推流后拉流的画面,多画面网页展示。
  15. 软件界面上可单击对应按钮,动态添加文件和目录,可手动输入地址。
  16. 推拉流实时性极高,延迟极低,延迟时间大概在100ms左右。
  17. 极低CPU资源占用,4路主码流推流只需要占用0.2%CPU。理论上常规普通PC机器推100路毫无压力,主要性能瓶颈在网络。
  18. 可以推流到外网服务器,然后通过手机、电脑、平板等设备播放对应的视频流。
  19. 每路推流都可以手动指定唯一标识符(方便拉流/用户无需记忆复杂的地址),没有指定则按照策略随机生成hash值。也支持自动按照指定标识后面加数字的方式递增命名。比如设置标识为字母v,策略为标识递增,则每添加一个对应的推流码命名依次是v1、v2、v3等。
  20. 根据推流协议自动转码格式,默认策略按照选择的推流协议,比如rtsp支持265而rtmp不支持,如果是265的文件而选择rtmp推流,则自动转码成264格式再推流。
  21. 音视频同步推流,在拉流和采集的时候就会自动处理好同步,同步后的数据再推流。
  22. 表格中实时显示每一路推流的分辨率和音视频数据状态,灰色表示没有输入流,黑色表示没有输出流,绿色表示原数据推流,红色表示转码后的数据推流。
  23. 自动重连视频源,自动重连流媒体服务器,保证启动后,推流地址和打开地址都实时重连,只要恢复后立即连上继续采集和推流。
  24. 根据不同的流媒体服务器类型,自动生成对应的rtsp、rtmp、hls、flv、ws-flv、webrtc拉流地址,用户可以直接复制该地址到播放器或者网页中预览查看。
  25. 添加的推流地址等信息自动存储到文件,可以手动打开进行修改,默认启动后自动加载历史记录。
  26. 可以指定生成的网页文件保存位置,方便作为网站网页发布,可以直接在浏览器中输入网址进行访问,发布后可以直接在局域网其他设备比如手机或者电脑打开对应网址访问。
  27. 可选是否开机启动、后台运行等。网络推流添加的rtsp地址可勾选是否隐藏地址中的用户信息。
  28. 自带设备推流模块,自动识别本地设备,包括本地的摄像头和桌面,可以手动选择不同的是视频和音频采集设备进行推流。
  29. 自带文件点播模块,添加文件后用户可以拉取地址点播,用户端可以任意切换播放进度。支持各种浏览器(谷歌chromium、微软edge、火狐firefox等)、各种播放器(vlc、mpv、ffplay、potplayer、mpchc等)打开请求。
  30. 文件点播模块实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。
  31. 文件点播模块采用纯QTcpSocket通信,不依赖流媒体服务程序,核心源码不到500行,注释详细,功能完整。
  32. 支持任意Qt版本(Qt4、Qt5、Qt6),支持任意系统(windows、linux、macos、android、嵌入式linux等)。

五、相关代码

#include "netpushclient.h"
#include "ffmpegthread.h"
#include "ffmpegsave.h"
#include "videohelper.h"
#include "osdgraph.h"bool NetPushClient::checkB = false;
bool NetPushClient::recordInteger = false;
int NetPushClient::recordDuration = 0;
int NetPushClient::encodeVideo = 0;
float NetPushClient::encodeVideoRatio = 1;
QString NetPushClient::encodeVideoScale = "1";NetPushClient::NetPushClient(QObject *parent) : QObject(parent)
{ffmpegThread = NULL;ffmpegSave = NULL;//定时器控制多久录制一个文件timerRecord = new QTimer(this);timerRecord->setInterval(1000);connect(timerRecord, SIGNAL(timeout()), this, SLOT(checkRecord()));
}NetPushClient::~NetPushClient()
{this->stop();
}QString NetPushClient::getMediaUrl()
{return this->mediaUrl;
}QString NetPushClient::getPushUrl()
{return this->pushUrl;
}FFmpegThread *NetPushClient::getVideoThread()
{return this->ffmpegThread;
}void NetPushClient::checkRecord()
{//0. 时长单位分钟/触发条件自动重新录像/recordDuration=0/表示禁用录像//1. recordInteger参数控制是否整数倍数录像/recordDuration参数控制录制文件时长/整数倍录像下时长为对应的模数//2. 一般监控行业会按照整点录像/比如30分钟60分钟一个视频文件/这样录制的文件起始时间和结束时间整整齐齐//3. 整点录像情况下除了第一个和最后一个录像文件可能时长不一样/中间的文件肯定时长都一样//4. 非整点录像就按照录像总时长计时/所有保存的文件都是按照时长保存的//5. recordInteger=true/recordDuration=5/表示每到5分钟的时候录制一个文件//6. 上面录制结果: 11:01开始录制/11:05结束上一个录制并重新录制/第一个文件时长4分钟//7. recordInteger=false/recordDuration=5/表示每过5分钟的时候录制一个文件//8. 上面录制结果: 11:01开始录制/11:06结束上一个录制并重新录制/第一个文件时长5分钟bool ok = false;QDateTime now = QDateTime::currentDateTime();qint64 offset = recordTime.msecsTo(now);if (recordInteger && recordDuration > 1) {QTime time = now.time();int min = time.minute();int sec = time.second();min = (min == 0 ? 60 : min);ok = ((min % recordDuration == 0) && sec >= 0 && sec <= 2);//qDebug() << TIMEMS << min << sec << (min % recordDuration == 0) << offset << ok;} else {ok = (offset >= (recordDuration * 60 * 1000));//qDebug() << TIMEMS << recordDuration << offset << ok;}if (ok && offset >= 5000) {this->record();}
}void NetPushClient::record()
{if (ffmpegSave) {//取出推流码QString flag = pushUrl.split("/").last();//文件名不能包含特殊字符/需要替换成固定字母QString pattern("[\\\\/:|*?\"<>]|[cC][oO][mM][1-9]|[lL][pP][tT][1-9]|[cC][oO][nM]|[pP][rR][nN]|[aA][uU][xX]|[nN][uU][lL]");
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))QRegularExpression rx(pattern);
#elseQRegExp rx(pattern);
#endifflag.replace(rx, "X");//文件名加上时间结尾QString path = QString("%1/video/%2").arg(qApp->applicationDirPath()).arg(QDATE);QString name = QString("%1/%2_%3.mp4").arg(path).arg(flag).arg(STRDATETIME);//目录不存在则新建QDir dir(path);if (!dir.exists()) {dir.mkpath(path);}//先停止再打开重新录制ffmpegSave->stop();ffmpegSave->open(name);recordTime = QDateTime::currentDateTime();}
}void NetPushClient::receivePlayStart(int time)
{//演示添加OSD后推流
#ifdef betaversionint height = ffmpegThread->getVideoHeight();QList<OsdInfo> osds = OsdGraph::getTestOsd(height);ffmpegThread->setOsdInfo(osds);
#endif//打开后才能启动录像ffmpegThread->recordStart(pushUrl);//推流以外还单独存储if (!ffmpegSave && recordDuration > 0) {//源头保存没成功就不用继续FFmpegSave *saveFile = ffmpegThread->getSaveFile();if (!saveFile->getIsOk()) {return;}ffmpegSave = new FFmpegSave(this);//重新编码过的则取视频保存类的对象AVStream *videoStreamIn = saveFile->getVideoEncode() ? saveFile->getVideoStream() : ffmpegThread->getVideoStream();AVStream *audioStreamIn = saveFile->getAudioEncode() ? saveFile->getAudioStream() : ffmpegThread->getAudioStream();ffmpegSave->setSavePara(ffmpegThread->getMediaType(), SaveVideoType_Mp4, videoStreamIn, audioStreamIn);this->record();timerRecord->start();}
}void NetPushClient::receivePacket(AVPacket *packet)
{if (ffmpegSave && ffmpegSave->getIsOk()) {ffmpegSave->writePacket2(packet);}FFmpegHelper::freePacket(packet);
}void NetPushClient::recorderStateChanged(const RecorderState &state, const QString &file)
{int width = 0;int height = 0;int videoStatus = 0;int audioStatus = 0;if (ffmpegThread) {width = ffmpegThread->getVideoWidth();height = ffmpegThread->getVideoHeight();FFmpegSave *saveFile = ffmpegThread->getSaveFile();if (saveFile->getIsOk()) {if (saveFile->getVideoIndexIn() >= 0) {if (saveFile->getVideoIndexOut() >= 0) {videoStatus = (saveFile->getVideoEncode() ? 3 : 2);} else {videoStatus = 1;}}if (saveFile->getAudioIndexIn() >= 0) {if (saveFile->getAudioIndexOut() >= 0) {audioStatus = (saveFile->getAudioEncode() ? 3 : 2);} else {audioStatus = 1;}}}}//只有处于录制中才表示正常推流开始bool start = (state == RecorderState_Recording);emit pushStart(mediaUrl, width, height, videoStatus, audioStatus, start);
}void NetPushClient::receiveSaveStart()
{emit pushChanged(mediaUrl, 0);
}void NetPushClient::receiveSaveFinsh()
{emit pushChanged(mediaUrl, 1);
}void NetPushClient::receiveSaveError(int error)
{emit pushChanged(mediaUrl, 2);
}void NetPushClient::setMediaUrl(const QString &mediaUrl)
{this->mediaUrl = mediaUrl;
}void NetPushClient::setPushUrl(const QString &pushUrl)
{this->pushUrl = pushUrl;
}void NetPushClient::start()
{if (ffmpegThread || mediaUrl.isEmpty() || pushUrl.isEmpty()) {return;}//实例化视频采集线程ffmpegThread = new FFmpegThread;//关联播放开始信号用来启动推流connect(ffmpegThread, SIGNAL(receivePlayStart(int)), this, SLOT(receivePlayStart(int)));//关联录制信号变化用来判断是否推流成功connect(ffmpegThread, SIGNAL(recorderStateChanged(RecorderState, QString)), this, SLOT(recorderStateChanged(RecorderState, QString)));//设置播放地址ffmpegThread->setMediaUrl(mediaUrl);//设置视频模式
#ifdef openglxffmpegThread->setVideoMode(VideoMode_Opengl);
#elseffmpegThread->setVideoMode(VideoMode_Painter);
#endif//设置通信协议(如果是rtsp视频流建议设置tcp)//ffmpegThread->setTransport("tcp");//设置硬解码(和推流无关/只是为了加速显示/推流只和硬编码有关)//ffmpegThread->setHardware("dxva2");//设置缓存大小(如果分辨率帧率码流很大需要自行加大缓存)ffmpegThread->setCaching(8192000);//设置解码策略(推流的地址再拉流建议开启最快速度)//ffmpegThread->setDecodeType(DecodeType_Fastest);//设置读取超时时间超时后会自动重连ffmpegThread->setReadTimeout(10 * 1000);//设置连接超时时间(0表示一直连)ffmpegThread->setConnectTimeout(0);//设置重复播放相当于循环推流ffmpegThread->setPlayRepeat(true);//设置默认不播放音频(界面上切换到哪一路就开启)ffmpegThread->setPlayAudio(false);//设置默认不预览视频(界面上切换到哪一路就开启)ffmpegThread->setPushPreview(false);//设置保存视频类将数据包信号发出来用于保存文件FFmpegSave *saveFile = ffmpegThread->getSaveFile();saveFile->setProperty("checkB", checkB);saveFile->setSendPacket(recordDuration > 0, false);connect(saveFile, SIGNAL(receivePacket(AVPacket *)), this, SLOT(receivePacket(AVPacket *)));connect(saveFile, SIGNAL(receiveSaveStart()), this, SLOT(receiveSaveStart()));connect(saveFile, SIGNAL(receiveSaveFinsh()), this, SLOT(receiveSaveFinsh()));connect(saveFile, SIGNAL(receiveSaveError(int)), this, SLOT(receiveSaveError(int)));//如果是本地设备或者桌面录屏要取出其他参数VideoHelper::initVideoPara(ffmpegThread, mediaUrl, encodeVideoRatio, encodeVideoScale);//设置视频编码格式/视频压缩比率/视频缩放比例ffmpegThread->setEncodeVideo((EncodeVideo)encodeVideo);ffmpegThread->setEncodeVideoRatio(encodeVideoRatio);ffmpegThread->setEncodeVideoScale(encodeVideoScale);//启动播放ffmpegThread->play();
}void NetPushClient::stop()
{//停止推流和采集并彻底释放对象if (ffmpegThread) {ffmpegThread->recordStop();ffmpegThread->stop();ffmpegThread->deleteLater();ffmpegThread = NULL;}//停止录制if (ffmpegSave) {timerRecord->stop();ffmpegSave->stop();ffmpegSave->deleteLater();ffmpegSave = NULL;}
}

相关文章:

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言 在推流领域&#xff0c;尤其是监控行业&#xff0c;现在主流设备基本上都是265格式的视频流&#xff0c;想要在网页上直接显示监控流&#xff0c;之前的方案是&#xff0c;要么转成hls&#xff0c;要么魔改支持265格式的flv&#xff0c;要么265转成264&#xff0c;如…...

Spring Boot 中基于 Reactor 的服务器端事件(SSE)推送机制实践

Spring Boot 3.0 中基于 Reactor 的服务器端事件(SSE)推送机制实践 在现代 Web 应用开发中,实时数据交互越来越成为刚需,从股票行情的实时更新到社交平台的消息即时推送,服务器端事件(Server-Sent Events,简称 SSE)作为一种高效的单向数据传输技术,正发挥着重要作用。…...

CRC实战宝典:从原理到代码,全面攻克循环冗余校验

CRC实战宝典&#xff1a;从原理到代码&#xff0c;全面攻克循环冗余校验 github开源&#xff1a;CRC软硬件协同测试项目 CRC 简介 CRC&#xff08;循环冗余校验&#xff09;是一种强大的错误检测技术&#xff0c;广泛应用于数字网络和存储系统。它是确保数据完整性的重要方法…...

【愚公系列】《Python网络爬虫从入门到精通》056-Scrapy_Redis分布式爬虫(Scrapy-Redis 模块)

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

ZLMediaKit 和 SRS的区别,哪个更好用?

ZLMediaKit 和 SRS&#xff08;Simple RTMP Server&#xff09;是两个主流的开源流媒体服务器框架&#xff0c;各自在功能、性能、适用场景等方面存在显著差异。以下是两者的对比分析及选择建议&#xff1a; 一、核心差异对比 协议支持 ZLMediaKit&#xff1a;支持更广泛的流媒…...

【PyTorch】colab上跑VGG(深度学习)数据集是 CIFAR10

跑得结果是测试准确率10%&#xff0c;欠拟合。 import torch import torchvision.datasets from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter from torchvision import datasets, transformstransform tran…...

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

本专栏博客第49篇文章分享了将 GroundingDINO模型导出onnx并使用c++进行部署,并尝试将onnx模型转换为trt模型,fp16进行推理,可以发现推理速度提升了一倍。为此对GroundingDINO的trt推理进行调研,发现 在GroundingDINO-TensorRT-and-ONNX-Inference项目中分享了模型导出onnx…...

编程语言基础 - C++ 面试题

C++ 面试题 tags: c++ 文章目录 C++ 面试题关键字1. const2. static3. this 指针4. inline 内联函数5. volatile6. struct, class7. enum关键字 1. const 修饰变量:该变量不能被改变 修饰指针: 指针常量: 指针本身是常量 TYPE* const pContent;指向常量的指针:指针所指向…...

JVM笔记【一】java和Tomcat类加载机制

JVM笔记一java和Tomcat类加载机制 java和Tomcat类加载机制 Java类加载 * loadClass加载步骤类加载机制类加载器初始化过程双亲委派机制全盘负责委托机制类关系图自定义类加载器打破双亲委派机制 Tomcat类加载器 * 为了解决以上问题&#xff0c;tomcat是如何实现类加载机制的…...

Python----深度学习(全连接与链式求导法则)

一、机器学习和深度学习的区别 机器学习&#xff1a;利用计算机、概率论、统计学等知识&#xff0c;输入数据&#xff0c;让计算机学会新知 识。机器学习的过程&#xff0c;就是训练数据去优化目标函数。 深度学习&#xff1a;是一种特殊的机器学习&#xff0c;具有强大的能力和…...

基于SpringBoot的网上找律师管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

《目标检测双雄:YOLO与Faster R-CNN,谁主沉浮?》

在计算机视觉的广阔天地里&#xff0c;目标检测技术宛如一颗璀璨的明星&#xff0c;照亮了无数应用场景。从安防监控中对行人与车辆的精准识别&#xff0c;到自动驾驶领域对道路障碍物的快速判断&#xff0c;再到工业生产里对产品缺陷的严格检测&#xff0c;目标检测无处不在&a…...

CUDA编程中影响性能的小细节总结

一、内存访问优化 合并内存访问&#xff1a;确保相邻线程访问连续内存地址&#xff08;全局内存对齐访问&#xff09;。优先使用共享内存&#xff08;Shared Memory&#xff09;减少全局内存访问。避免共享内存的Bank Conflict&#xff08;例如&#xff0c;使用padding或调整访…...

C#学习第17天:序列化和反序列化

什么是序列化&#xff1f; 定义&#xff1a;序列化是指把对象转换为一种可以轻松存储或传输的格式&#xff0c;如JSON、XML或二进制格式。这个过程需要捕获对象的类型信息和数据内容。用途&#xff1a;使得对象可以持久化到文件、发送至网络、或存储在数据库中。 什么是反序列…...

kafka的零拷贝技术

在 Kafka 中&#xff0c;高性能数据传输依赖于操作系统提供的 零拷贝&#xff08;Zero-Copy&#xff09; 技术&#xff0c;主要包括 sendfile 和 mmap 两种实现方式。它们的核心目标是减少数据在用户态和内核态之间的拷贝次数&#xff0c;从而提升 I/O 效率。下面详细解析它们的…...

从 0~1 保姆级 详细版 PostgreSQL 数据库安装教程

PostgreSQL数据库安装 PostgreSQL官网 【PostgreSQL官网】 | 【PostgreSQL安装官网_Windows】 安装步骤 step1&#xff1a; 选择与电脑相对应的PostgreSQL版本进行下载。 step2&#xff1a; 双击打开刚才下载好的文件。 step3&#xff1a; 在弹出的setup窗口中点击 …...

MySQL中常用函数的分类及示例

概述 以下是 MySQL 中常用函数的分类及示例&#xff0c;涵盖字符串处理、数值计算、日期操作、条件判断等常见场景&#xff1a; 一、字符串函数 1. CONCAT(str1, str2, ...) 拼接字符串。 SELECT CONCAT(Hello, , World); -- 输出: Hello World2. SUBSTRING(str, start,…...

【论文阅读21】-PSOSVM-CNN-GRU-Attention-滑坡预测(2024-12)

这篇论文主要提出并验证了一种新型的混合智能模型&#xff08;PSOSVM-CNN-GRU-Attention&#xff09;&#xff0c;用于准确预测滑坡的点位移&#xff0c;并构建可靠的位移预测区间。通过对Baishuihe滑坡和Shuping滑坡的案例分析&#xff0c;展示了该模型的出色性能。 [1] Zai D…...

Shiro-550 动调分析与密钥正确性判断

一、Shiro 简介 Apache Shiro是一个开源安全框架&#xff0c;用于构建 Java 应用程序&#xff0c;提供身份验证、授权、加密和会话管理等功能。 二、Shiro-550&#xff08;CVE-2016-4437&#xff09; 1、漏洞原理 Shiro 在用户登陆时提供可选项 RememberMe&#xff0c;若勾选…...

Codeforces Educational Round 177 Div. 2 【B题,C待补

B 二分 题意 样例 5 3 10 3 4 2 1 512 找最右边的L下标即可 思路 二分最靠右的L端点&#xff0c;R端点取最右端(n*k处)&#xff0c;找到后&#xff0c;答案就是L的位置(pos)&#xff0c;&#xff08;因为如果pos满足&#xff0c;则pos左边的所有下标都满足 代码 const in…...

【Lua语言】Lua语言快速入门

初始Lua Lua是一种轻量小巧的脚本语言&#xff0c;他使用标准C语言编写并以源代码形式开放。这意味着Lua虚拟机可以很方便的嵌入别的程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。同时&#xff0c;在目前脚本引擎中&#xff0c;Lua的运行速度占有绝对优势。 变…...

Matlab画海洋与大气变量的时间序列并带标记面的三维折线图--来源粉丝

Matlab画带标记面的三维折线图–来源粉丝 图片 目标图&#xff1a; 图片 复现&#xff1a; 图片 细节可在代码中更改&#xff1a; 数据构造 clear;clc;close all; % 数据构造 X1 1:8;Y1ones(length(X1),1); X2 X1;Y22*ones(length(X1),1); X3 X1;Y33*ones(length(X1),1); …...

NestJS——多环境配置方案(dotenv、config、@nestjs/config、joi配置校验)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

RAGFlow在Docker中运行Ollama直接运行于主机的基础URL的地址

基础Url http://host.docker.internal:11434...

python 库 下载 ,整合在一个小程序 UIUIUI

上图 import os import time import threading import requests import subprocess import importlib import tkinter as tk from tkinter import ttk, messagebox, scrolledtext from concurrent.futures import ThreadPoolExecutor, as_completed from urllib.parse import…...

【MySQL】数据库约束

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 ✨一、数据库的约束 &#x1f31f;二、数据库约束的分类 &#x1f30d; 1.非空约束&#xff08;NOT NULL&#xff09; 1.定义 2.格式 3.示例&#xff1a; 列的信息可…...

Firewalld防火墙

目录 Firewald 防火墙概述 Firewalld 简介 firewalld 与 iptables service的区别 Firewalld 网络区域 Firewalld 防火墙图形配置方法 服务选项 端口号 协议选项 源端口选项 伪装选项 端口转发 ICMP过滤器 防火墙的配置运行状态 运行时和永久有什么区别 Firewalld 防火墙 firewa…...

使用 TensorFlow 和 Keras 构建 U-Net

U-Net是图像分割领域中最为著名的架构之一。U-Net 因其形状而得名&#xff0c;它是一种全卷积架构&#xff0c;首先将图像收缩&#xff0c;然后将其扩展为输出结果。虽然这种收缩路径构建了一个学习特征的层次结构&#xff0c;但跳过连接有助于在扩展路径中将这些特征转换回相关…...

【网络篇】TCP vs UDP底层区别+网络编程概念

大家好呀 我是浪前 今天讲解的是网络篇的第三章&#xff1a;网络编程概念和TCP&UDP的区别 网络编程概念TCP和UDP的区别 跨主机通信:网络编程插座&#xff1a;网络编程的本质&#xff1a; 网络编程的重要概念&#xff1a;客户端和服务器&#xff1a; 客户端和服务器的交互模…...

如何保存服务器mysql数据库的数据到本地文件

打开mysql命令行如图1 图1 mysql命令行 修改文件保存路径。 在mysql安装目录下&#xff0c;找到my.ini文件&#xff0c;找到secure-file-priv变量配置的地方&#xff0c;修改对应的值&#xff0c;然后重启mysql&#xff0c;此时把文件放到指定路径&#xff0c;再执行导入导出…...

Flutter学习 滚动组件(2):ListView进阶使用

目录 前言&#xff1a;一、实现复杂的ListView列表&#xff1a;1.1 Item布局封装1.2 ListView的使用1.3 增加分割线 二、实现ListView下拉刷新&#xff1a;三、实现上拉加载更多&#xff1a;四、实现下拉刷新、上拉加载更多&#xff1a;五、ListView滚动方向和控制&#xff1a;…...

linux oracle 19c 静默安装

oracle数据库有个比较很抓瞎的事情&#xff0c;不同的版本搭建的大致流程是一样的&#xff0c;但是在实操细节上会有不同&#xff0c;比如操作的脚本位置和配置项等等&#xff0c;这些会变&#xff0c;所以需要时常积累不同版本的文档 这里有一点要说明&#xff0c;之所以使用…...

中间件--ClickHouse-11--部署示例(Linux宿主机部署,Docker容器部署)

一、Linux宿主机部署 1、环境准备 操作系统&#xff1a;推荐使用 CentOS 7/8 或 Ubuntu 18.04/20.04。硬件要求&#xff1a; 至少 2 核 CPU 和 4GB 内存。足够的磁盘空间&#xff08;根据数据量评估&#xff09;。CPU需支持SSE4.2指令集&#xff08;可通过以下命令检查&#…...

AI调试工具有哪些?

一、深度学习框架专用调试工具 TensorBoard • 功能&#xff1a;实时监控训练指标&#xff08;损失值、准确率&#xff09;、可视化神经网络结构、分析参数分布和梯度信息 • 适用框架&#xff1a;TensorFlow、PyTorch&#xff08;通过插件&#xff09; • 特点&#xff1a;支持…...

Warcraft Logs [Classic] [WCL] BOSS ID query

Warcraft Logs [Classic] [WCL] BOSS ID query 所有副本BOSSID查询 https://wowpedia.fandom.com/wiki/DungeonEncounterID#Retail IDNameMapInstanceIDPatch227High Interrogator GerstahnBlackrock Depths230228Lord RoccorBlackrock Depths230229Houndmaster GrebmarBlackro…...

MySQL——事务

一、什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09; 是数据库操作的最小逻辑单元&#xff0c;它由一组不可分割的SQL操作组成。事务的核心目标是确保多个操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而维护数据的完整性。例如&#xff0c;银行转…...

spring Ai---向量知识库(一)

在一些垂直领域以及公司内部信息相关或者实时性相关的大模型应用&#xff0c;就无法直接使用chatGPT。 这个时候&#xff0c;向量知识库就进入了。 通过坐标向量最接近的即为匹配相关答案。 向量模型定义&#xff1a;将文档向量化&#xff0c;保证内容越相似的文本&#xff0c;…...

MACOS 上的 快捷指令怎么用,有哪些分享资源可以用

一、快捷指令的基本概念与历史 快捷指令(Shortcuts)是苹果生态中的自动化工具,最初以第三方应用Workflow(2014年推出)的形式出现,2017年被苹果收购后更名为Shortcuts,并深度集成到iOS、iPadOS和macOS系统中。从macOS Mojave(10.14)开始,快捷指令正式登陆Mac平台,并…...

最长子序列长度(LIS)--个数遍历的二分+贪心优化

B3637 最长上升子序列 - 洛谷 #include<bits/stdc.h> #include<string> using namespace std; #define N 100011 typedef long long ll; typedef pair<int,int> pii; int n; int g[N]; int dp[N]; int ma0; int main() { cin>>n; memset(g,0x3f,sizeo…...

RenderStage::runCameraSetUp

文章目录 RTTosg::Camera::_bufferAttachmentMapRenderStage::BufferComponent和RenderStage::_bufferAttachmentMapCamera::attach(BufferComponent buffer, GLenum internalFormat)Camera::attach(BufferComponent buffer, osg::Texture* texture.....Camera::attach(BufferC…...

突破速率瓶颈:毫米波技术如何推动 5G 网络迈向极限?

突破速率瓶颈&#xff1a;毫米波技术如何推动 5G 网络迈向极限&#xff1f; 引言 5G 网络的普及&#xff0c;已经让我们告别了“加载中”时代&#xff0c;实现了更快的数据传输、更低的延迟和更高的设备连接密度。而在 5G 技术的核心中&#xff0c;毫米波&#xff08;mmWave&…...

前端面试真题集合(一)

一、Vue的响应式原理 Vue的响应式系统通过数据劫持和依赖追踪实现,核心流程如下: 数据劫持 • Vue 2.x:使用Object.defineProperty递归遍历数据对象,将属性转换为getter/setter,拦截属性的读取和修改操作。 • Vue 3.x:改用Proxy代理对象,支持动态属性添加和数组变化监听…...

聊聊Spring AI Alibaba的ElasticsearchDocumentReader

序 本文主要研究一下Spring AI Alibaba的ElasticsearchDocumentReader ElasticsearchDocumentReader community/document-readers/spring-ai-alibaba-starter-document-reader-elasticsearch/src/main/java/com/alibaba/cloud/ai/document/reader/es/ElasticsearchDocumentR…...

【网络技术_域名解析DNS】三、DNS 中间件实践应用与优化策略

一、DNS 中间件在典型行业的实践应用 1.1 金融行业&#xff1a;保障交易安全与服务稳定​ 金融行业对网络服务的安全性和稳定性要求极高&#xff0c;DNS 中间件在此领域发挥着不可替代的作用。以某银行线上支付系统为例&#xff0c;在 CentOS 7 环境下部署 DNS 中间件时&…...

Node.js 异步I/O与事件循环深度优化

Node.js 的核心魅力在于其异步、非阻塞I/O模型&#xff0c;这使得它在处理高并发、I/O密集型应用&#xff08;如Web服务器、API网关、实时通信服务&#xff09;时表现出色。然而&#xff0c;这种强大的能力并非凭空而来&#xff0c;它深深植根于其独特的**事件循环&#xff08;…...

npm 常用操作和配置

一、npm 核心操作 1. 初始化项目 npm init # 交互式创建 package.json npm init -y # 跳过提问&#xff0c;直接生成默认 package.json2. 安装依赖 npm install <package> # 安装包到本地 node_modules&#xff08;生产依赖&#xff09; npm in…...

嵌入式芯片中的 低功耗模式 内容细讲

电源域与运行级别概述 电源域&#xff08;Power Domain&#xff09; 核心域&#xff08;Core Domain&#xff09;&#xff1a;包括 CPU 核心和关键架构模块&#xff08;如 NVIC、CPU 内核寄存器&#xff09;。 外设域&#xff08;Peripheral Domain&#xff09;&#xff1a;…...

React-请勿在循环或者条件语句中使用hooks

这是React Hooks的首要规则&#xff0c;这是因为React Hooks 是以单向循环链表的形式存储&#xff0c;即是有序的。循环是为了从最后一个节点移到一个节点的时候&#xff0c;只需通过next一步就可以拿到第一个节点&#xff0c;而不需要一层层回溯。React Hooks的执行&#xff0…...

React-memo (useMemo, useCallback)

在react中&#xff0c;当我们setState之后&#xff0c;若值发生变化&#xff0c;则会重新render当前组件以及其子组件 (默认情况下)&#xff0c;在必要的时候&#xff0c;我可使用memo (class组件则对应shouldComponentUpdate、PureComponent)进行优化&#xff0c;来减少无效渲…...

点云数据处理开源C++方案

一、主流开源库对比 库名称特点适用场景开源协议活跃度PCL功能最全&#xff0c;算法丰富科研、工业级应用BSD★★★★★Open3D现代API&#xff0c;支持Python绑定快速开发、深度学习MIT★★★★☆CGAL计算几何算法强大网格处理、高级几何运算GPL/LGPL★★★☆☆PDAL专注于点云…...