海康威视摄像机SDK二次开发--实时预览视频流保存到指定文件中

6 篇文章 0 订阅

开发海康威视sdk ,IPC设备,视频回调用的是官方提供的Demo中的(fRealDataCallBack )
在最下面代码可以设置Thread.sleep()设置拍摄时长

  • 文件结构
    在这里插入图片描述
  • CameraInfo的内容
package ClientDemo;
import com.sun.jna.NativeLong;
public class CameraInfo {
    private String address;
    private String userName;
    private String pwd;
    private short port;
    private NativeLong userId;
    private NativeLong channel;
    private NativeLong key;

    // 下面为该类的GET SET方法
    public NativeLong getKey() {
        return key;
    }

    public void setKey(NativeLong key) {
        this.key = key;
    }
    public void setAddress(String address){
        this.address = address;
    }
    public void setUserName(String userName){
        this.userName = userName;
    }
    public void setPwd(String pwd){
        this.pwd = pwd;
    }
    public void setPort(short port){
        this.port = port;
    }
    public NativeLong getUserId(){
        return userId;
    }
    public NativeLong getChannel(){
        return channel;
    }
    public String getAddress(){
        return address;
    }
    public short getPort(){
        return port;
    }

    public String getUserName() {
        return userName;
    }

    public String getPwd() {
        return pwd;
    }

    public void setChannel(NativeLong channel) {
        this.channel = channel;
    }

    public void setUserId(NativeLong userId) {
        this.userId = userId;
    }

}
  • HIKSDKSaveRealData中的内容
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);
    }
}

提取出来的视频可以用plotplayer播放,很方便。

  • config.txt中的内容
// 配置文件为TXT格式 ,这里只是做说明
//运行时不允许出现这些注释,删掉即可

// 只允许出现第一行 IP地址 端口号 用户名 密码
192.168.1.64 8000  admin gw*123456

// 第二行-第N行 为配置参数 水平角度 垂直角度 放大倍数 拍摄时长 单位/S
// 水平角度如水平旋转45度,那么只需要计算十六进制450的十进制参数即可  计算出1104即为旋转45度 
100   2000   50     6
1500  1200   120    6
400   500    190    6
100   2000   50     6
### 回答1: 海康相机SDK海康威视公司推出的一款相机软件开发工具包,它可以帮助开发者实现对海康相机的控制与数据处理。而使用Qt编写的二次开发程序可以在跨平台、界面友好、开发效率高等方面表现出色。因此,将海康相机SDK二次开发Qt的方法可以有效提高开发效率和使用体验。 在二次开发Qt程序之前,首先需要安装海康相机SDK和Qt开发环境。然后,通过SDK给出的样例程序,了解相机控制和数据处理的基本操作。接下来,结合Qt的开发框架,建立相应界面和事件响应,并利用海康相机SDK提供的函数,实现相机的开启、关闭、捕获图片等操作。同时,也要考虑到Qt与SDK之间的数据转换和参数传递的问题。 在开发过程,需要注意一些细节问题,如相机连接状态的检测、相机参数的设置、图像处理算法的优化等。同时,也可以结合其他相关的开源库,如OpenCV等,进一步丰富程序的功能。 总之,海康相机SDK二次开发Qt是一个非常有前景和实际意义的开发方向。通过此类程序的开发,可以提高海康相机的应用范围和应用效果,满足不同用户的实际需求。 ### 回答2: 海康相机SDK是一款网络摄像机开发工具包,可以提供高质量的视频流和图像采集,集成该SDK到QT开发环境可以实现基于网络摄像机的图像处理和视频监测应用的开发。 在使用海康相机SDK进行QT二次开发的过程,需要首先了解SDK操作和QT编程的基本知识。在使用SDK时,需要通过SDK提供的API进行网络摄像机的控制、图像采集和视频流显示等操作。在此基础上,可以使用QT编程实现各种功能和应用,例如图像增强、文本识别、动态拍照和视频监测等。 在进行二次开发时,还需要注意SDK的版本选择和兼容性问题。另外,需要考虑软硬件平台的匹配问题,例如CPU架构、操作系统和网络接口等。在具体实现,可以使用QT提供的多种工具和组件,例如QT designer、QT creator和QT widgets等,以提高开发效率和代码质量。 总之,通过海康相机SDK二次开发和QT编程的结合,可以实现基于网络摄像机的各种应用和功能,为用户提供更加便捷、高效的视频监测和图像处理体验。 ### 回答3: 海康相机sdk是一个旨在为开发者提供海康威视相机设备的二次开发接口的软件开发工具包。对于开发者来说,使用海康相机sdk进行二次开发是非常重要的,这是因为该工具包提供了丰富的API,可以使开发者更加高效地定制相机设备的软件功能。 在海康相机sdk二次开发,Qt是一种流行的跨平台开发框架,可以集成到C++,使用Qt编写对于初学者来说也比较容易上手。我们可以使用Qt Creator IDE来编写程序,该IDE支持快速的窗口设计和多线程开发。同时,Qt还提供了很好的图形用户界面(GUI)支持,这对于开发相机设备用户友好的UI界面非常重要。 在使用海康相机sdk进行二次开发时,我们需要遵守相应的开发流程,首先需要进行硬件设备连接和查询,然后创建相应的海康相机对象,并且设置相机参数、注册回调函数等。之后,我们可以使用Qt编写界面并添加关于设备的一些功能,例如录像、拍照和保存数据等。 总之,使用海康相机sdk进行二次开发是一个涉及不同技术的综合性开发过程,例如设备硬件、图像处理、网络和GUI开发,同时也需要注意程序的健壮性和安全性等方面的考虑。虽然这个过程可能会面临一些挑战,但是在付出努力后,我们可以获得一个高效且功能强大的相机设备软件,满足我们的需求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值