精华内容
下载资源
问答
  • 海康摄像头 web

    2018-01-31 15:58:07
    海康摄像头web海康摄像头web海康摄像头web海康摄像头web
  • 海康摄像头

    2017-07-31 16:10:59
    很简单的 后台一点关系没有 在js里面改动就可以
  • 海康摄像头二次开发详解准备海康摄像头SDK开发下载路径:开发过程中遇到的问题记录:添加maven依赖下面代码中会出现的实体类CameraManage实体类:ControlDto实体类:加载库文件:初始化:登录控制:查询历史视频保存...

    准备

    海康摄像头SDK开发下载路径:

    https://www.hikvision.com/cn/download_61.html
    

    在这里插入图片描述

    下载解压之后的目录结构:
    1 中为需要加载的库文件;2中有所需的jar包及HCNetSDK.java文件在这里插入图片描述

    开发过程中遇到的问题记录:

    • 一定要记得开启日志打印与及时获取最后一次的错误状态码
    • 一个ip下面会有多个摄像头
    • 如果返回的错误状态码为10:有可能是端口不对,改用8000试试
    • 如果可以登陆却无法控制,有可能是通道错误,有的摄像机通道从1开始,有的从33开始【可通过NET_DVR_GetDVRConfig/NET_DVR_SetDVRConfig来查询和修改相关配置】
    • 查询保存的历史视频的起始时间时:NET_DVR_RECORD_TIME_SPAN_INQUIRY结构体占用内存的大小是68个字节

    添加maven依赖

    <!--海康录像机二次开发依赖jar包-->
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>3.0.9</version>
    </dependency>
    <!--海康录像机sdk官方提供jar包-->
    <dependency>
        <groupId>com.qy</groupId>
        <artifactId>examples</artifactId><!--需要在maven自行安装这个jar包-->
        <version>1.0.0</version>
    </dependency>
    

    下面代码中会出现的实体类

    CameraManage实体类:

    private String deviceIp;
    private Integer devicePort;
    private String username;
    private String password;
    

    ControlDto实体类:

    private Long controlUserId;//用户id
    private Long channel;//通道【有的类型通道从1开始,有的则从33开始,具体看摄像头配置】
    private Integer command;//命令
    private Integer motionSpeed;//运动速度
    private Integer runOrStop;//0启动/1停止
    

    HCNetSDK.java文件中缺失的部分类/方法

    //加载库文件时使用
    public static class BYTE_ARRAY extends Structure
        {
            public byte[] byValue;
    
            public BYTE_ARRAY(int iLen) {
                byValue = new byte[iLen];
            }
    
            @Override
            protected List<String> getFieldOrder() {
                // TODO Auto-generated method stub
                return Arrays.asList("byValue");
            }
        }
    
     public static class NET_DVR_RECORD_TIME_SPAN_INQUIRY extends Structure
        {
            public int    dwSize;    //结构体大小
            public byte    byType;    //0 正常音视频录像, 1图片通道录像, 2ANR通道录像, 3抽帧通道录像
            public byte[]     byRes = new byte[63]; //保留
        }
        public static class NET_DVR_RECORD_TIME_SPAN extends Structure
        {
            public int          dwSize;        //结构体大小
            public NET_DVR_TIME  strBeginTime;  //开始时间
            public NET_DVR_TIME  strEndTime;    //结束时间
            public byte          byType;        //0 正常音视频录像, 1图片通道录像, 2ANR通道录像, 3抽帧通道录像
            public byte[]           byRes = new byte[35];     //保留
    
            @Override
            public String toString() {
                return "NET_DVR_RECORD_TIME_SPAN{" +
                        "dwSize=" + dwSize +
                        ", strBeginTime=" + strBeginTime +
                        ", strEndTime=" + strEndTime +
                        ", byType=" + byType +
                        ", byRes=" + Arrays.toString(byRes) +
                        '}';
            }
        }
    
        boolean NET_DVR_InquiryRecordTimeSpan(NativeLong lUserID, int dwChannel,  NET_DVR_RECORD_TIME_SPAN_INQUIRY lpInquiry, NET_DVR_RECORD_TIME_SPAN lpResult);
    
    

    加载库文件:

    	//修改HCNetSDK.java文件中的加载路径
    	//如果是jar包可能找不到jar包中的文件,所以需要单独存放
    	HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("此处为linux存放库文件libhcnetsdk.so的路径",HCNetSDK.class);
    	hcNetSDK = HCNetSDK.INSTANCE;
    	
    	//如果某些文件加载不到需要手动加载,加载过程如下
    	//设置HCNetSDKCom组件库所在路径
    	String strPathCom = "/opt/project/yc/yc-video/HCNetLib";
    	HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
    	System.out.println(strPathCom.getBytes());
    	System.out.println(struComPath.sPath);
    	System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
    	struComPath.write();
    	hcNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
    	
    	//设置libcrypto.so所在路径
    	HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);
    	String strPathCrypto = "/opt/project/yc/yc-video/HCNetLib/libcrypto.so";
    	System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
    	ptrByteArrayCrypto.write();
    	hcNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
    	
    	//设置libssl.so所在路径
    	HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256);
    	String strPathSsl = "/opt/project/yc/yc-video/HCNetLib/libssl.so";
    	System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
    	ptrByteArraySsl.write();
    	hcNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
    

    初始化:

    	//设置连接超时时间及尝试次数
    	if (!StringUtils.isEmpty(dwWaitTime) && !StringUtils.isEmpty(dwTryTimes)){
    	    boolean b1 = hcNetSDK.NET_DVR_SetConnectTime(Integer.parseInt(dwWaitTime), Integer.parseInt(dwTryTimes));
    	}
    	
    	//开启日志
    	hcNetSDK.NET_DVR_SetLogToFile(true,"/logs-video/",true);
    	
    	//初始化
    	boolean initFlag = hcNetSDK.NET_DVR_Init();
    	
    	if(!initFlag) {
    	    return new ResultMoudel(ResultMoudel.ERROR_FLAG,"初始化失败NET_DVR_Init,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    	}
    

    登录

    	//登陆
    	HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
    	NativeLong userId = hcNetSDK.NET_DVR_Login_V30(cameraManage.getDeviceIp(), (short) cameraManage.getDevicePort().shortValue(), cameraManage.getUsername(), cameraManage.getPassword(), deviceInfo);
    	
    	long lUserId = userId.intValue();
    	if(lUserId !=-1 || 4294967295L != lUserId) {
    	    Map<String, Long> hashMap = new HashMap<>();
    	    hashMap.put("controlUserId",lUserId);
    	    hashMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);
    	    MAP_USERID_AND_CHANNEL.put(cameraManage.getDeviceIp(), hashMap);
    	    return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,hashMap);
    	}
    	return new ResultMoudel(ResultMoudel.ERROR_FLAG,"登陆失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    

    控制:

    	NativeLong channel = new NativeLong(controlDto.getChannel());
    	NativeLong controlUserId = new NativeLong(controlDto.getControlUserId());
    	boolean b = hcNetSDK.NET_DVR_PTZControlWithSpeed_Other(controlUserId, channel, controlDto.getCommand(), controlDto.getRunOrStop(), controlDto.getMotionSpeed());
    	if (b){
    	    return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"正在控制,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    	}
    	return new ResultMoudel(ResultMoudel.ERROR_FLAG,"控制失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    

    查询历史视频保存时间:

    	NativeLong userIdn = new NativeLong(controlUserId);
    	HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY ipInquiry = new  HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY();
    	ipInquiry.dwSize = 68;//68为结构体大小
    	ipInquiry.byType = 0;
    	HCNetSDK.NET_DVR_RECORD_TIME_SPAN ipResult = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN();
    	boolean b = hcNetSDK.NET_DVR_InquiryRecordTimeSpan(userIdn, channel, ipInquiry, ipResult);
    	//获取开始时间
    	HCNetSDK.NET_DVR_TIME strBeginTime = ipResult.strBeginTime;
    	//获取结束时间
    	HCNetSDK.NET_DVR_TIME strEndTime = ipResult.strEndTime;
    

    退出登陆释放资源:

    //退出登陆
    boolean b = hcNetSDK.NET_DVR_Logout(new NativeLong(manageUserId));
    
    //释放资源
    boolean b1 = hcNetSDK.NET_DVR_Cleanup();
    

    完整代码:

    public class VideoUtils {
    
        private static HCNetSDK hcNetSDK;
       // 用于缓存登陆信息,以防止短时间内重复登陆
        private static final Map<String,Map<String,Long>> MAP_USERID_AND_CHANNEL = new HashMap<>();
    
        //登陆
        public static ResultMoudel login(CameraManage cameraManage){
            //加载所需文件
            ResultMoudel resultMoudel = initHCNetSDK();
            if (ResultMoudel.ERROR_FLAG.equals(resultMoudel.getResultFlag())){
                return resultMoudel;
            }
    
            if (!StringUtils.isEmpty(cameraManage.getDeviceIp()) && MAP_USERID_AND_CHANNEL.containsKey(cameraManage.getDeviceIp())){
                Map<String, Long> stringLongMap = MAP_USERID_AND_CHANNEL.get(cameraManage.getDeviceIp());
                stringLongMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);
                return  new ResultMoudel(ResultMoudel.SUCCESS_FLAG, stringLongMap);
            }
    
            //登陆
            HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
            NativeLong userId = hcNetSDK.NET_DVR_Login_V30(cameraManage.getDeviceIp(), (short) cameraManage.getDevicePort().shortValue(), cameraManage.getUsername(), cameraManage.getPassword(), deviceInfo);
    
            long lUserId = userId.intValue();
            if(lUserId !=-1 || 4294967295L != lUserId) {
                Map<String, Long> hashMap = new HashMap<>();
                hashMap.put("controlUserId",lUserId);
                hashMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);
                MAP_USERID_AND_CHANNEL.put(cameraManage.getDeviceIp(), hashMap);
                return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,hashMap);
            }
            return new ResultMoudel(ResultMoudel.ERROR_FLAG,"登陆失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
        }
    
        //控制
        public static ResultMoudel commandControl(ControlDto controlDto) {
    
            NativeLong channel = new NativeLong(controlDto.getChannel());
            NativeLong controlUserId = new NativeLong(controlDto.getControlUserId());
            boolean b = hcNetSDK.NET_DVR_PTZControlWithSpeed_Other(controlUserId, channel, controlDto.getCommand(), controlDto.getRunOrStop(), controlDto.getMotionSpeed());
            if (b){
                return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"正在控制,状态码为"+hcNetSDK.NET_DVR_GetLastError());
            }
            return new ResultMoudel(ResultMoudel.ERROR_FLAG,"控制失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
        }
    
        //退出登陆
        public static ResultMoudel logout(Long manageUserId) {
            //退出登陆
            boolean b = hcNetSDK.NET_DVR_Logout(new NativeLong(manageUserId));
    
            return null;
        }
    
        //释放资源
        public static ResultMoudel release() {
    
            boolean b1 = hcNetSDK.NET_DVR_Cleanup();
            hcNetSDK = null;
            return null;
        }
    
        //初始化
        private static ResultMoudel initHCNetSDK() {
    
            if (hcNetSDK == null){
                System.out.println(HCNetSDK.MAX_NAMELEN);
                hcNetSDK = HCNetSDK.INSTANCE;
                //设置HCNetSDKCom组件库所在路径
                String strPathCom = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib";
                HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
                System.out.println(strPathCom.getBytes());
                System.out.println(struComPath.sPath);
                System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
                struComPath.write();
                hcNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
    
                //设置libcrypto.so所在路径
                HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);
                String strPathCrypto = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib" + File.separator+"libcrypto.so";
                System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
                ptrByteArrayCrypto.write();
                hcNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
    
                //设置libssl.so所在路径
                HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256);
                String strPathSsl = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib" + File.separator+"libssl.so";
                System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
                ptrByteArraySsl.write();
                hcNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
    
    
                //开启日志
                hcNetSDK.NET_DVR_SetLogToFile(true,"/logs-video/",true);
    
                //初始化
                boolean initFlag = hcNetSDK.NET_DVR_Init();
    
                if(!initFlag) {
                    return new ResultMoudel(ResultMoudel.ERROR_FLAG,"初始化失败NET_DVR_Init,状态码为"+hcNetSDK.NET_DVR_GetLastError());
                }
    
            }
            return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"初始化成功,状态码为:"+hcNetSDK.NET_DVR_GetLastError());
        }
    
        //获取历史视频起始时间
        public static List<String> getHistoryVideoMonthlyCalendar(Long controlUserId, Integer channel) {
            NativeLong userIdn = new NativeLong(controlUserId);
            HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY ipInquiry = new  HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY();
            ipInquiry.dwSize = 68;
            ipInquiry.byType = 0;
            HCNetSDK.NET_DVR_RECORD_TIME_SPAN ipResult = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN();
            boolean b = hcNetSDK.NET_DVR_InquiryRecordTimeSpan(userIdn, channel, ipInquiry, ipResult);
            //获取开始时间
            HCNetSDK.NET_DVR_TIME strBeginTime = ipResult.strBeginTime;
            //获取结束时间
            HCNetSDK.NET_DVR_TIME strEndTime = ipResult.strEndTime;
            //获取起始时间和结束时间
            List<String> strings = bingMonthlyCalendar(strBeginTime, strEndTime);
    
            return dateList;
        }
    
        private static List<String> bingMonthlyCalendar(HCNetSDK.NET_DVR_TIME strBeginTime, HCNetSDK.NET_DVR_TIME strEndTime) {
            int yearStart = strBeginTime.dwYear;
            int monthStart = strBeginTime.dwMonth;
            int dayStart = strBeginTime.dwDay;
            int yearEnd = strEndTime.dwYear;
            int monthEnd = strEndTime.dwMonth;
            int dayEnd = strEndTime.dwDay;
            String start = yearStart+"-"+monthStart+"-"+dayStart;
            String end = yearEnd+"-"+monthEnd+"-"+dayEnd;
            List<String> list1 = new ArrayList<>();
            list1.add(start);
            list1.add(end);
            return list1;
        }
    }
    

    视频下载、回放、视频直播、抓图等功能

    视频下载、回放、视频直播、抓图等功能可以参考上述方法并按照开发文档的描述进行开发

    如果开发遇到什么问题请留言评论呀。

    ▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧!

    展开全文
  • 海康摄像头二次开发详解准备海康摄像头SDK开发下载路径:开发过程中遇到的问题记录:添加maven依赖下面代码中会出现的实体类CameraManage实体类:ControlDto实体类:HCNetSDK.java文件中缺失的部分类/方法加载库文件...

    准备

    海康摄像头SDK开发下载路径:

    https://www.hikvision.com/cn/download_61.html
    

    在这里插入图片描述

    下载解压之后的目录结构:
    1 中为需要加载的库文件;2中有所需的jar包及HCNetSDK.java文件在这里插入图片描述

    开发过程中遇到的问题记录:

    • 一定要记得开启日志打印与及时获取最后一次的错误状态码
    • 一个ip下面会有多个摄像头
    • 如果返回的错误状态码为10:有可能是端口不对,改用8000试试
    • 如果可以登陆却无法控制,有可能是通道错误,有的摄像机通道从1开始,有的从33开始【可通过NET_DVR_GetDVRConfig/NET_DVR_SetDVRConfig来查询和修改相关配置】
    • 查询保存的历史视频的起始时间时:NET_DVR_RECORD_TIME_SPAN_INQUIRY结构体占用内存的大小是68个字节

    添加maven依赖

    <!--海康录像机二次开发依赖jar包-->
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>3.0.9</version>
    </dependency>
    <!--海康录像机sdk官方提供jar包-->
    <dependency>
        <groupId>com.qy</groupId>
        <artifactId>examples</artifactId><!--需要在maven自行安装这个jar包-->
        <version>1.0.0</version>
    </dependency>
    

    下面代码中会出现的实体类

    CameraManage实体类:

    private String deviceIp;
    private Integer devicePort;
    private String username;
    private String password;
    

    ControlDto实体类:

    private Long controlUserId;//用户id
    private Long channel;//通道【有的类型通道从1开始,有的则从33开始,具体看摄像头配置】
    private Integer command;//命令
    private Integer motionSpeed;//运动速度
    private Integer runOrStop;//0启动/1停止
    

    HCNetSDK.java文件中缺失的部分类/方法

    //加载库文件时使用
    public static class BYTE_ARRAY extends Structure
        {
            public byte[] byValue;
    
            public BYTE_ARRAY(int iLen) {
                byValue = new byte[iLen];
            }
    
            @Override
            protected List<String> getFieldOrder() {
                // TODO Auto-generated method stub
                return Arrays.asList("byValue");
            }
        }
    
     public static class NET_DVR_RECORD_TIME_SPAN_INQUIRY extends Structure
        {
            public int    dwSize;    //结构体大小
            public byte    byType;    //0 正常音视频录像, 1图片通道录像, 2ANR通道录像, 3抽帧通道录像
            public byte[]     byRes = new byte[63]; //保留
        }
        public static class NET_DVR_RECORD_TIME_SPAN extends Structure
        {
            public int          dwSize;        //结构体大小
            public NET_DVR_TIME  strBeginTime;  //开始时间
            public NET_DVR_TIME  strEndTime;    //结束时间
            public byte          byType;        //0 正常音视频录像, 1图片通道录像, 2ANR通道录像, 3抽帧通道录像
            public byte[]           byRes = new byte[35];     //保留
    
            @Override
            public String toString() {
                return "NET_DVR_RECORD_TIME_SPAN{" +
                        "dwSize=" + dwSize +
                        ", strBeginTime=" + strBeginTime +
                        ", strEndTime=" + strEndTime +
                        ", byType=" + byType +
                        ", byRes=" + Arrays.toString(byRes) +
                        '}';
            }
        }
    
        boolean NET_DVR_InquiryRecordTimeSpan(NativeLong lUserID, int dwChannel,  NET_DVR_RECORD_TIME_SPAN_INQUIRY lpInquiry, NET_DVR_RECORD_TIME_SPAN lpResult);
    
    

    加载库文件:

    	//修改HCNetSDK.java文件中的加载路径
    	//如果是jar包可能找不到jar包中的文件,所以需要单独存放
    	HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("此处为linux存放库文件libhcnetsdk.so的路径",HCNetSDK.class);
    	hcNetSDK = HCNetSDK.INSTANCE;
    	
    	//如果某些文件加载不到需要手动加载,加载过程如下
    	//设置HCNetSDKCom组件库所在路径
    	String strPathCom = "/opt/project/yc/yc-video/HCNetLib";
    	HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
    	System.out.println(strPathCom.getBytes());
    	System.out.println(struComPath.sPath);
    	System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
    	struComPath.write();
    	hcNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
    	
    	//设置libcrypto.so所在路径
    	HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);
    	String strPathCrypto = "/opt/project/yc/yc-video/HCNetLib/libcrypto.so";
    	System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
    	ptrByteArrayCrypto.write();
    	hcNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
    	
    	//设置libssl.so所在路径
    	HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256);
    	String strPathSsl = "/opt/project/yc/yc-video/HCNetLib/libssl.so";
    	System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
    	ptrByteArraySsl.write();
    	hcNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
    

    初始化:

    	//设置连接超时时间及尝试次数
    	if (!StringUtils.isEmpty(dwWaitTime) && !StringUtils.isEmpty(dwTryTimes)){
    	    boolean b1 = hcNetSDK.NET_DVR_SetConnectTime(Integer.parseInt(dwWaitTime), Integer.parseInt(dwTryTimes));
    	}
    	
    	//开启日志
    	hcNetSDK.NET_DVR_SetLogToFile(true,"/logs-video/",true);
    	
    	//初始化
    	boolean initFlag = hcNetSDK.NET_DVR_Init();
    	
    	if(!initFlag) {
    	    return new ResultMoudel(ResultMoudel.ERROR_FLAG,"初始化失败NET_DVR_Init,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    	}
    

    登录

    	//登陆
    	HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
    	NativeLong userId = hcNetSDK.NET_DVR_Login_V30(cameraManage.getDeviceIp(), (short) cameraManage.getDevicePort().shortValue(), cameraManage.getUsername(), cameraManage.getPassword(), deviceInfo);
    	
    	long lUserId = userId.intValue();
    	if(lUserId !=-1 || 4294967295L != lUserId) {
    	    Map<String, Long> hashMap = new HashMap<>();
    	    hashMap.put("controlUserId",lUserId);
    	    hashMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);
    	    MAP_USERID_AND_CHANNEL.put(cameraManage.getDeviceIp(), hashMap);
    	    return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,hashMap);
    	}
    	return new ResultMoudel(ResultMoudel.ERROR_FLAG,"登陆失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    

    控制:

    	NativeLong channel = new NativeLong(controlDto.getChannel());
    	NativeLong controlUserId = new NativeLong(controlDto.getControlUserId());
    	boolean b = hcNetSDK.NET_DVR_PTZControlWithSpeed_Other(controlUserId, channel, controlDto.getCommand(), controlDto.getRunOrStop(), controlDto.getMotionSpeed());
    	if (b){
    	    return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"正在控制,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    	}
    	return new ResultMoudel(ResultMoudel.ERROR_FLAG,"控制失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
    

    查询历史视频保存时间:

    	NativeLong userIdn = new NativeLong(controlUserId);
    	HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY ipInquiry = new  HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY();
    	ipInquiry.dwSize = 68;//68为结构体大小
    	ipInquiry.byType = 0;
    	HCNetSDK.NET_DVR_RECORD_TIME_SPAN ipResult = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN();
    	boolean b = hcNetSDK.NET_DVR_InquiryRecordTimeSpan(userIdn, channel, ipInquiry, ipResult);
    	//获取开始时间
    	HCNetSDK.NET_DVR_TIME strBeginTime = ipResult.strBeginTime;
    	//获取结束时间
    	HCNetSDK.NET_DVR_TIME strEndTime = ipResult.strEndTime;
    

    退出登陆释放资源:

    //退出登陆
    boolean b = hcNetSDK.NET_DVR_Logout(new NativeLong(manageUserId));
    
    //释放资源
    boolean b1 = hcNetSDK.NET_DVR_Cleanup();
    

    完整代码:

    public class VideoUtils {
    
        private static HCNetSDK hcNetSDK;
       // 用于缓存登陆信息,以防止短时间内重复登陆
        private static final Map<String,Map<String,Long>> MAP_USERID_AND_CHANNEL = new HashMap<>();
    
        //登陆
        public static ResultMoudel login(CameraManage cameraManage){
            //加载所需文件
            ResultMoudel resultMoudel = initHCNetSDK();
            if (ResultMoudel.ERROR_FLAG.equals(resultMoudel.getResultFlag())){
                return resultMoudel;
            }
    
            if (!StringUtils.isEmpty(cameraManage.getDeviceIp()) && MAP_USERID_AND_CHANNEL.containsKey(cameraManage.getDeviceIp())){
                Map<String, Long> stringLongMap = MAP_USERID_AND_CHANNEL.get(cameraManage.getDeviceIp());
                stringLongMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);
                return  new ResultMoudel(ResultMoudel.SUCCESS_FLAG, stringLongMap);
            }
    
            //登陆
            HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
            NativeLong userId = hcNetSDK.NET_DVR_Login_V30(cameraManage.getDeviceIp(), (short) cameraManage.getDevicePort().shortValue(), cameraManage.getUsername(), cameraManage.getPassword(), deviceInfo);
    
            long lUserId = userId.intValue();
            if(lUserId !=-1 || 4294967295L != lUserId) {
                Map<String, Long> hashMap = new HashMap<>();
                hashMap.put("controlUserId",lUserId);
                hashMap.put("channel",Long.parseLong(cameraManage.getDeviceNumber()) + 32);
                MAP_USERID_AND_CHANNEL.put(cameraManage.getDeviceIp(), hashMap);
                return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,hashMap);
            }
            return new ResultMoudel(ResultMoudel.ERROR_FLAG,"登陆失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
        }
    
        //控制
        public static ResultMoudel commandControl(ControlDto controlDto) {
    
            NativeLong channel = new NativeLong(controlDto.getChannel());
            NativeLong controlUserId = new NativeLong(controlDto.getControlUserId());
            boolean b = hcNetSDK.NET_DVR_PTZControlWithSpeed_Other(controlUserId, channel, controlDto.getCommand(), controlDto.getRunOrStop(), controlDto.getMotionSpeed());
            if (b){
                return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"正在控制,状态码为"+hcNetSDK.NET_DVR_GetLastError());
            }
            return new ResultMoudel(ResultMoudel.ERROR_FLAG,"控制失败,状态码为"+hcNetSDK.NET_DVR_GetLastError());
        }
    
        //退出登陆
        public static ResultMoudel logout(Long manageUserId) {
            //退出登陆
            boolean b = hcNetSDK.NET_DVR_Logout(new NativeLong(manageUserId));
    
            return null;
        }
    
        //释放资源
        public static ResultMoudel release() {
    
            boolean b1 = hcNetSDK.NET_DVR_Cleanup();
            hcNetSDK = null;
            return null;
        }
    
        //初始化
        private static ResultMoudel initHCNetSDK() {
    
            if (hcNetSDK == null){
                System.out.println(HCNetSDK.MAX_NAMELEN);
                hcNetSDK = HCNetSDK.INSTANCE;
                //设置HCNetSDKCom组件库所在路径
                String strPathCom = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib";
                HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
                System.out.println(strPathCom.getBytes());
                System.out.println(struComPath.sPath);
                System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
                struComPath.write();
                hcNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
    
                //设置libcrypto.so所在路径
                HCNetSDK.BYTE_ARRAY ptrByteArrayCrypto = new HCNetSDK.BYTE_ARRAY(256);
                String strPathCrypto = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib" + File.separator+"libcrypto.so";
                System.arraycopy(strPathCrypto.getBytes(), 0, ptrByteArrayCrypto.byValue, 0, strPathCrypto.length());
                ptrByteArrayCrypto.write();
                hcNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArrayCrypto.getPointer());
    
                //设置libssl.so所在路径
                HCNetSDK.BYTE_ARRAY ptrByteArraySsl = new HCNetSDK.BYTE_ARRAY(256);
                String strPathSsl = File.separator +"opt"+ File.separator +"project"+ File.separator +"yc-other" + File.separator + "HCNetLib" + File.separator+"libssl.so";
                System.arraycopy(strPathSsl.getBytes(), 0, ptrByteArraySsl.byValue, 0, strPathSsl.length());
                ptrByteArraySsl.write();
                hcNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArraySsl.getPointer());
    
    
                //开启日志
                hcNetSDK.NET_DVR_SetLogToFile(true,"/logs-video/",true);
    
                //初始化
                boolean initFlag = hcNetSDK.NET_DVR_Init();
    
                if(!initFlag) {
                    return new ResultMoudel(ResultMoudel.ERROR_FLAG,"初始化失败NET_DVR_Init,状态码为"+hcNetSDK.NET_DVR_GetLastError());
                }
    
            }
            return new ResultMoudel(ResultMoudel.SUCCESS_FLAG,"初始化成功,状态码为:"+hcNetSDK.NET_DVR_GetLastError());
        }
    
        //获取历史视频起始时间
        public static List<String> getHistoryVideoMonthlyCalendar(Long controlUserId, Integer channel) {
            NativeLong userIdn = new NativeLong(controlUserId);
            HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY ipInquiry = new  HCNetSDK.NET_DVR_RECORD_TIME_SPAN_INQUIRY();
            ipInquiry.dwSize = 68;
            ipInquiry.byType = 0;
            HCNetSDK.NET_DVR_RECORD_TIME_SPAN ipResult = new HCNetSDK.NET_DVR_RECORD_TIME_SPAN();
            boolean b = hcNetSDK.NET_DVR_InquiryRecordTimeSpan(userIdn, channel, ipInquiry, ipResult);
            //获取开始时间
            HCNetSDK.NET_DVR_TIME strBeginTime = ipResult.strBeginTime;
            //获取结束时间
            HCNetSDK.NET_DVR_TIME strEndTime = ipResult.strEndTime;
            //获取起始时间和结束时间
            List<String> strings = bingMonthlyCalendar(strBeginTime, strEndTime);
    
            return dateList;
        }
    
        private static List<String> bingMonthlyCalendar(HCNetSDK.NET_DVR_TIME strBeginTime, HCNetSDK.NET_DVR_TIME strEndTime) {
            int yearStart = strBeginTime.dwYear;
            int monthStart = strBeginTime.dwMonth;
            int dayStart = strBeginTime.dwDay;
            int yearEnd = strEndTime.dwYear;
            int monthEnd = strEndTime.dwMonth;
            int dayEnd = strEndTime.dwDay;
            String start = yearStart+"-"+monthStart+"-"+dayStart;
            String end = yearEnd+"-"+monthEnd+"-"+dayEnd;
            List<String> list1 = new ArrayList<>();
            list1.add(start);
            list1.add(end);
            return list1;
        }
    }
    

    视频下载、回放、视频直播、抓图等功能

    视频下载、回放、视频直播、抓图等功能可以参考上述方法并按照开发文档的描述进行开发

    如果开发遇到什么问题请留言评论呀。

    ▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧!

    展开全文
  • 海康摄像头spring boot

    2020-05-06 11:07:01
    海康摄像头支持spring boot ,采用插件和rtsp方式,web形式显示, 海康摄像头支持spring boot ,采用插件和rtsp方式,web形式显示
  • 海康摄像头插件

    2019-01-03 08:39:57
    海康摄像头网页插件,用于摄像头网页在线预览,支持网页各种
  • 海康摄像头直播方案

    2018-05-02 20:46:20
    海康摄像头直播方案,为实现web观看海康摄像头视频,采用EasyDarwin转播服务器。
  • 海康摄像头调用

    2016-06-13 11:43:24
    海康摄像头调用
  • 海康摄像头demo

    2018-11-24 09:45:51
    海康摄像头示例代码,浏览器中调用,包括文档和实例,亲测可用
  • 海康摄像头开发示例

    2019-05-15 21:35:02
    海康摄像头开发入门简单例子,实现基本的摄像头实时显示、录像、抓图、绘图等功能
  • 海康摄像头+web的demo

    2018-04-02 19:22:49
    海康 摄像头 web3.0 海康 摄像头 web3.0 海康 摄像头 web3.0 可实现的,功能强大的海康开发包。亲测。(具体使用详本人博客http://blog.csdn.net/xu_san_duo)
  • 海康摄像头解码显示

    2018-06-15 11:39:25
    海康摄像头解码显示,单摄像头,想做个各摄像头同时解码,但是卡住了
  • 海康摄像头android客户端
  • 海康摄像头的web控件开发包,适用于海康摄像头产品,实现从浏览器预览摄像头,支持ie浏览器
  • 海康摄像头SDK

    2015-08-17 15:40:21
    海康摄像头操作,C# 代码 32,64 位能正常运行
  • C#调用海康摄像头

    2018-08-17 16:13:14
    C#调用海康摄像头,通过PlatFormSDK,将海康平台端口、IP、用户名密码输入之后可直接访问显示
  • 海康摄像头开发包

    2019-04-18 11:17:12
    我最近在做海康摄像头的问题,这是我总结了无数错误,走了不少弯路,才找到的最简洁的开发包
  • web调取海康摄像头

    2018-06-01 15:26:43
    Web前端调取海康摄像头Demo,亲测可用,已应用于实际项目中,解决一个页面同时调取多路摄像头问题。
  • 一个海康摄像头驱动开发的上位机Demo,功能简洁,面向上位机海康摄像机开发
  • java源码 海康摄像头demo .
  • 海康摄像头语音转发

    2021-05-31 09:52:31
    海康摄像头语音转发 海康摄像头语音转发简单介绍摄像头后台配置排查错误文件生成问题后续 ) 海康摄像头语音转发简单介绍 海康语音转发,主要使用是为了通过移动端或者web端生成文件,发送到后台经过处理,再发送到...


    )

    海康摄像头语音转发简单介绍

    海康语音转发,主要使用是为了通过移动端或者web端生成文件,发送到后台经过处理,再发送到摄像头端,将声音播放出来。海康语音转发,主要用了g711或者g722解码,转码。前端用到的文件主要是pcm,当然用其他格式的也可以。我开发时,主要用uniapp生成了mp3格式文件,但是通过文件工具类转的pcm。利用pcm文件流转的g711a。现在我就简单介绍一下我开发的过程吧。里面有些小坑,在这里先感谢一下海康客服及技术人员,他们都是很给力的。

    摄像头后台配置

    一步也是直接通过uniapp生成了pcm格式,去后端处理的。先给大家看一眼摄像头配置。
    在这里插入图片描述
    这样的配置是没问题的,找了很多资料,但是这方面资料还是很少的。写出来的代码,经过测试,语音总是播放出来的事很大的杂音,而且时长也对不上,起初也为是配置的原因。但是经过测试,只有选择g711的选项是有声音的,所以断定是格式,或者文件格式中的问题(pcm文件中的码率,采样率,位深度问题)。后来就咨询客服要了一份pcm格式音频和例子代码。

    文件我会发到文章中,供大家测试。将文件拿过来之后放到代码中,确实是可以播放的,但是uniapp生成的pcm文件就是播放不出来。于是乎开始研究音频文件,经过两个软件(GoldWave,格式工厂)的帮助发现官方提供的音频格式为,8000Hz,16bit位深度,自己uniapp生成则是13bit或者14bit位深度.

    排查错误

    于是乎开始研究音频文件,经过两个软件(GoldWave,格式工厂)的帮助发现官方提供的音频格式为,8000Hz,16bit位深度,自己uniapp生成则是13bit或者14bit位深度。经过测试果然是这个原因。通过两款软件将自己生成的pcm位深度转了一下。结果成功播放。代码送给大家。
    在这里插入图片描述
    这是播放的代码。每次发160,20ms发送一次。至于g711转码,官方已经给提供了。随后会把官方代码发到文章中。

    文件生成问题

    还有一个问题,就是生成的文件,在代码中怎么解决呢,随后,我通过uniapp生成了一个mp3文件,再讲mp3转成pcm文件。这样成功解决问题。
    在这里插入图片描述
    在uniapp中主要就是红色框中的配置。目前是wav,当然主要能转成合适的pcm就可以,为了方便,我们项目中是mp3格式。大家自己也可以试试wav转pcm。

    后续

    后来经过处理一系列需求,发现不能用g711解码,最后我们选择了aac。

    用aac格式文件,大家就可以用uniapp直接生成了,当然摄像头配置需要改一下。改成aac转码。经过测试,摄像头选择了48000Hz,和32000码率,uniapp配置是 采样率48000,码率256000,单通道,格式为aac。这里不细说,主要就是测试,说多了都是泪,测了足足三天才得出的结果,中间还学了一下码率采样率的转化。因为官方也没有实际做过这种格式的传输。只能自己通过摄像头的特质测试了。后端代码基本一样。将每次发送改成438,35ms传送就可以了。这是我们的摄像头的数据。你们开发可能得自己测配置。

    aac测试文件也会给大家,大家自己做测试吧。
    今天就写到这里了,新手写的不好,大家有不理解的地方可以问我。我会细点给你解决的。希望大家尽量避免采坑,采坑真的难受。

    附件:
    https://pan.baidu.com/s/12zTpal6q9dSeQW0FXF3edQ 提取码:386l

    展开全文
  • 最新版海康摄像头安卓版SDK
  • 使用qt工程播放海康摄像头例子。C++
  • 海康摄像头
  • 如何激活海康摄像头

    千次阅读 2019-04-05 14:55:39
    新买的海康摄像头需要激活.如何激活?  海康摄像头默认IP,192.168.1.64.是不是必须在同网段?不必. 去海康网站,下载软件.安装之后,有一个设备网络搜索.运行,可以看到本网内的摄像头. 点击要激活的...

      新买的海康摄像头需要激活.如何激活?

      海康摄像头默认IP,192.168.1.64.是不是必须在同网段?不必.

    1. 去海康网站,下载软件.安装之后,有一个设备网络搜索.运行,可以看到本网内的摄像头.
    2. 点击要激活的摄像头,左边的框内一定要选上(出现对号).
    3. 在右侧输入管理员口令,点击激活.注意,口令一定要通用,一旦忘记自己是无法复位的!
    4. 激活后,根据自己需要,设置IP或者DHCP.
    展开全文
  • 海康摄像头录制功能实现

    千次阅读 热门讨论 2019-07-01 18:20:58
    今天我来总结一下海康摄像头的录制功能的实现。 1.首先海康摄像头是有自己的官方文档的 https://www.hikvision.com/cn/download_61.html 在这个连接中我们可以找到海康摄像头的SDK,我下载的SDK如下图所示 ...
  • ##unity接入海康摄像头(shader转码)##

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,447
精华内容 578
关键字:

海康摄像头