由于最近在开发海康威视摄像头,特此记录一下通过云台参数控制摄像机的位置,我这里是通过properties配置文件输入的参数,也可以不用配置文件,看具体的需求
package ClientDemo;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
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");
HikSdk.SaveRealDataformDir(cameraInfo);
}
/*
* 通过云台参数控制摄像机位置
* param: CameraInfo 摄像机连接的基本信息
* return: null
* */
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("获取设备能力集失败,返回设备状态失败...............");
return;
}
//启动实时预览功能 创建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);
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;
}
//预览成功后 调用接口使视频资源保存到文件中
if(!sdk.NET_DVR_SaveRealData(cameraInfo.getKey(), "D:\\realData\\result.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 {
Thread.sleep(1000);
} 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(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
return;
}
//把数据写入net_dvr_ptzpos对象中 下面才可以获取到参数
net_dvr_ptzpos.read();
System.out.println("PTZ垂直参数为: "+net_dvr_ptzpos.wTiltPos);
System.out.println("PTZ水平参数为: "+net_dvr_ptzpos.wPanPos);
System.out.println("PTZ变倍参数为: "+net_dvr_ptzpos.wZoomPos);
/*
* 设置PTZPOS快球参数
* 设置垂直角度,水平角度,变倍角度
* 从配置文件中获取参数 设置到PTZ中
* */
try {
Map<String, Short> ptzParameters = getPtzParameters();
net_dvr_ptzpos.wPanPos=ptzParameters.get("wPanPos"); //设置水平角度
net_dvr_ptzpos.wTiltPos=ptzParameters.get("wTiltPos"); //设置垂直角度
net_dvr_ptzpos.wZoomPos=ptzParameters.get("wZoomPos"); //设置变倍参数
net_dvr_ptzpos.write(); //把数据写入缓冲区
} catch (Exception e) {
System.out.println("获取配置文件PTZ参数失败,请检查参数名称是否正确.....");
sdk.NET_DVR_StopRealPlay(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
return;
}
/*
* 设置PTZ参数 水平参数 垂直参数 变倍参数
* */
if (!sdk.NET_DVR_SetDVRConfig(cameraInfo.getKey(), HCNetSDK.NET_DVR_SET_PTZPOS, new NativeLong(0), pointer,net_dvr_ptzpos.size())){
System.out.println("设置PTZ参数失败,错误码为: "+sdk.NET_DVR_GetLastError());
sdk.NET_DVR_StopRealPlay(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
return;
}
System.out.println("执行成功--------------");
/*
* 设备更换位置后再次获取PTZ参数
* */
System.out.println("PTZ垂直参数为: "+net_dvr_ptzpos.wTiltPos);
System.out.println("PTZ水平参数为: "+net_dvr_ptzpos.wPanPos);
System.out.println("PTZ变倍参数为: "+net_dvr_ptzpos.wZoomPos);
}
/*
* 获取配置文件中的PTZ参数
* config.preperties
* */
Map<String,Short> getPtzParameters(){
Map<String,Short> map = new HashMap();
Properties properties = new Properties();
try {
properties.load(new FileInputStream(new File("properties文件的绝对路径")));
} catch (IOException e) {
System.out.println("读取配置文件失败,请检查配置文件路径是否正确");
}
Short wPanpos = Short.parseShort(properties.getProperty("wPanpos"));
Short wTiltPos = Short.parseShort(properties.getProperty("wTiltPos"));
Short wZoomPos = Short.parseShort(properties.getProperty("wZoomPos"));
map.put("wPanPos", wPanpos);
map.put("wTiltPos", wTiltPos);
map.put("wZoomPos", wZoomPos);
return map;
}
}