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

直接上代码吧:

前端页面专递点的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 blocke.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 blocke.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.rhkb.cn/news/406764.html

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

相关文章

小区社区超市商城停车场管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

Linux 信号 signal,sigaction,sigqueue,kill,相关函数

驱动与应用的结合&#xff0c;参考我的这篇&#xff1a;https://blog.csdn.net/rjszcb/article/details/113573517 一、 什么是信号 信号是软中断,用于通知进程某个事件已经发生。进程可以选择如何响应信号:忽略、默认处理、自定义处理等。 常见信号有:SIGINT(键盘中断)、SIGK…

C语言程序设计-练习篇

华夏波澜壮阔&#xff0c;少年仍需前行。 十&#xff0c;实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定 #include <stdio.h> //实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定 void print_table(int …

启动docker镜像

1、运行容器 2、当前运行的进程 3、当前位置和启动时间 4、cat/etc/redhat-release查看版本 5.镜像是模版&#xff0c;容器是实例 6.容器中没有命令运 7.容器总是能轻易获取 8.配置yum 9.安装http 10.修改index⽂件 11.httpd -k start 12.访问 13.退出就没有服务了 14…

Redis配置及idea部分操作

配置Redis远程访问 修改访问IP地址 #跳转到redis安装目录 cd /usr/local/redis-6.2.1 #修改redis.conf配置文件 vi redis.conf #注释redis.conf第69行的配置项 #bind 127.0.0.1 设置登录密码 找到下面这一行并去除注释&#xff0c;并添加密…

【微服务】SpringCloud Alibaba 10-14章

10 SpringCloud Alibaba入门简介 10.1 是什么 诞生 2018.10.31&#xff0c;Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器&#xff0c;并在 Maven 中央库发布了第一个版本。 Spring Cloud Alibaba 介绍 10.2 能干嘛 https://github.com/alibaba/spring-cloud-al…

git常用操作合集

1 撤销 1.1 适用场景 如果在git上提交了commit&#xff0c;但是当前提交的代码有问题&#xff0c;需要回退到上个版本 1.2 操作命令 1、git log 查看历史提交记录及对应的commit id 找到需要回退的commit id 2、执行git reset回退到之前的状态 git reset --hard <commi…

基于Springboot和BS架构的宠物健康咨询系统pf

TOC springboot509基于Springboot和BS架构的宠物健康咨询系统pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#x…

day37动态规划+三.Github链接本地仓库

一.动态规划 474.一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 思路:这道题更像是另一种的0-…

C++ 设计模式——外观模式

外观模式 C 设计模式——外观模式主要组成部分1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;Subsystem&#xff09;3. 客户端&#xff08;Client&#xff09; 例一&#xff1a;工作流程示例1. 外观类&#xff08;Facade&#xff09;2. 子系统类&#xff08;…

假期作业--数据结构

1、顺序表实现学生管理系统&#xff08;参照顺序表技能&#xff09;写出菜单界面switch选择&#xff0c;功能1创建顺序表&#xff08;堆区&#xff09;&#xff0c;2录入学生信息&#xff0c;3插入一个学生信息&#xff0c;4删除一个学生信息&#xff0c;5按照位置修改一个学生…

Android.bp和Android.mk文件有的区别

文章目录 1. 构建系统2. 语法和格式3. 可维护性和扩展性4. 编译效率5. 未来趋势 在Android的构建系统中&#xff0c; Android.mk和 android.bp是用于定义如何编译项目文件的两种文件类型&#xff0c;它们有一些显著的区别。 1. 构建系统 Android.mk&#xff1a;使用于基于GN…

探索Facebook的区块链计划:未来社交网络的变革

随着区块链技术的迅速发展&#xff0c;社交网络领域正面临一场深刻的变革。Facebook&#xff0c;作为全球最大且最具影响力的社交平台之一&#xff0c;正在积极探索区块链技术的应用。本文将深入探讨Facebook的区块链计划&#xff0c;分析其潜在的变革性影响&#xff0c;并展望…

一款好看的WordPress REST API 主题

介绍&#xff1a; 主题特色&#xff1a; 使用Nuxtjs WordPress Rest Api 实现前后端分离&#xff0c;可完成多端部署&#xff1b; 主题支持自动切换黑夜模式。 使用说明&#xff1a; service 目录为wordpress主题文件&#xff0c;需要拷贝到wordpress主题目录下&#xff0…

【本社翻译】Unity官方XR开发电子书

上个月&#xff08;2024年7月&#xff09;&#xff0c;Unity 官方发布了一本聚焦 XR 开发的电子书&#xff0c;书名为《Create Virtual and Mixed Reality Experiences in Unity》。本书系统介绍了以 XR Interaction Toolkit 为代表的一系列 Unity XR 开发工具集&#xff0c;深…

java多线程(七)AQS(AbstractQueuedSynchronizer)技术解析:以赛跑起跑场景为例

AQS概括 核心思想 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是Java并发包中的一个核心同步器框架&#xff0c;它定义了一套多线程访问共享资源的同步机制。 其核心思想是&#xff1a;利用一个volatile的int类型的变量state来表示同步状态&#xff0c;并通过一…

ansible:

ansible&#xff1a; 远程自动化运维 ansible是基于python开发的配置管理和应用部署工具。 也是自动化运维的重要工具。 可以批量配置&#xff0c;部署&#xff0c;管理上千台主机。 只需要在一台主机配置ansible就可以完成其他主机的操作。 操纵模式&#xff1a; 1、模…

黑神话:悟空-配置推荐

显卡推荐&#xff08;按类别整理&#xff09; 1. GTX 10系列、GTX 16系列&#xff1a; 如果希望体验光线追踪&#xff0c;建议根据预算升级到RTX 40系列显卡。对于1080p分辨率&#xff0c;至少需要RTX 4060才能流畅运行。 2. RTX 20系列&#xff1a; RTX 2060、RTX 2070&#…

第二十七节、人物可互动标识

一、多个场景同时存在 方法&#xff1a;将另一个场景拖拽进 当前场景中 这样在一个场景中保存物体&#xff0c;另一个场景切换即可 创建一个场景名为上图&#xff08;这是一个持久化的场景&#xff09; 被激活的场景是粗体字的 二、代码 使用第二个代码获得player的子物体 …

SQL注入(cookie、base64、dnslog外带、搜索型注入)

目录 COOKIE注入 BASE64注入 DNSLOG注入—注入判断 什么是泛解析&#xff1f; UNC路径 网上邻居 LOAD_FILE函数 搜索型注入—注入判断 本文所使用的sql注入靶场为sqli-labs-master&#xff0c;靶场资源文件已上传&#xff0c;如有需要请前往主页或以下链接下载 信安必备…