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

news2024/12/29 13:44:11

自行下载
海康开放平台
在这里插入图片描述
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网关提供的appkey
                            secret: this.setEncrypt(appSecret),            //API网关提供的secret
                            ip: 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-TCP
                    gpuMode: 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的clsid
                cbConnectSuccess: 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>
	<PreviewVideo
	   ref="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传1
		this.$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",                       // 指定容器id
			iServicePortStart: 15900,                           // 指定起止端口号,建议使用该值
			iServicePortEnd: 15900,                             
			szClassId:"23BF3B0A-2C56-4D97-9C03-0CB103AA8F11",   // 用于IE10使用ActiveX的clsid
			cbConnectSuccess: 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协议,默认443
        var snapDir = "D:\\SnapDir";                       //抓图存储路径
        var videoDir = "D:\\VideoDir";                     //紧急录像或录像剪辑存储路径
        var layout = "2x2";                                //playMode指定模式的布局
        var enableHTTPS = 1;                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
        var encryptedFields = 'secret';					   //加密字段,默认加密领域为secret
  var 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网关提供的appkey
                secret: secret,                            //API网关提供的secret
                ip: 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-ignore
  player.value = new JSPlugin({
    szId: props.playId,
    szBasePath: '/js',
    bSupporDoubleClickFull: true,
    // 当容器div#play_window有固定宽高时,可不传iWidth和iHeight,窗口大小将自适应容器宽高
    // iWidth: props.iWidth,
    // iHeight: props.iHeight,
    // 分屏播放,默认最大分屏4*4
    iMaxSplit: 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) return
  player.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 = 0
  player.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.coloradmin.cn/o/1883252.html

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

相关文章

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航&#xff0c;就是当我们滑动页面到某一个位置的时候&#xff0c;导航不会因为滑动而消失&#xff0c;会固定在页面的顶部&#xff0c;我们来看一下如何实现&#xff1b; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来&#xff0c;这就需要…

【后端面试题】【中间件】【NoSQL】MongoDB的优点和分片机制

为什么要用MongoDB 两个关键&#xff1a;灵活性和横向扩展能力 MongoDB是灵活的文档模型&#xff0c;也就是说&#xff0c;如果预计我的数据可以被一个稳定的模型来描述&#xff0c;会倾向于使用MySQL等关系型数据库。而一旦我认为我的数据模型会经常变动&#xff0c;比如我很…

斩获大奖!移远通信以高算力智能模组产品,推动工业生产智能化发展

6月27日&#xff0c;在2024 MWC上海期间&#xff0c;由通信世界全媒体主办的2024信息通信业“新智推荐”优秀企业/方案获奖名单重磅发布。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信凭借其丰富的高算力智能模组产品&#xff0c;以及相关方案在工业智能领域的…

RK3568驱动指南|第十五篇 I2C-第167章 I2C上拉电阻

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

HTML如何在图片上添加文字

HTML如何在图片上添加文字 当我们开发一个页面&#xff0c;插入图片时&#xff0c;需要有一组文字对图片进行描述。那么HTML中如何在图片上添加文字呢&#xff1f;这篇文章告诉你。 先让我们来看下效果图&#xff1a; 句子“这是一张夜空图片”被放置在了图片的左下角。 那么…

SpringBoot整合Solr进行搜索(简单)

SpringBoot整合Solr进行搜索 创建SpringBoot项目pom中加入Solr依赖配置 Solr创建实体编写一个简单的ID查询打印结果 参考文章 创建SpringBoot项目 这里基于aliyun提供的快速构建一个项目。我们这主要是整合Solr。 pom中加入Solr依赖 maven下载地址 pom中加入以下内容&#x…

Redis分布式集群部署

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一&#xff1a; 实验二&#xff1a; 实验三&#xff1a; 实验四&#xff1a; 添加节点 自动分配槽位 提升节点为master&#xff1a; 实验…

如果使用Outlook 2024出现问题

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

安装和微调大模型(基于LLaMA-Factory)

打开终端&#xff08;在Unix或macOS上&#xff09;或命令提示符/Anaconda Prompt&#xff08;在Windows上&#xff09;。 创建一个名为lora的虚拟环境并指定Python版本为3.9。 https://github.com/echonoshy/cgft-llm/blob/master/llama-factory/README.mdGitHub - hiyouga/…

.net8 Syncfusion生成pdf/doc/xls/ppt最新版本

新建控制台程序 添加包Syncfusion.Pdf.Net.Core包&#xff0c;当前官方的版本号为26.1.39 直接上代码 Syncfusion.Pdf.PdfDocument pdfDocument new Syncfusion.Pdf.PdfDocument(); for (int i 1; i < 10; i) {var page pdfDocument.Pages.Add();PdfGraphics graphics…

学习笔记(linux高级编程)9

void pthread_cleanup_push(void (*routine)(void *)&#xff0c; void *arg); 功能&#xff1a;注册一个线程清理函数 参数&#xff0c;routine&#xff0c;线程清理函数的入口 arg&#xff0c;清理函数的参数。 返回值&#xff0c;无 void pthread_cleanup_pop(int execute)…

Open3D 点云的旋转与平移

目录 一、概述 1.1旋转 1.2平移 二、代码实现 2.1实现旋转 2.2实现平移 2.3组合变换 三、实现效果 3.1原始点云 3.2变换后点云 一、概述 在Open3D中&#xff0c;点云的旋转和平移是通过几何变换来实现的。几何变换可以应用于点云对象&#xff0c;使其在空间中移动或旋…

navicat Lite 版

navicat Lite 版&#xff1a; Navicat 出了一个 Navicat Premium 的Lite版。 官方现在链接&#xff1a;https://www.navicat.com.cn/download/navicat-premium-lite#windows 从官网可以看到现在能够下载最新版本 17&#xff0c;支持各种平台

HSP_11章 Python面向对象编程oop_进阶部分

文章目录 P118_119 Python_封装1. 面向对象编程特征2. 封装介绍3. 封装的细节和好处4. 私有成员5. 代码演示5. 注意事项和使用细节5.1伪私有属性 P120 Python_继承快速入门1. 为什么需要继承2. 继承的基本介绍3. 继承的示意图 4. 继承的基本语法 P121 Python_继承的注意事项和细…

1.5 Canal 数据同步工具详细教程

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

面向阿克曼移动机器人(自行车模型)的LQR(最优二次型调节器)路径跟踪方法

线性二次调节器&#xff08;Linear Quadratic Regulator&#xff0c;LQR&#xff09;是针对线性系统的最优控制方法。LQR 方法标准的求解体系是在考虑到损耗尽可能小的情况下, 以尽量小的代价平衡其他状态分量。一般情况下&#xff0c;线性系统在LQR 控制方法中用状态空间方程描…

工程化:Commitlint / 规范化Git提交消息格式

一、理解Commitlint Commitlint是一个用于规范化Git提交消息格式的工具。它基于Node.js&#xff0c;通过一系列的规则来检查Git提交信息的格式&#xff0c;确保它们遵循预定义的标准。 1.1、Commitlint的核心功能 代码规则检查&#xff1a;Commitlint基于代码规则进行检查&a…

16_C语言编程基础

目录 C语言入门 程序段和代码段 C语言入门实例 英文分号(;) 注释 标识符 保留字 C中的空格 C数据类型 基本类型 sizeof获取存储字节 void类型 变量 C数组 C枚举 C中的左值(lvalue)和右值(rvalue) C常量 变量存储类型 C常用关键字(保留字) 宏定义#define co…

视频孪生助力智慧工厂:可视化安防管理与报警告警

在当今快速迭代的工业4.0时代&#xff0c;智慧工厂已成为提升生产效率、优化资源配置的关键所在。面对日益复杂的生产环境和多元化的业务需求&#xff0c;如何构建一个高效、智能且具备强大适应能力的智慧工厂也成为了众多厂商关注的焦点。为了满足工业制造的转型需求&#xff…

element el-table表格切换分页保留分页数据+限制多选数量

el-table表格并没有相关的方法来禁用表头里面的多选按钮 那么我们可以另辟蹊径&#xff0c;来实现相同的多选切换分页&#xff08;保留分页数据&#xff09; 限制多选数量的效果 <el-table:data"tableData"style"width: 100%">// 不使用el-talbe自带…