大华摄像头java开发之抓图

大华摄像头java开发之抓图

      继上一个海康的项目之后,这个月开始了大华网络摄像头的二次开发,在写正式的内容之前先容我吐槽一下:
1. 首先就是从官网下载的Demo,里面只有C写的,让我一个java开发怎么看的懂,这个方面就比海康要差一点了;
2. 遇到问题,咨询他们的技术的时候,每次回复都是寥寥数字,还得让我猜半天,但最后问题好歹都解决了(也有一小部分,他们也没法解决);
3. 每次我问问题的时候,都会给我回复一个附件,就是所问问题的Demo,既然有java的Demo,为什么不直接放官网呢,还要每次问一个给一个,相当无语。

      好了言归正传,回到正题。我们拿到摄像头安装好之后,根据官网的工具,自己配置一下IP地址,然后下载官网的Demo(虽然是C的,但是开发文档和编程指导还是有用的),如果想要截图部分的代码的话,可以自己去下载http://download.csdn.net/download/u012492535/10128871,里面还有预览功能、智能交通功能、下载录像功能。


      既然是网络摄像头开发,那么流程就都是差不多的,都是按照流程来执行的:
流程图
1、第一步先初始化设备,大华的设备功能需要用到回调类,所以初始化也是有的:
     代码

        // 初始化SDK
        boolean binit = NetSdk.CLIENT_Init(m_DisConnectCB, new NativeLong(0));
        if (binit) {
            System.out.println("初始化成功");
        }

      其中m_DisConnectCB是回调函数

public class FDisConnectCB implements NetSDKLib.fDisConnect {
    public void invoke(NativeLong lLoginID, String pchDVRIP, int nDVRPort,
            NativeLong dwUser) {
        System.out.printf("断线回调:\n", pchDVRIP, nDVRPort, lLoginID.longValue(),
                dwUser.longValue());
    }
}

2、其中的可选操作项,如果有需要的话,各位自己添加吧,这里就直接写登录了

m_hLoginHandle = NetSdk
                .CLIENT_LoginEx(ipAddress, (short) port, userName, password,
                        nSpecCap, pCapParam, m_stDeviceInfo, nError);
                        if (m_hLoginHandle.longValue() != 0) {
            System.out.printf("Login Success!\n");
            } else {
            System.out.printf("Login Fail.Last Error\n",
                    NetSdk.CLIENT_GetLastError());
        }

3、设置抓图回调函数

//设置回调函数
        NetSdk.CLIENT_SetSnapRevCallBack(snapPicRet, new NativeLong(0));

      回调函数的入口

//抓图回调函数
public class SnapPicRet implements NetSDKLib.fSnapRev{
    Pointer pBuffer; 
    int revLen;

    public void invoke( NativeLong lLoginID, Pointer pBuf, int RevLen, int EncodeType, NativeLong CmdSerial, NativeLong dwUser) {   
    }
}

4、设置好回调函数之后,就来执行请求抓图,SNAP_PARAMS的参数在上传的Demo中有

NetSdk.CLIENT_SnapPictureEx(m_hLoginHandle, SNAP_PARAMS,
                    reserved

5、接下来就是重点了,回调函数中写的是如何将获取到的 图片保存到本地的位置和名称

if(pBuf != null && RevLen > 0) {
                        File path = new File("./Capture/");
                        if (!path.exists()) {
                            path.mkdir();
                        }

                        String strFileName = "./Capture/" + INetSDK.getDate() + ".jpg"; 

                        //保存图片到本地文件
                        INetSDK.savePicture(pBuf, RevLen, strFileName); 
                        System.out.println("strFileName = " + strFileName);
    try
        {
            DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(sDstFile)));
            out.write(pBuf.getByteArray(0, dwBufSize), 0, dwBufSize);
            out.close();
        } catch (Exception e){
            e.printStackTrace();
        }

6、运行程序的结果
结果

      以上就是我在做大华网络摄像头的截图功能的一些经验,完整代码就不附了,有不明白的可以留言,看到会回复的。(PS:也可以加我的QQ,只不过不一定能及时看到1307329425,我也是初学者,功能没做完,可以互相交流一下经验)

posted @ 2017-11-22 17:38  大漠飞鱼  阅读(3044)  评论(0编辑  收藏  举报