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

海康威视摄像头实时预览视频流保存到文件中
目前在开发海康威视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方法

借鉴文章链接:https://blog.csdn.net/Yuruiyu/article/details/79565261
另外提取出的视频可以用VLC观看

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要实现java海康威视摄像头实时预览视频流保存到指定文件,需要先安装海康威视的SDK,并使用Java SDK开发工具包的类库来开发应用程序。 首先,在应用程序引入海康威视的SDK库,包括HCNetSDK.dll、PlayCtrl.dll、HCAlarm.dll等。然后,使用HCNetSDK类库提供的方法来实现视频流实时预览功能,并将预览视频流通过PlayCtrl.dll提供的方法进行渲染和显示。 同时,在将视频流保存到指定文件时,可以使用Java的IO流进行文件操作。首先在程序创建File对象指定文件路径,然后使用FileOutputStream类创建输出流对象,通过读取预览视频流数据的byte数组并将其写入到输出流实现将视频流保存文件的功能。 需要注意的是,保存文件时,时间戳的处理,文件格式等问题都需要按照实际需求进行处理。 总之,要实现java海康威视摄像头实时预览视频流保存到指定文件,需要结合使用海康威视的SDK和Java SDK开发工具包,具体实现过程需要根据实际情况灵活处理。 ### 回答2: Java是一种广泛应用于各种领域的高级编程语言,海康威视摄像头是一种高清晰度的视频监控设备。如何实现将海康威视摄像头实时预览视频流保存到指定文件呢?下面以Java编程语言为主体进行分析探讨。 首先,需要了解Java的多媒体相关类库和海康威视摄像头的API接口。Java多媒体相关类库包括javax.sound.sampled和javax.media包。javax.sound.sampled是Java音频API,可以处理音频文件的读、写、播放和录制等操作;javax.media则是Java多媒体API,可以处理音频、视频和图像等媒体数据。海康威视摄像头的API接口包括SDK、HCNetSDK和PlayCtrl等。 其次,需要进行海康威视摄像头实时预览视频流以及保存到指定文件的操作。具体步骤如下: 1. 初始化海康威视摄像头SDK,包括设备登录、设备初始化和预览四个步骤。设备登录是使用设备账号密码进行登录,设备初始化是对设备进行初始化设置预览则是打开视频流并进行播放。 2. 在预览添加截图功能,通过调用SDK的抓图函数将视频帧数据保存到内存的一个缓冲区。抓取一帧数据需要使用NET_DVR_CaptureJPEGPicture_V30函数,并将数据放置到指定的缓存区。 3. 将缓冲区的数据保存到本地文件。在Java可以使用BufferedImage类来保存JPEG图像数据,使用ImageIO类将缓冲区的图像数据保存到指定的文件。 4. 关闭设备预览,退出SDK。 需要注意的是,保存视频流文件需要根据需求进行设置参数,包括视频流的编码格式、分辨率、帧率等。在进行保存时还应该进行异常处理,例如文件不存在、写入失败等异常情况的处理。 总之,Java实现海康威视摄像头实时预览视频流保存到指定文件需要进行多项操作,包括海康威视SDK的初始化和调用、截图和保存等。具体操作可以根据实际需要进行调整和修改,最终实现预览视频流保存文件的功能。 ### 回答3: java是一种广泛使用的编程语言,可用于开发各种应用程序,包括与摄像头相关的应用程序。海康威视(Hikvision)是一家专业从事视频监控设备制造的企业,提供多种摄像头系列产品。本文将介绍如何使用java编写程序,实现海康威视摄像头实时预览视频流,并将视频流保存到指定文件。 首先,要实现海康威视摄像头实时预览视频流,需要使用其提供的软件开发包(SDK),该SDK提供了一组API,用于控制海康威视摄像头的各种功能。在使用SDK前,需要先在操作系统安装相关依赖库,并且在开发环境配置好SDK相关参数。 接下来,我们需要按照以下步骤编写java程序: 1.引入SDK相关jar包,并创建SDK实例。 import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.PointerByReference; import com.hikvision.netsdk.*; public class HikvisionTest { private HCNetSDK hCNetSDK; public static void main(String[] args) { HikvisionTest test = new HikvisionTest(); test.init(); test.preview(); } public void init() { hCNetSDK = HCNetSDK.INSTANCE; boolean initSuc = hCNetSDK.NET_DVR_Init(); if(!initSuc) { System.out.println("SDK初始化失败"); } } public void preview() { int userId = -1; HCNetSDK.NET_DVR_DEVICEINFO_V30 devInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); NativeLong lRealHandle = new NativeLong(-1); NativeLong lLoginHandle = hCNetSDK.NET_DVR_Login_V30("10.10.10.1", 8000, "admin", "password", devInfo); if(lLoginHandle.longValue() < 0) { System.out.println("登录失败"); return; } HCNetSDK.NET_DVR_PREVIEWINFO previewInfo = new HCNetSDK.NET_DVR_PREVIEWINFO(); previewInfo.lChannel = 1; previewInfo.dwStreamType = 0; previewInfo.dwLinkMode = 0x80000000; Pointer hPlayWnd = null;//播放窗口句柄,为null表示不播放画面,只预览数据 lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(lLoginHandle, previewInfo, null); if(lRealHandle.longValue() < 0) { System.out.println("预览失败"); return; } //TODO: 在这里添加保存视频流文件的代码 } } 2.登录网络摄像头,并开启实时预览。 在上述代码,我们调用了NET_DVR_Login_V30方法登录摄像头设备,该方法返回登录句柄,如果登录失败则返回-1。登录成功后,我们可以通过NET_DVR_RealPlay_V40方法开启实时预览功能,该方法调用后返回实时预览句柄,如果开启预览失败则返回-1。在实时预览时,我们可以指定播放窗口句柄,如果传入null则表示只预览不播放。 3.将视频流保存到指定文件。 要将视频流保存到指定文件,我们可以在预览时添加代码,调用NET_DVR_SaveRealData保存视频流数据。 hCNetSDK.NET_DVR_SaveRealData(lRealHandle, "D:\\video\\test.mp4"); 以上代码将把视频流数据保存到指定文件路径(D:\\video\\test.mp4)。 另外,为了保证视频流数据正常保存,还需要添加停止预览和注销登录相关的代码。停止预览时,可以调用NET_DVR_StopRealPlay方法停止实时预览;注销登录时,可以调用NET_DVR_Logout方法注销登录句柄。 总之,使用java编写程序实现海康威视摄像头实时预览视频流保存视频到指定文件,需要使用海康威视摄像头SDK提供的API来控制摄像头功能,同时需要注意代码的执行顺序和各种参数的设置
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值