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 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 
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中集成海康SDKSpring Boot可以通过以下步骤进行: 1. 首先,确保已经在Linux系统上安装了JDK和Spring Boot。这可以通过使用包管理器(如apt-get或yum)或手动下载和安装的方式来实现。 2. 接下来,从海康官方网站下载并获取最新的海康SDK的Linux版本。将下载的SDK文件解压到合适的目录中。 3. 在Spring Boot项目的依赖管理文件(如pom.xml)中,添加引用海康SDK的依赖项。这可以通过在dependencies标签中添加相关的依赖项来实现。注意在添加依赖项之前,需要首先将SDK文件安装到本地Maven仓库或者提供引用其他本地存储库的路径。 4. 在Spring Boot应用程序的Java代码中,使用SDK提供的API实现与海康设备(如摄像头)的交互。根据需要,可以调用不同的SDK功能,例如视频流获取、设备状态的查询等等。可以根据SDK提供的文档和示例代码来学习使用SDK的API。 5. 在Spring Boot应用程序的配置文件中,提供与海康SDK相关的配置参数,如设备的IP地址、端口号、用户名、密码等等。这些配置参数的具体内容可以根据实际情况进行调整。 6. 最后,通过运行Spring Boot应用程序,可以实现与海康设备的集成。可以使用Spring Boot提供的web服务来提供与设备交互的接口,如获取视频流、控制设备等等。 需要注意的是,集成海康SDK可能面临一些挑战,如SDK与Linux的兼容性、依赖项的版本问题等等。在遇到问题时,可以参考SDK的文档、搜索相关的解决方案或者与SDK的技术支持团队取得联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值