海康威视摄像机SDK二次开发--指定云台位置,焦距放大倍数,拍摄时长,并拆分保存为视频文件

6 篇文章 0 订阅

按照config.txt配置,出现的效果是有几组参数就录制几个视频,视频时长按照配置文件录制
在这里插入图片描述
config.txt的内容,请参照海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中
java实现代码

package ClientDemo;

import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;

import javax.swing.*;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.SimpleTimeZone;

public class HIKSDKSaveRealData {
    private static Map configParam;


    public static void main(String[] args) throws Exception {
        HIKSDKSaveRealData HikSdk = new HIKSDKSaveRealData();
        /* 此处创建对象也可以创建file对象 */
        // 创建流对象
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("D:\\installationPackage-all\\browerDown\\CH-HK-Wind64\\ClientDemo\\src\\ClientDemo\\config.txt"));
            configParam = new HashMap();
            CameraInfo cameraInfo = new CameraInfo();
            String line = null;
            int count = 0;
            while ((line = br.readLine()) != null) {
                if (line != "" && line.length() > 0 && count > 0) {
                    String[] split = line.split("\\s+");
                    configParam.put(count + "param", split);
                    count++;

                } else if (line != "" && line.length() > 0 && count == 0) {
                    String[] split = line.split("\\s+");
                    // 设置IP等参数到对象中
                    cameraInfo.setAddress(split[0]);
                    cameraInfo.setPort(Short.parseShort(split[1]));
                    cameraInfo.setUserName(split[2]);
                    cameraInfo.setPwd(split[3]);
                    count++;
                }
            }
            br.close();

            //查看当前DVR参数信息和初始化注册等 传入连接信息
//            HikSdk.getDVRConfig(cameraInfo);
            HikSdk.SaveRealDataformDir(cameraInfo, "D:\\bxcf\\armCloudCamera\\realData");
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

   


    /*****************************************************************
     * 通过云台参数控制摄像机位置
     * param:    CameraInfo 摄像机连接的基本信息
     * return:   null
     * ****************************************************************/
    HCNetSDK sdk = HCNetSDK.INSTANCE;

    void SaveRealDataformDir(CameraInfo cameraInfo, String localSaveFilePath) throws Exception {
        CameraInfo parameter = getParameter(cameraInfo);

        //判断是否注册成功
        if (parameter.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("获取设备能力集失败,返回设备状态失败...............");
            return;
        }

        // 录制前雨刷器先刷几圈
        boolean result = sdk.NET_DVR_PTZControl_Other(cameraInfo.getUserId(), cameraInfo.getChannel(),HCNetSDK.WIPER_PWRON, 0);
        boolean result1 = sdk.NET_DVR_PTZControl_Other(cameraInfo.getUserId(), cameraInfo.getChannel(),HCNetSDK.WIPER_PWRON, 0);
        boolean result2 = sdk.NET_DVR_PTZControl_Other(cameraInfo.getUserId(), cameraInfo.getChannel(),HCNetSDK.WIPER_PWRON, 1);
        Thread.sleep(2000);
        //启动实时预览功能  创建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;

        FRealDataCallBack fRealDataCallBack = new FRealDataCallBack();
        //开启实时预览
        NativeLong key = sdk.NET_DVR_RealPlay_V30(cameraInfo.getUserId(), clientInfo, fRealDataCallBack, null, true);
        cameraInfo.setKey(key);
        //判断是否预览成功
        if (key.intValue() == -1) {
            System.out.println("预览失败   错误代码为:  " + sdk.NET_DVR_GetLastError());
            sdk.NET_DVR_Logout(cameraInfo.getUserId());
            sdk.NET_DVR_Cleanup();
            return;
        }

        // 查看文件夹是否存在,如果不存在则创建
        File file = new File(localSaveFilePath);
        if (!file.exists()) {
            file.mkdir();
        }

//        //预览成功后 调用接口使视频资源保存到文件中 这是完整过程视频,如果需要打开注释即可
//        if (!sdk.NET_DVR_SaveRealData(cameraInfo.getKey(), file.getPath() + "/" + System.currentTimeMillis() + ".mp4")) {
//            System.out.println("保存到文件失败 错误码为:  " + sdk.NET_DVR_GetLastError());
//            sdk.NET_DVR_StopRealPlay(key);
//            sdk.NET_DVR_Logout(cameraInfo.getUserId());
//            sdk.NET_DVR_Cleanup();
//            return;
//        }
        try {
            System.out.println("开始录制");
        } catch (Exception e) {
            e.printStackTrace();
        }

        /*   获取PTZ快球位置参数
         *    获取水平角度,垂直角度,变倍角度
         * */
        IntByReference intByReference = new IntByReference(0);
        //创建PTZPOS参数对象
        HCNetSDK.NET_DVR_PTZPOS net_dvr_ptzpos = new HCNetSDK.NET_DVR_PTZPOS();
        Pointer pointer = net_dvr_ptzpos.getPointer();
        //执行获取参数
        if (!sdk.NET_DVR_GetDVRConfig(cameraInfo.getKey(), HCNetSDK.NET_DVR_GET_PTZPOS, new NativeLong(0), pointer, net_dvr_ptzpos.size(), intByReference)) {
            System.out.println("获取DVR参数PTZ参数失败,错误码为:    " + sdk.NET_DVR_GetLastError());
            sdk.NET_DVR_StopRealPlay(cameraInfo.getKey());
            sdk.NET_DVR_Logout(cameraInfo.getUserId());
            sdk.NET_DVR_Cleanup();
            return;
        }

        // 设置参数让摄像机转动 在这里会按照拍摄时长保存视频到文件 几组参数就是几个视频
        for (int i = 0; i < configParam.size(); i++) {
            String[] param = (String[]) configParam.get(i+1 + "param");
             // 相机对象(用户名密码端口号IP地址等信息)  param[5]-[8] 水平角度 垂直角度 放大倍数 拍摄时长
            PTZ(cameraInfo, net_dvr_ptzpos, param[0], param[1], param[2], param[3],localSaveFilePath);
        }

        sdk.NET_DVR_StopRealPlay(key);
        sdk.NET_DVR_Logout(cameraInfo.getUserId());
        sdk.NET_DVR_Cleanup();
        System.out.println("工作完成 程序结束...");
        System.exit(0);

    }


    class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30 {
        //预览回调
        public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser) {

        }
    }


    private void PTZ(CameraInfo cameraInfo, HCNetSDK.NET_DVR_PTZPOS net_dvr_ptzpos,
                     String wPanpos, String wTiltPos, String wZoomPos, String time,String localSaveFilePath) throws Exception {
        //把数据写入net_dvr_ptzpos对象中  下面才可以获取到参数
        net_dvr_ptzpos.read();
        Pointer pointer = net_dvr_ptzpos.getPointer();
        /*
         * 设置PTZPOS快球参数
         * 设置垂直角度,水平角度,变倍角度
         * 从配置文件中获取参数 设置到PTZ中
         * */
        try {
            net_dvr_ptzpos.wPanPos = Short.parseShort(wPanpos);                //设置水平角度
            net_dvr_ptzpos.wTiltPos = Short.parseShort(wTiltPos);                   //设置垂直角度
            net_dvr_ptzpos.wZoomPos = Short.parseShort(wZoomPos);                  //设置变倍参数
            net_dvr_ptzpos.write();                     //把数据写入缓冲区
        } catch (Exception e) {
            System.out.println("获取配置文件PTZ参数失败,请检查参数名称是否正确.....");
            sdk.NET_DVR_StopRealPlay(cameraInfo.getKey());
            sdk.NET_DVR_Logout(cameraInfo.getUserId());
            sdk.NET_DVR_Cleanup();
            return;
        }
        /*
         * 设置PTZ参数 水平参数 垂直参数 变倍参数
         * */
        if (!sdk.NET_DVR_SetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_SET_PTZPOS, new NativeLong(0), pointer, net_dvr_ptzpos.size())) {
            System.out.println("设置PTZ参数失败,错误码为:    " + sdk.NET_DVR_GetLastError());

            sdk.NET_DVR_Logout(cameraInfo.getUserId());
            sdk.NET_DVR_Cleanup();
            return;
        }

        Thread.sleep(2000);
        //启动实时预览功能  创建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;

        FRealDataCallBack fRealDataCallBack = new FRealDataCallBack();
        //开启实时预览
        NativeLong key = sdk.NET_DVR_RealPlay_V30(cameraInfo.getUserId(), clientInfo, fRealDataCallBack, null, true);
        cameraInfo.setKey(key);
        //判断是否预览成功
        if (key.intValue() == -1) {
            System.out.println("预览失败   错误代码为:  " + sdk.NET_DVR_GetLastError());
            sdk.NET_DVR_Logout(cameraInfo.getUserId());
            sdk.NET_DVR_Cleanup();
            return;
        }


        File file = new File(localSaveFilePath);
        if (!file.exists()) {
            file.mkdir();
        }

        //预览成功后 调用接口使视频资源保存到文件中
        if (!sdk.NET_DVR_SaveRealData(cameraInfo.getKey(), file.getPath() + "/" + System.currentTimeMillis() + ".mp4")) {
            System.out.println("保存到文件失败 错误码为:  " + sdk.NET_DVR_GetLastError());
            sdk.NET_DVR_StopRealPlay(key);
            sdk.NET_DVR_Logout(cameraInfo.getUserId());
            sdk.NET_DVR_Cleanup();
            return;
        }

        Thread.sleep(Short.parseShort(time+"000"));
        System.out.println("PTZ已到达指定位置并录制结束");
        sdk.NET_DVR_StopSaveRealData(cameraInfo.getKey());
    }

    /*****************************************************************
     * 注册设备并返回参数
     * 目的:   注册设备并返回key    :Nativelong
     * parameters:    cameraInfo
     *return:        cameraInfo
     * ****************************************************************/
    private CameraInfo getParameter(CameraInfo cameraInfo) {
        //设置设备通道号   查看Demo代码  通道号为1
        NativeLong channel = new NativeLong(1);
        cameraInfo.setChannel(channel);
        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);
        return cameraInfo;
    }

}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值