海康视频播放,包含h5和web插件

自行下载
海康开放平台
在这里插入图片描述
demo 都写得很清楚,不多描述

1.视频web插件

在这里插入图片描述

vue2写法,公共vue文件写法,调用文件即可

开始时需要以下配置,不知道的找对接平台数据的人,必须要,否则播不了

getParameterData: {port: 443,ip: "10.10.1.12",appKey: "20294202",appSecret: "ndqCAFyke4t1jHY2r8Uy",enableHTTPS: 1,
}, //海康数据
<!-- 海康插件组件 -->
<template><div class="video-center" ref="videoCenter"><div :id="playWnd" class="playWnd"></div></div></template><script>const control = require("../video/jsWebControl-1.0.0.min.js");const jsencrypt = require("../video/jsencrypt.min.js");export default {data() {return {oWebControl: null,pubKey: "",initCount: 0,w: 0,h: 0,winId: 1,};},props: {playWnd: {type: String,default: 'playWnd',},//播放类型  0预览 1回放playMode: {type: Number,default: 0,},//初始化数据initData: {type: Object,default() {return {enableHttps: 1,encryptedFields: "secret",layout: "1x1",btIds: "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769",showSmart: 1,showToolbar: 1,snapDir: "D:\\SnapDir",videoDir: "D:\\VideoDir",};},},},created: function () {this.initPlugin();},mounted: function () {this.$nextTick(()=>{this.h = this.$refs["videoCenter"].clientHeight;this.w = this.$refs["videoCenter"].clientWidth;})window.addEventListener("resize",() => {if (this.$refs["videoCenter"]) {this.h = this.$refs["videoCenter"].clientHeight;this.w = this.$refs["videoCenter"].clientWidth;this.resetFun();}});},computed: {},methods: {// 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口setWndCover() {var iWidth = window.width;var iHeight = window.height;var oDivRect = document.querySelector("#"+this.playWnd).getBoundingClientRect();var iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0;var iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0;var iCoverRight =oDivRect.right - iWidth > 0? Math.round(oDivRect.right - iWidth): 0;var iCoverBottom =oDivRect.bottom - iHeight > 0? Math.round(oDivRect.bottom - iHeight): 0;iCoverLeft = iCoverLeft > this.w ? this.w : iCoverLeft;iCoverTop = iCoverTop > this.h ? this.h : iCoverTop;iCoverRight = iCoverRight > this.w ? this.w : iCoverRight;iCoverBottom = iCoverBottom > this.h ? this.h : iCoverBottom;this.oWebControl.JS_RepairPartWindow(0, 0, this.w + 1, this.h); // 多1个像素点防止还原后边界缺失一个像素条if (iCoverLeft != 0) {this.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, this.h);}if (iCoverTop != 0) {this.oWebControl.JS_CuttingPartWindow(0,0,this.w + 1,iCoverTop); // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条}if (iCoverRight != 0) {this.oWebControl.JS_CuttingPartWindow(this.w - iCoverRight,0,iCoverRight,this.h);}if (iCoverBottom != 0) {this.oWebControl.JS_CuttingPartWindow(0,this.h - iCoverBottom,this.w,iCoverBottom);}},// 初始化init() {this.getPubKey(() => {let { appSecret, ...hkData } = this.$store.state.getParameterData;//海康提供的认证信息this.oWebControl.JS_RequestInterface({funcName: "init",argument: JSON.stringify({appkey: hkData.appKey,                            //API网关提供的appkeysecret: this.setEncrypt(appSecret),            //API网关提供的secretip: hkData.ip,                                    //API网关IP地址playMode: this.playMode,                        //播放模式(决定显示预览还是回放界面)port: hkData.port,                                //端口snapDir: this.initData.snapDir,                    //抓图存储路径videoDir: this.initData.videoDir,                      //紧急录像或录像剪辑存储路径layout: this.initData.layout,                    //布局enableHTTPS: hkData.enableHTTPS,                  //是否启用HTTPS协议encryptedFields: this.initData.encryptedFields,          //加密字段showToolbar: this.initData.showToolbar,                  //是否显示工具栏showSmart: this.initData.showSmart,                      //是否显示智能信息})}).then((oData) => {// 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题this.oWebControl.JS_Resize(this.w, this.h);});});},/* 视频预览业务功能 */startPreviewFun(val) {this.oWebControl.JS_RequestInterface({funcName: "startPreview",argument: JSON.stringify({cameraIndexCode: val,streamMode: 0,transMode: 1,gpuMode: 0,wndId: this.winId,}),}).then((oData) => {console.log('播放成功',oData)});},/* 视频回放业务功能 */startPlaybackFun(val, start, end, streamMode = 1) {this.oWebControl.JS_RequestInterface({funcName: "startPlayback",argument: JSON.stringify({cameraIndexCode: val,                   //监控点编号startTimeStamp: start,  //录像查询开始时间戳,单位:秒endTimeStamp: end,      //录像结束开始时间戳,单位:秒streamMode: streamMode,recordLocation: 0,                     //录像存储类型:0-中心存储,1-设备存储transMode: 1,                               //传输协议:0-UDP,1-TCPgpuMode: 0,                                   //是否启用GPU硬解,0-不启用,1-启用wndId: this.wndId                                     //可指定播放窗口})}).then((oData) => {console.log('回放',oData)});},// RSA加密setEncrypt(value) {var encrypt = new jsencrypt.JSEncrypt();encrypt.setPublicKey(this.pubKey);return encrypt.encrypt(value);},// 推送消息cbIntegrationCallBack(oData) {// 窗口选中if (oData.responseMsg.type === 1) {this.winId = oData.responseMsg.msg.wndId}},// 设置窗口控制回调setCallbacks() {this.oWebControl.JS_SetWindowControlCallback({cbIntegrationCallBack: this.cbIntegrationCallBack,});},/* 获取公钥 */getPubKey(callback) {this.oWebControl.JS_RequestInterface({funcName: "getRSAPubKey",argument: JSON.stringify({keyLength: 1024,}),}).then((oData) => {if (oData.responseMsg.data) {this.pubKey = oData.responseMsg.data;callback();}});},// 加载插件initPlugin() {let _this = this;this.oWebControl = new control.WebControl({szPluginContainer: this.playWnd,iServicePortStart: 15900,iServicePortEnd: 15909,szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsidcbConnectSuccess: function () {_this.setCallbacks();_this.oWebControl.JS_StartService("window", { dllPath: "./VideoPluginConnect.dll"}).then(() => {_this.oWebControl.JS_CreateWnd(_this.playWnd, _this.w, _this.h).then(() => {_this.init();});},function () {});},cbConnectError: function () {_this.oWebControl = null;initCount ++;if (initCount < 3) {                             setTimeout(function () {initPlugin();}, 3000)} else {console.log('插件启动失败,请检查插件是否安装!')}},cbConnectClose: function (bNormalClose) {console.log("cbConnectClose");_this.oWebControl = null;},});},// 重置窗口大小resetFun() {if (this.oWebControl != null) {this.oWebControl.JS_Resize(this.w, this.h);this.setWndCover();}},},destroyed() {this.oWebControl.JS_HideWnd();this.oWebControl.JS_DestroyWnd().then(function () {console.log("销毁插件窗口成功");},function () {console.log("销毁插件窗口失败");});},};</script><style scoped="scoped">.video-center {width: 100%;height: 100%;}</style>

不完整,自行补充

<template><PreviewVideoref="webVideo":playMode="0":initData="initData"/>
</template>
<script>
export default {data() {return {initData: {enableHttps: 0,encryptedFields: "secret",layout: "2x2", // 4个窗口showSmart: 1,showToolbar: 1,snapDir: "D:SnapDir",videoDir: "D:VideoDir",},}},method () {//播放时调用videoPlayFun() {//预览//第三方标识,由海康提供,后端传回this.$refs['webVideo'].startPreviewFun(data.deviceNameEn)//回放,需要回放时间,若使用element的时间戳,需要/1000,变为秒单位//playMode传1this.$refs['webVideo'].startPlaybackFun(data.deviceNameEn,startTime,endTime)}}
}
</script>
vue3+vite

playVideo传第三方标识,请自行修改以下变量值如上
可直接复制使用vue,点击播放
能直接使用,测试如下,可测试第三方标识能否使用
在这里插入图片描述

在这里插入图片描述

<template><div class="video-center" ref="videoCenter"><div @click="playVideo('1005ede4f95a4447897b8fd1fa8cd6f7', 1)">"1005ede4f95a4447897b8fd1fa8cd6f7"</div><div @click="playVideo('933d67747cb248ba93e0a65b5ac751ac', 2)">"933d67747cb248ba93e0a65b5ac751ac"</div><div @click="playVideo('e77fa1c7d9f04c9b893a74d441d5a53b', 3)">"e77fa1c7d9f04c9b893a74d441d5a53b"</div><div id="playWnd" class="playWnd"></div></div>
</template>
<script setup lang="ts">
import { onMounted, ref, reactive, unref } from 'vue'
var initCount = 0;
var oWebControl = null
var pubKey = '';
// 创建播放实例
const initPlugin = () => {oWebControl = new WebControl({szPluginContainer: "playWnd",                       // 指定容器idiServicePortStart: 15900,                           // 指定起止端口号,建议使用该值iServicePortEnd: 15900,                             szClassId:"23BF3B0A-2C56-4D97-9C03-0CB103AA8F11",   // 用于IE10使用ActiveX的clsidcbConnectSuccess: function () {                     // 创建WebControl实例成功											oWebControl.JS_StartService("window", {         // WebControl实例创建成功后需要启动服务dllPath: "./VideoPluginConnect.dll"         // 值"./VideoPluginConnect.dll"写死 }).then(function () {                           // 启动插件服务成功oWebControl.JS_SetWindowControlCallback({   // 设置消息回调cbIntegrationCallBack: cbIntegrationCallBack});oWebControl.JS_CreateWnd("playWnd", 1000, 600).then(function () { //JS_CreateWnd创建视频播放窗口,宽高可设定init();  // 创建播放实例成功后初始化});}, function () { // 启动插件服务失败});},cbConnectError: function () { // 创建WebControl实例失败oWebControl = null;WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序initCount ++;if (initCount < 3) {                             setTimeout(function () {initPlugin();}, 3000)} else {console.log('插件启动失败,请检查插件是否安装!')// $("#playWnd").html("插件启动失败,请检查插件是否安装!");}},cbConnectClose: function (bNormalClose) {            // 异常断开:bNormalClose = false// JS_Disconnect正常断开:bNormalClose = true	console.log("cbConnectClose");oWebControl = null;console.log('插件未启动,正在尝试启动,请稍候...')// $("#playWnd").html("插件未启动,正在尝试启动,请稍候...");WebControl.JS_WakeUp("VideoWebPlugin://");initCount ++;if (initCount < 3) {setTimeout(function () {initPlugin();}, 3000)} else {console.log('插件启动失败,请检查插件是否安装!')// $("#playWnd").html("插件启动失败,请检查插件是否安装!");}	}});
}
// 推送消息
const cbIntegrationCallBack = (oData) => {console.log(JSON.stringify(oData.responseMsg))
}
const init = () => {getPubKey(function () {// 请自行修改以下变量值			var appkey = "20294202";                           //综合安防管理平台提供的appkey,必填var secret = setEncrypt("ndqCAFyke4t1jHY2r8Uy");   //综合安防管理平台提供的secret,必填var ip = "10.10.1.12";                           //综合安防管理平台IP地址,必填var playMode = 0;                                  //初始播放模式:0-预览,1-回放var port = 443;                                    //综合安防管理平台端口,若启用HTTPS协议,默认443var snapDir = "D:\\SnapDir";                       //抓图存储路径var videoDir = "D:\\VideoDir";                     //紧急录像或录像剪辑存储路径var layout = "2x2";                                //playMode指定模式的布局var enableHTTPS = 1;                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1var encryptedFields = 'secret';					   //加密字段,默认加密领域为secretvar showToolbar = 1;                               //是否显示工具栏,0-不显示,非0-显示var showSmart = 1;                                 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示var buttonIDs = "0,16,256,257,258,259,260,512,513,514,515,516,517,768,769";  //自定义工具条按钮// 请自行修改以上变量值	oWebControl.JS_RequestInterface({funcName: "init",argument: JSON.stringify({appkey: appkey,                            //API网关提供的appkeysecret: secret,                            //API网关提供的secretip: ip,                                    //API网关IP地址playMode: playMode,                        //播放模式(决定显示预览还是回放界面)port: port,                                //端口snapDir: snapDir,                          //抓图存储路径videoDir: videoDir,                        //紧急录像或录像剪辑存储路径layout: layout,                            //布局enableHTTPS: enableHTTPS,                  //是否启用HTTPS协议encryptedFields: encryptedFields,          //加密字段showToolbar: showToolbar,                  //是否显示工具栏showSmart: showSmart,                      //是否显示智能信息buttonIDs: buttonIDs                       //自定义工具条按钮})}).then(function (oData) {oWebControl.JS_Resize(1000, 600);  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题});});
}//获取公钥
const getPubKey = (callback) => {oWebControl.JS_RequestInterface({funcName: "getRSAPubKey",argument: JSON.stringify({keyLength: 1024})}).then(function (oData) {console.log(oData);if (oData.responseMsg.data) {pubKey = oData.responseMsg.data;callback()}})
}//RSA加密
const setEncrypt = (value) => {var encrypt = new JSEncrypt();encrypt.setPublicKey(pubKey);return encrypt.encrypt(value);
}
onMounted(() => {initPlugin()window.addEventListener('unload', () => {if (oWebControl != null){oWebControl.JS_HideWnd();}})window.addEventListener('resize', () => {if (oWebControl != null) {oWebControl.JS_Resize(1000, 600);setWndCover();}})window.addEventListener('scroll', () => {if (oWebControl != null) {oWebControl.JS_Resize(1000, 600);setWndCover();}})
})
const setWndCover = () => {var iWidth = window.innerWidth;var iHeight = window.innerHeight;var oDivRect = document.querySelector("#playWnd").getBoundingClientRect();console.log('oDivRect', oDivRect)var iCoverLeft = (oDivRect.left < 0) ? Math.abs(oDivRect.left): 0;var iCoverTop = (oDivRect.top < 0) ? Math.abs(oDivRect.top): 0;var iCoverRight = (oDivRect.right - iWidth > 0) ? Math.round(oDivRect.right - iWidth) : 0;var iCoverBottom = (oDivRect.bottom - iHeight > 0) ? Math.round(oDivRect.bottom - iHeight) : 0;iCoverLeft = (iCoverLeft > 1000) ? 1000 : iCoverLeft;iCoverTop = (iCoverTop > 600) ? 600 : iCoverTop;iCoverRight = (iCoverRight > 1000) ? 1000 : iCoverRight;iCoverBottom = (iCoverBottom > 600) ? 600 : iCoverBottom;oWebControl.JS_RepairPartWindow(0, 0, 1001, 600);    // 多1个像素点防止还原后边界缺失一个像素条if (iCoverLeft != 0) {oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, 600);}if (iCoverTop != 0) {oWebControl.JS_CuttingPartWindow(0, 0, 1001, iCoverTop);    // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条}if (iCoverRight != 0) {oWebControl.JS_CuttingPartWindow(1000 - iCoverRight, 0, iCoverRight, 600);}if (iCoverBottom != 0) {oWebControl.JS_CuttingPartWindow(0, 600 - iCoverBottom, 1000, iCoverBottom);}
}
const playVideo = (val:string, i) => {oWebControl.JS_RequestInterface({funcName: "startPreview",argument: JSON.stringify({cameraIndexCode:val,                //监控点编号streamMode: 0,                         //主子码流标识transMode: 1,                           //传输协议gpuMode: 0,                               //是否开启GPU硬解wndId:  i                                    //可指定播放窗口})})
}</script>
<style>.playWnd {width: 1000px;                  /*播放容器的宽和高设定*/height: 600px;border: 1px solid red;}
</style>

2.H5视频播放器

vue3写法,将下载的文件复制到public下
在index.html 引入

<script src="/js/h5player.min.js"></script>

在这里插入图片描述

<!-- 海康插件 -->
<template><div :id="props.playId" class="w-full"></div>
</template>
<script setup lang="ts">
const message = useMessage() // 消息弹窗
const props = defineProps({playId: {require: true,type: String,default: () => {return 'player'}}
})
const player = ref()
onMounted(() => {initPlayer()// 设置播放容器的宽高并监听窗口大小变化window.addEventListener('resize', () => {player.value.JS_Resize()})
})
const emit = defineEmits(['error'])
const initPlayer = () => {// @ts-ignoreplayer.value = new JSPlugin({szId: props.playId,szBasePath: '/js',bSupporDoubleClickFull: true,// 当容器div#play_window有固定宽高时,可不传iWidth和iHeight,窗口大小将自适应容器宽高// iWidth: props.iWidth,// iHeight: props.iHeight,// 分屏播放,默认最大分屏4*4iMaxSplit: 4,iCurrentSplit: 1})// 事件回调绑定player.value.JS_SetWindowControlCallback({//插件选中窗口回调windowEventSelect: (iWndIndex) => {console.log('windowSelect callback: ', iWndIndex)wndIndex.value = iWndIndex},// @ts-ignore 取流失败,流中断等错误都会触发该回调函数pluginErrorHandler: (index, iErrorCode, oError) => {// 取流失败if (iErrorCode === '0x12f910011') emit('error')}})
}
const wndIndex = ref(0)
const createPlayer = (url: string, i = wndIndex.value) => {console.log('视频流地址:', url, props.playId)if (!url) returnplayer.value.JS_Play(url, { playURL: url, mode: 0 }, i).then(() => {console.log('play success=============')},(err) => {// message.warning('播放失败!')console.info('JS_Play failed:', err)})
}
// 分屏
const splitPlayer = (num) => {if (num === 1) wndIndex.value = 0player.value.JS_ArrangeWindow(num)
}
// 全屏
const fullScreen = (isFull) => {player.value.JS_FullScreenDisplay(isFull)
}
// 回放
const replayFun = (data) => {player.value.JS_Play(data.url, { playURL: data.url, mode: 0 }, 0, data.startTime, data.endTime).then(() => {console.log('playbackStart success')},(err) => {console.info('JS_Play failed:', err)})
}
// 设置窗口大小
const resizeFun = (iWidth, iHeight) => {player.value.JS_Resize(iWidth, iHeight)
}
const stopAllPlay = () => {player.value.JS_StopRealPlayAll().then(() => {console.info('JS_StopRealPlayAll success')})
}
const playerFun = {createPlayer,splitPlayer,fullScreen,replayFun,resizeFun,stopAllPlay
}
defineExpose({ playerFun })
</script>

不完整,自行补充

 <player class="w-full h-400px" ref="playRef" />

在这里插入图片描述
这是我本地的地址,需要后端返回类似的
ws和hls都试过可以播放,ws基本没延迟,优先使用

 unref(playRef).playerFun.createPlayer(item, index)回放时间格式要转为 format('YYYY-MM-DDTHH:mm:ss.SSSZ')unref(playRef).playerFun.replayFun({ ... })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/38737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万字总结随机森林原理、核心参数以及调优思路

万字总结随机森林原理、核心参数以及调优思路 在机器学习的世界里&#xff0c;随机森林&#xff08;Random Forest, RF&#xff09;以其强大的预测能力和对数据集的鲁棒性而备受青睐。作为一种集成学习方法&#xff0c;随机森林通过构建多个决策树并将它们的预测结果进行汇总&…

暴雨来袭,陈赫家变“水帘洞”网友:赫哥滴滴打船吗?

在魔都上海&#xff0c;一场突如其来的暴雨 不仅让街道变成了河流&#xff0c;还悄悄上演了一场现实版的“水帘洞”奇遇 而这场奇遇的主角&#xff0c;竟然是喜剧界的明星——陈赫&#xff01; 这天&#xff0c;乌云密布&#xff0c;电闪雷鸣 魔都的天空仿佛被捅了个窟窿 雨…

吴恩达《LangChain for LLM Application Development》课程笔记

目录 1. 前言 2. 课程笔记 2.1. 模型、提示和解析器 2.2. LLM记忆&#xff0c;上下文管理 2.3. 链式操作 2.4. 文档问答 2.4.1. stuff 方法 2.4.2. 其他方法 2.5. LLM应用评估 2.6. 代理 2.6.1. 预定义工具 2.6.2. 自定义工具 代码资源&#xff1a; 1. 前言 LangC…

文心一言 VS 讯飞星火 VS chatgpt (293)-- 算法导论21.4 2题

二、证明&#xff1a;每个结点的秩最多为 ⌊lgm⌋ 。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在数据结构和算法中&#xff0c;当我们谈论“结点的秩”时&#xff0c;这通常与某些特定的数据结构&#xff08;如B树或B树&#xff09;相关&#xff0c;其中每…

代码随想录算法训练营第40天| 518. 零钱兑换 II、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)

518. 零钱兑换 II 题目链接&#xff1a;518. 零钱兑换 II 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 思路&#xff1a; 和494.目标和类似&#xff0c;这题属于组合问题&#xff0c;当我们有一个硬币coin时&#xff0c;对于每个金额j&#xff0c;通过添加这个硬币&a…

平安养老险陕西分公司参加2024上半年省级单位驻富平帮扶团联席会

6月28日&#xff0c;平安养老险陕西分公司工会副主席武媛携驻村工作队赴富平县庄里镇永安村参加2024上半年度省级单位驻富平帮扶团联席会议。 会议由省委金融办副主任、省委金融工委委员李嘉辉及省委金融办选派挂职干部、富平县副县长席玮共同主持。 会上&#xff0c;席玮县长带…

吴恩达机器学习 第三课 week2 推荐算法(下)

目录 01 学习目标 02 基于内容的过滤算法 03 实现“电影推荐系统” 3.1 问题描述 3.2 算法实现 04 大项目&#xff08;数据很大&#xff09;的推荐方法※ 4.1 方法原理 4.2 实施示例 05 总结 01 学习目标 &#xff08;1&#xff09;理解基于内容的过滤算法&#xff08…

嵌入式问题分析思路

BUG解决总体思路: 1.1 定位bug范围及性质 要有效解决问题&#xff0c;首先要缩小范围&#xff0c;集中关注最近的代码变化。这有助于迅速定位可能引入问题的部分&#xff0c;避免无谓的时间浪费。检查最近的代码提交记录和修改日志&#xff0c;找出可能影响现有功能的变更。然…

如果使用Outlook 2024出现问题

大家好&#xff0c;才是真的好。 很多企业使用Domino服务器当作POP/IMAP邮箱服务器来使用&#xff0c;虽然这不能发挥Domino最佳效能&#xff0c;但也不失为一种简单用法。 另一种企业则使用Domino仅作为应用app平台&#xff0c;邮箱早已迁移至O365或其他平台&#xff0c;他们…

报销又乱又慢,财务如何解决报销困局?

费用报销是企业频繁发生的业务场景&#xff0c;不同的企业在费用报销的流程、标准、制度、管理上各有不同。作为一些公司日常运作中的薄弱环节&#xff0c;费用报销环节存在着较大的内控风险&#xff0c;如&#xff1a;费用报销滞后&#xff0c;造成会计信息的失真&#xff0c;…

【YOLOv5/v7改进系列】更换损失函数为CIOU、GIOU、SIOU、DIOU、EIOU、WIOUv1/v2/v3、Focal C/G/S/D/EIOU等

一、导言 在目标检测任务中&#xff0c;损失函数的主要作用是衡量模型预测的边界框&#xff08;bounding boxes&#xff09;与真实边界框之间的匹配程度&#xff0c;并指导模型学习如何更精确地定位和分类目标。损失函数通常由两部分构成&#xff1a;分类损失&#xff08;用于…

我的世界服务器-高版本服务器-MC服务器-生存服务器-RPG服务器-幻世星辰

生存为主&#xff0c;RPG乐趣为辅&#xff0c;重视每位玩家的建议&#xff0c;一起打造心目中的服务器&#xff0c;与小伙伴一起探险我的世界&#xff01; 服务器版本: 1.18.2 ~ 1.20.4 Q群&#xff1a; 338238381 服务器官网: 星辰毛毛雨-Minecraft高版本生存服务器我的世界…

springboot是否可以代替spring

Spring Boot不能直接代替Spring&#xff0c;但它是Spring框架的一个扩展和增强&#xff0c;提供了更加便捷和高效的开发体验。以下是关于Spring Boot和Spring关系的详细解释&#xff1a; Spring框架&#xff1a; Spring是一个广泛应用的开源Java框架&#xff0c;提供了一系列模…

EDI是什么?与ERP有何关系

EDI的发展过程 电子数据交换&#xff08;Electronic Data Interchange&#xff0c;EDI&#xff09;是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代&#xff0c;当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…

nccl 04 nvidia 官方小程序

1&#xff0c;代码重新编辑 为了地毯式地检查结果的正确性&#xff0c;这里修改了代码 主要步骤为 step1: data_p指向的空间中&#xff0c;分别生成随机数&#xff1b; step2: 分别拷贝到gpu的sendbuff的显存中&#xff1b; step3: 通过nccl_all_reduce sum&#xff1b;…

掌握 Python 中 isinstance 的正确用法

&#x1f44b; 简介 isinstance() 函数用于判断一个对象是否是一个特定类型或者在继承链中是否是特定类型的实例。它常用于确保函数接收到的参数类型是预期的。 &#x1f4d6; 正文 1 语法 isinstance(object, classinfo) object参数是要检查的对象&#xff1b;classinfo参数…

【工具推荐】ONLYOFFICE8.1版本编辑器测评——时下的办公利器

文章目录 一、产品介绍1. ONLYOFFICE 8.1简介2. 多元化多功能的编辑器 二、产品体验1. 云端协作空间2. 桌面编辑器本地版 三、产品界面设计1. 本地版本2. 云端版本 四、产品文档处理1. 文本文档&#xff08;Word)2. 电子表格&#xff08;Excel&#xff09;3. PDF表单&#xff0…

【C++ | 继承】|概念、方式、特性、作用域、6类默认函数

继承 1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容 派生类的创建和销毁构造函数拷贝构造赋值重载 1.继承的概念与定义 继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。 在软件开发过程…

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…

什么是协程?协程和线程的区别

文章目录 前置知识应用程序和内核阻塞和非阻塞同步和异步并发和并行IO 发展历史同步编程异步多线程/进程异步消息 回调函数&#xff08;响应式编程&#xff09; 协程协程基本概念go 示例代码协程和线程的区别 个人简介 前置知识 在了解协程前&#xff0c;我们先理解一些相关的…