springboot集成海康sdk,针对视频流获取某一点的实时温度

news2024/9/19 18:24:45

直接上代码吧:

前端页面专递点的x和y的坐标及其设备的ip

@RequestMapping(value = "/getRealTemperatureByPoint")
public float getRealTemperatureByPoint(HttpServletRequest request) {
    Map<String, Object> params = ParamUtil.getParams(request);
    String x = MapUtils.getString(params, "x");
    String y = MapUtils.getString(params, "y");
    String ip = MapUtils.getString(params, "ip");
    //根据ip获取用户名、密码和端口
    Map<String, Object> deviceInfo = deviceDao.getDeviceInfoByIp(ip);
    if (deviceInfo.size()>0){
        String username = (String) deviceInfo.get("username");
        String password = (String) deviceInfo.get("password");
        Short port =  Short.parseShort(deviceInfo.get("port").toString());
        // 登陆设备
        int userId = ClientDemo.login_V40_x(ip, port, username, password);
        //取流
        Float temperature = VideoDemo.getTemperature(new HKPoint(Float.parseFloat(x),Float.parseFloat(y)),256, 192,userId);
        System.out.println("温度是·············"+((float)Math.round(temperature * 10)) / 10);
        return ((float)Math.round(temperature * 10)) / 10;
    }else {
        return 0.0f;
    }

}

效果如图

部分调用的代码:videoDemo里的代码部分

package com.ydx.yemms.video.hk.NetSDKDemo;

import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.ydx.yemms.video.hk.Thermometry.HKPoint;
import org.springframework.stereotype.Component;

import java.io.*;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;

import static com.ydx.yemms.video.hk.NetSDKDemo.ClientDemo.hCNetSDK;
import static com.ydx.yemms.video.hk.NetSDKDemo.ClientDemo.playControl;

/**
 * 视频取流预览,下载,抓图mok
 * @create 2022-03-30-9:48
 */
@Component
public class VideoDemo {
    Timer downloadtimer;//下载用定时器
    Timer Playbacktimer;//回放用定时器
    static FRealDataCallBack fRealDataCallBack;//预览回调函数实现
    static fPlayEScallback fPlayescallback; //裸码流回调函数
    static playDataCallBack playBackCallBack; //回放码流回调
    static int lPlay = -1;  //预览句柄
    static int Count=0;
    int m_lLoadHandle;
    int iPlayBack; //回放句柄
    static File file;
    static boolean palybackFlay=false;
    static FileOutputStream outputStream;
    static IntByReference m_lPort= new IntByReference(-1);
    static String resultFileName = "..\\Download" + new String("returnFile" + ".h264");
    static FileOutputStream fileOutputStream = null;
    static int fileLenth = 0;

    public static void realPlay(int userID, int iChannelNo) {
        if (userID == -1) {
            System.out.println("请先注册");
            return;
        }
//        HCNetSDK.NET_DVR_PREVIEWINFO strClientInfo = new HCNetSDK.NET_DVR_PREVIEWINFO();
        HCNetSDK.NET_DVR_CLIENTINFO strClientInfo = new HCNetSDK.NET_DVR_CLIENTINFO();
        strClientInfo.lChannel=2;
//        strClientInfo.read();
//        strClientInfo.hPlayWnd = 0;  //窗口句柄,从回调取流不显示一般设置为空
//        strClientInfo.lChannel = iChannelNo;  //通道号
//        strClientInfo.dwStreamType=0; //0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
//        strClientInfo.dwLinkMode=0; //连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4- RTP/RTSP,5- RTP/HTTP,6- HRUDP(可靠传输) ,7- RTSP/HTTPS,8- NPQ
//        strClientInfo.bBlocked=1;
//        strClientInfo.byProtoType = 0;
//        strClientInfo.write();

        //回调函数定义必须是全局的
        if (fRealDataCallBack == null) {
            fRealDataCallBack = new FRealDataCallBack();
        }

        //开启预览
        lPlay = hCNetSDK.NET_DVR_RealPlay_V30(userID, strClientInfo, fRealDataCallBack , null,false);
//        lPlay = hCNetSDK.NET_DVR_RealPlay_V40(userID, strClientInfo, fRealDataCallBack , null);
        if (lPlay == -1) {
            int iErr = hCNetSDK.NET_DVR_GetLastError();
            System.out.println("取流失败" + iErr);
            return;
        }
        System.out.println("取流成功");

        //设置裸码流回调函数
//        if (fPlayescallback==null)
//        {
//            fPlayescallback=new fPlayEScallback();
//        }
//        boolean setcallback=hCNetSDK.NET_DVR_SetESRealPlayCallBack(lPlay,fPlayescallback,null);
//        if (setcallback==false)
//        {
//            System.out.println("设置裸码流回调失败,错误码:"+hCNetSDK.NET_DVR_GetLastError());
//        }

        //取流解码过程中播放库从解码码流中抓图
//        getPicbyPlayCtrl();

        /**
         * 预览一段时间;如果要一直取流预览,需要保证程序一直运行
         */
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        String path = ".\\savevideo.mp4";
        Boolean bSaveVideo = hCNetSDK.NET_DVR_SaveRealData_V30(lPlay,0x2,path);
        if (bSaveVideo == false) {
            int iErr = hCNetSDK.NET_DVR_GetLastError();
            System.out.println("NET_DVR_SaveRealData_V30 failed" + iErr);
            return;
        }
        System.out.println("NET_DVR_SaveRealData_V30 suss");

        try {
            Thread.sleep(0);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Boolean bStopSaveVideo = hCNetSDK.NET_DVR_StopSaveRealData(lPlay);
        if (bStopSaveVideo == false) {
            int iErr = hCNetSDK.NET_DVR_GetLastError();
            System.out.println("NET_DVR_StopSaveRealData failed" + iErr);
            return;
        }
        System.out.println("NET_DVR_StopSaveRealData suss");


        if (lPlay>=0) {
            if (hCNetSDK.NET_DVR_StopRealPlay(lPlay))
            {
                System.out.println("停止预览成功");
                return;
            }
        }
    }

    //播放库抓图
    public static void getPicbyPlayCtrl(String path){

        //取流成功后,延时一段时间保证播放库解码开始
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        IntByReference pWidth = new IntByReference(0);
        IntByReference pHieght = new IntByReference(0);
        boolean bFlag = playControl.PlayM4_GetPictureSize(m_lPort.getValue(), pWidth, pHieght);
        if (!bFlag) {
            System.out.println("获取失败:" + playControl.PlayM4_GetLastError(m_lPort.getValue()));
        }
        System.out.println(pWidth.getValue());
        System.out.println(pHieght.getValue());
        IntByReference RealPicSize = new IntByReference(0);
        int picsize = pWidth.getValue() * pHieght.getValue() * 5;
        HCNetSDK.BYTE_ARRAY picByte = new HCNetSDK.BYTE_ARRAY(picsize);
        picByte.write();
        Pointer pByte = picByte.getPointer();
        boolean b_GetPic = playControl.PlayM4_GetJPEG(m_lPort.getValue(), pByte, picsize, RealPicSize);
        if (!b_GetPic) {
            System.out.println("抓图失败:" + playControl.PlayM4_GetLastError(m_lPort.getValue()));
        }
        picByte.read();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
        String newName = sf.format(new Date());
        FileOutputStream fout = null;
        try {

            fout = new FileOutputStream(path+ "/" + newName + ".jpeg");
            //将字节写入文件
            long offset = 0;
            ByteBuffer 

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

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

相关文章

vue elementPlus中使用dayjs

安装了elementPlus后无需再次下载dayjs,因为element 中包含了dayjs 官网截图 引入方法&#xff1a; import { dayjs } from element-plus// 引入中文包 import dayjs/locale/zh-cn dayjs.locale(zh-cn) // 设置中文 使用方法和dayjs 官网一致 const state reactive({week…

Linux 安装TELEPORT堡垒机

一、查看官方文档 堡垒机官网地址&#xff1a;走向成功 - Teleport&#xff0c;高效易用的堡垒机 &#xff08;一&#xff09;官网资源链接 -》Teleport 在线文档 &#xff08;二&#xff09;手动下载安装包 二、压缩包下载和安装 &#xff08;一&#xff09;加压下载的安装…

实现高效研发运营一体化:深度落地DevOps解决方案的探索与实践

前言与概述 伴随着企业业务的快速发展&#xff0c;为了支撑业务发展&#xff0c;提高 IT 对业务的支撑能力建设。在研发工程协同方面&#xff0c;希望加强代码管理&#xff0c;实现持续构建、自动化测试、自动化部署、自动化运维&#xff0c;同时加强产品的安全和质量管理&…

VBA调用Office的MODI组件识别图片中的文字

Microsoft Office Document Imaging (MODI)是Office 2003-2007版本中的一个利用OCR&#xff08;Optical Character Recognition 光学字符识别&#xff09;技术识别图像中的文字并转换为文本的一个组件。在VBA中使用该组件需要在“工具-引用”中将其设置为“可使用的引用”&…

基于Kotlin Multiplatform的鸿蒙跨平台开发实践

一、 背景 在 2023 年的华为开发者大会&#xff08;HDC&#xff09;上&#xff0c;华为预告了一个全新的鸿蒙系统 Harmony Next 版本。与之前的鸿蒙系统不同&#xff0c;Harmony Next完全摒弃了对 AOSP 的兼容&#xff0c;彻底基于 OpenHarmony 开源鸿蒙实现。这意味着该系统将…

集团数字化转型方案(七)

集团数字化转型方案旨在通过全面整合先进的信息技术和数据分析工具&#xff0c;构建一个高度智能化的业务平台&#xff0c;实现从生产、供应链到客户服务的全链条数字化升级&#xff0c;通过自动化流程优化、数据驱动的决策支持和智能化的业务运营&#xff0c;提升整体运营效率…

基于x86 平台opencv的图像采集和seetaface6的静默活体功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的静默活体功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的静默活体模块从而实现…

C语言 | Leetcode C语言题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; bool canMeasureWater(int jug1Capacity, int jug2Capacity, int targetCapacity) {int j1 jug1Capacity < jug2Capacity ? jug1Capacity : jug2Capacity, j2 jug1Capacity > jug2Capacity ? jug1Capacity : jug2Capacity;if (ta…

C++ 设计模式——单例模式

单例模式 C 设计模式——单例模式1. 单例模式的基本概念与实现2. 多线程环境中的问题3. 内存管理问题1. 内存泄漏风险2. 自动释放策略3. 垃圾回收机制4. 嵌套类与内存管理 4. UML 图UML 图解析 优缺点适用场景总结 C 设计模式——单例模式 单例模式&#xff08;Singleton Patt…

【Canvas与艺术】环形Z字纹

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形Z字纹</title><style type"text/css">.ce…

Transformer 论文通俗解读:FFN 的作用

在经过前面3节关于 Transformer 论文的解读之后&#xff0c;相信你对提出 Transformer 架构的这篇论文有了一定的了解了&#xff0c;你可以点击下面的链接复习一下前3节的内容。 《Attention is all you need》通俗解读&#xff0c;彻底理解版&#xff1a;part1 《Attention …

基于ssm+vue+uniapp的跑腿平台小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

qt的QCustomPlot绘制实时曲线图总结

一、组件的下载 下载下来后文件如下图所示&#xff0c;具有丰富的例程&#xff0c;这个很好&#xff0c;注意后面要用到的c文件和头文件&#xff0c;听说还有丰富的帮助文档&#xff0c;暂时没有时间去找&#xff0c;大概翻看了一下没有看到 二、拷贝.h 和c文件到工程目录&…

asp.net Core blazor学习笔记

最近在研究学习blazor&#xff0c;为了加深记忆&#xff0c;手动记录一下&#xff0c;以下内容为个人理解记录&#xff0c;仅供参考&#xff1a; Blazor开发学习 一 分类1 Blazor Server 应用2 Blazor WebAssembly 应用3 Blazor Hybrid 应用和 .NET MAUI 二 基础知识1 路由2 组…

使用预训练的 ONNX 格式的 YOLOv8n 模型进行目标检测,并在图像上绘制检测结果

目录 __init__方法&#xff1a; pre_process方法&#xff1a; run方法&#xff1a; filter_boxes方法&#xff1a; view_img方法&#xff1a; ​​​​​​​__init__方法&#xff1a; 初始化类的实例时&#xff0c;创建一个onnxruntime的推理会话&#xff0c;加载名为yolo…

电机启动对单片机重启的影响

单片机使用ASM1117对9V电压降压供电&#xff0c;IO口接三极管控制电机 &#xff0c;接9V&#xff1b;每次启动瞬间&#xff0c;单片机重启 试进行分析 网上参考&#xff0c;添加滤波&#xff0c;电容&#xff0c;阻容&#xff1b;分开电源处理&#xff08;双电源&#xff09;&…

JVM虚拟机(二)如何定位垃圾、判断对象是否死亡?垃圾回收算法、垃圾回收器、CMS、G1垃圾回收器

一、GC基本信息 1.1 什么是GC&#xff0c;垃圾回收&#xff1f; JVM的垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;是一种自动内存管理机制&#xff0c;其主要目的是识别并清除不再使用的对象&#xff0c;释放内存空间以供应用程序中的其他部分使用。G…

go+gin+vue入门

后端框架 1、安装go、goland 2、创建空项目 3、下载要用的包&#xff1a;命令行输入go get -u github.com/xxxx 4、安装mysql数据库&#xff0c;使用navicat创建数据库。 5、按照项目框架搭建目录、文件、代码&#xff1a;如router、model… 6、运行测试&#xff0c;go run ma…

C语言基础(十一)

1、指针&#xff1a; C语言中的指针是一种非常重要的数据类型&#xff0c;可以直接访问和操作内存地址。指针存储变量的内存地址&#xff0c;而不是变量的值本身。通过使用指针&#xff0c;可以灵活地控制数据的存储和访问&#xff0c;实现复杂的数据结构如链表、树。 定义指…

C++操作excel,即使函数设置了不备份,但保存后,excel依然会自动生成备份文件的原因分析,及如何来禁止自动备份

开发环境 操作系统&#xff1a;windows 10 编译器&#xff1a;Visual Studio 2010、2015、2017、2022 office 2016、2019、2021 wps 2019、2024 问题描述 通过C操作excel&#xff0c;保存后&#xff0c;excel会自动生成备份文件。 void CExcelDemoDlg::OnBnClickedButton1() …