Java海康威视摄像头实时预览视频流保存到指定文件中

it2022-05-05  244

海康威视摄像头实时预览视频流保存到文件中

目前在开发海康威视sdk ,IPC设备,视频回调用的是官方提供的Demo中的(fRealDataCallBack ) 在最下面代码可以设置Thread.sleep()设置拍摄时长 注:本文为博主原创文章,未经博主允许不得转载。 如需转载请注明出处,否则必定追究法律责任

初始化Windows-SDK-Java环境: https://blog.csdn.net/weixin_44232093/article/details/104815264控制云台相机PTZ位置: https://blog.csdn.net/weixin_44232093/article/details/97649823指定拍摄时长录制文件-控制云台到达指定位置-指定放大倍数 : https://blog.csdn.net/weixin_44232093/article/details/104948872提取音频保存至文件 : https://blog.csdn.net/weixin_44232093/article/details/99406803保存实时预览视频至文件 : https://blog.csdn.net/weixin_44232093/article/details/96429942 package ClientDemo; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import java.io.File; public class HIKSDKSaveRealData { public static void main(String[] args) { HIKSDKSaveRealData HikSdk= new HIKSDKSaveRealData(); short port =8000; //初始化连接信息 用户名密码IP地址端口号 CameraInfo cameraInfo = new CameraInfo(); cameraInfo.setAddress("192.168.1.64"); cameraInfo.setPort(port); cameraInfo.setUserName("admin"); cameraInfo.setPwd("gw*123456"); //查看当前DVR参数信息和初始化注册等 传入连接信息 不需要可以注释掉 HikSdk.getDVRConfig(cameraInfo); HikSdk.SaveRealDataformDir(cameraInfo); } /* * 获取实时视频方法 传入连接信息对象 * 目的:获取到实时视频存入指定文件中 保存为Mp4格式文件 * */ public void getDVRConfig(CameraInfo cameraInfo){ HCNetSDK sdk =HCNetSDK.INSTANCE; //创建hcnetsdk实例对象 if (!sdk.NET_DVR_Init()){ System.out.println("初始化失败.........."); return; } //设置超时时间与重连次数 sdk.NET_DVR_SetConnectTime(2000, 1); sdk.NET_DVR_SetReconnect(10000, true); //创建设备 HCNetSDK.NET_DVR_DEVICEINFO_V30 deInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); System.out.println("设备信息: " +deInfo); //注册用户设备 NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), cameraInfo.getPort(), cameraInfo.getUserName(), cameraInfo.getPwd(), deInfo); //把返回的UserId放进实例对象中 cameraInfo.setUserId(id); //判断是否注册成功 login if(cameraInfo.getUserId().intValue()<0){ System.out.println("注册失败,错误码为"+sdk.NET_DVR_GetLastError()); return; } //查看DVR工作状态 HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30(); if(!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(),devwork )){ System.out.println("返回设备状态失败"); return; } //ip参数设置 IntByReference ibrBytesReturned = new IntByReference(0);// 获取IP接入配置参数 HCNetSDK.NET_DVR_IPPARACFG ipcfg = new HCNetSDK.NET_DVR_IPPARACFG();//IP接入配置结构 ipcfg.write(); //获取接受数据的缓冲指针 Pointer lpIpParaConfig = ipcfg.getPointer(); /*获取相关参数配置 参数说明 *第一个参数为 loginV30的返回值 Id * 第二个参数为 获取配置的代号code * 第三个参数为 通道号 置零即可 * 第四个参数为 缓冲区指针大小 从demo对象中后获取对象获取指针size * 第五个参数为 实际收到的数据长度指针 创建IntByReference对象即可 * */ sdk.NET_DVR_GetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0), lpIpParaConfig, ipcfg.size(), ibrBytesReturned); ipcfg.read(); System.out.print("IP地址:" + cameraInfo.getAddress()); System.out.println("|设备状态:" + devwork.dwDeviceStatic);// 0正常,1CPU占用率过高,2硬件错误,3未知 /* 显示模拟通道 *获取模拟通道个数 * 具体获取其他参数详见sdk文档 -参数配置-5.13.3 * */ for (int i = 0; i < deInfo.byChanNum; i++) { System.out.print("Camera" + i + 1);// 模拟通道号名称 System.out.print("|是否录像:" + devwork.struChanStatic[i].byRecordStatic);// 0不录像,不录像 System.out.print("|信号状态:" + devwork.struChanStatic[i].bySignalStatic);// 0正常,1信号丢失 System.out.println("|硬件状态:" + devwork.struChanStatic[i].byHardwareStatic);// 0正常,1异常 } //注销用户 sdk.NET_DVR_Logout(cameraInfo.getUserId());//释放SDK资源 sdk.NET_DVR_Cleanup(); } void SaveRealDataformDir(CameraInfo cameraInfo){ //设置设备通道号 查看Demo代码 通道号为1 NativeLong channel = new NativeLong(1); cameraInfo.setChannel(channel); //初始化HCNetSDK接口 实例化对象 HCNetSDK sdk = HCNetSDK.INSTANCE; if (!sdk.NET_DVR_Init()) { System.out.println("初始化失败.................."); } //创建设备 HCNetSDK.NET_DVR_DEVICEINFO_V30 deInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); //注册用户设备 NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), cameraInfo.getPort(), cameraInfo.getUserName(), cameraInfo.getPwd(), deInfo); cameraInfo.setUserId(id); //判断是否注册成功 if(cameraInfo.getUserId().intValue()<0){ System.out.println("注册设备失败 错误码为: " +sdk.NET_DVR_GetLastError()); }else { System.out.println("注册成功 Id为: "+ cameraInfo.getUserId().intValue()); } //判断是否获取到设备能力 HCNetSDK.NET_DVR_WORKSTATE_V30 devWork = new HCNetSDK.NET_DVR_WORKSTATE_V30(); if(!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devWork)){ System.out.println("获取设备能力集失败,返回设备状态失败..............."); } //启动实时预览功能 创建clientInfo对象赋值预览参数 HCNetSDK.NET_DVR_CLIENTINFO clientInfo = new HCNetSDK.NET_DVR_CLIENTINFO(); clientInfo.lChannel=cameraInfo.getChannel(); //设置通道号 clientInfo.lLinkMode=new NativeLong(0); //TCP取流 clientInfo.sMultiCastIP=null; //不启动多播模式 //创建窗口句柄 clientInfo.hPlayWnd=null; ClientDemo clientDemo = new ClientDemo(); ClientDemo.FRealDataCallBack fRealDataCallBack = clientDemo.fRealDataCallBack; //开启实时预览 NativeLong key = sdk.NET_DVR_RealPlay_V30(cameraInfo.getUserId(), clientInfo, fRealDataCallBack, null, true); //判断是否预览成功 if(key.intValue()==-1){ System.out.println("预览失败 错误代码为: "+sdk.NET_DVR_GetLastError()); sdk.NET_DVR_Logout(cameraInfo.getUserId()); sdk.NET_DVR_Cleanup(); } // 如果没有文件则创建 保存在 D://realData/result.mp4 中 File file = new File("D:\\realData"); if (!file.exists()) { file.mkdir(); } //预览成功后 调用接口使视频资源保存到文件中 if(!sdk.NET_DVR_SaveRealData(key, file.getAbsolutePath()+ "\\result.mp4")){ System.out.println("保存到文件失败 错误码为: "+sdk.NET_DVR_GetLastError()); sdk.NET_DVR_StopRealPlay(key); sdk.NET_DVR_Logout(cameraInfo.getUserId()); sdk.NET_DVR_Cleanup(); } try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } //上面设置的睡眠时间可以当做拍摄时长来使用,然后调用结束预览,注销用户,释放资源就可以了 sdk.NET_DVR_StopRealPlay(key); sdk.NET_DVR_Logout(cameraInfo.getUserId()); sdk.NET_DVR_Cleanup(); // 程序运行完毕退出阻塞状态 System.exit(0); } } CameraInfo对象 private String address; private String userName; private String pwd; private short port; private NativeLong userId; private NativeLong channel; private NativeLong key; // get set方法

测试Java Demo 初步为这样 ,以后修改会更新 借鉴文章链接:https://blog.csdn.net/Yuruiyu/article/details/79565261 另外提取出的视频可以用VLC观看


最新回复(0)