大华摄像头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,我也是初学者,功能没做完,可以互相交流一下经验)