直接上代码吧:
前端页面专递点的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