按照config.txt配置,出现的效果是有几组参数就录制几个视频,视频时长按照配置文件录制
config.txt的内容,请参照海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中
java实现代码
package ClientDemo;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import javax.swing.*;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.SimpleTimeZone;
public class HIKSDKSaveRealData {
private static Map configParam;
public static void main(String[] args) throws Exception {
HIKSDKSaveRealData HikSdk = new HIKSDKSaveRealData();
/* 此处创建对象也可以创建file对象 */
// 创建流对象
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("D:\\installationPackage-all\\browerDown\\CH-HK-Wind64\\ClientDemo\\src\\ClientDemo\\config.txt"));
configParam = new HashMap();
CameraInfo cameraInfo = new CameraInfo();
String line = null;
int count = 0;
while ((line = br.readLine()) != null) {
if (line != "" && line.length() > 0 && count > 0) {
String[] split = line.split("\\s+");
configParam.put(count + "param", split);
count++;
} else if (line != "" && line.length() > 0 && count == 0) {
String[] split = line.split("\\s+");
// 设置IP等参数到对象中
cameraInfo.setAddress(split[0]);
cameraInfo.setPort(Short.parseShort(split[1]));
cameraInfo.setUserName(split[2]);
cameraInfo.setPwd(split[3]);
count++;
}
}
br.close();
//查看当前DVR参数信息和初始化注册等 传入连接信息
// HikSdk.getDVRConfig(cameraInfo);
HikSdk.SaveRealDataformDir(cameraInfo, "D:\\bxcf\\armCloudCamera\\realData");
} catch (IOException e) {
e.printStackTrace();
}
}
/*****************************************************************
* 通过云台参数控制摄像机位置
* param: CameraInfo 摄像机连接的基本信息
* return: null
* ****************************************************************/
HCNetSDK sdk = HCNetSDK.INSTANCE;
void SaveRealDataformDir(CameraInfo cameraInfo, String localSaveFilePath) throws Exception {
CameraInfo parameter = getParameter(cameraInfo);
//判断是否注册成功
if (parameter.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;
}
// 录制前雨刷器先刷几圈
boolean result = sdk.NET_DVR_PTZControl_Other(cameraInfo.getUserId(), cameraInfo.getChannel(),HCNetSDK.WIPER_PWRON, 0);
boolean result1 = sdk.NET_DVR_PTZControl_Other(cameraInfo.getUserId(), cameraInfo.getChannel(),HCNetSDK.WIPER_PWRON, 0);
boolean result2 = sdk.NET_DVR_PTZControl_Other(cameraInfo.getUserId(), cameraInfo.getChannel(),HCNetSDK.WIPER_PWRON, 1);
Thread.sleep(2000);
//启动实时预览功能 创建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;
FRealDataCallBack fRealDataCallBack = new 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;
}
// 查看文件夹是否存在,如果不存在则创建
File file = new File(localSaveFilePath);
if (!file.exists()) {
file.mkdir();
}
// //预览成功后 调用接口使视频资源保存到文件中 这是完整过程视频,如果需要打开注释即可
// if (!sdk.NET_DVR_SaveRealData(cameraInfo.getKey(), file.getPath() + "/" + System.currentTimeMillis() + ".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 {
System.out.println("开始录制");
} 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(cameraInfo.getKey());
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
return;
}
// 设置参数让摄像机转动 在这里会按照拍摄时长保存视频到文件 几组参数就是几个视频
for (int i = 0; i < configParam.size(); i++) {
String[] param = (String[]) configParam.get(i+1 + "param");
// 相机对象(用户名密码端口号IP地址等信息) param[5]-[8] 水平角度 垂直角度 放大倍数 拍摄时长
PTZ(cameraInfo, net_dvr_ptzpos, param[0], param[1], param[2], param[3],localSaveFilePath);
}
sdk.NET_DVR_StopRealPlay(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
System.out.println("工作完成 程序结束...");
System.exit(0);
}
class FRealDataCallBack implements HCNetSDK.FRealDataCallBack_V30 {
//预览回调
public void invoke(NativeLong lRealHandle, int dwDataType, ByteByReference pBuffer, int dwBufSize, Pointer pUser) {
}
}
private void PTZ(CameraInfo cameraInfo, HCNetSDK.NET_DVR_PTZPOS net_dvr_ptzpos,
String wPanpos, String wTiltPos, String wZoomPos, String time,String localSaveFilePath) throws Exception {
//把数据写入net_dvr_ptzpos对象中 下面才可以获取到参数
net_dvr_ptzpos.read();
Pointer pointer = net_dvr_ptzpos.getPointer();
/*
* 设置PTZPOS快球参数
* 设置垂直角度,水平角度,变倍角度
* 从配置文件中获取参数 设置到PTZ中
* */
try {
net_dvr_ptzpos.wPanPos = Short.parseShort(wPanpos); //设置水平角度
net_dvr_ptzpos.wTiltPos = Short.parseShort(wTiltPos); //设置垂直角度
net_dvr_ptzpos.wZoomPos = Short.parseShort(wZoomPos); //设置变倍参数
net_dvr_ptzpos.write(); //把数据写入缓冲区
} catch (Exception e) {
System.out.println("获取配置文件PTZ参数失败,请检查参数名称是否正确.....");
sdk.NET_DVR_StopRealPlay(cameraInfo.getKey());
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
return;
}
/*
* 设置PTZ参数 水平参数 垂直参数 变倍参数
* */
if (!sdk.NET_DVR_SetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_SET_PTZPOS, new NativeLong(0), pointer, net_dvr_ptzpos.size())) {
System.out.println("设置PTZ参数失败,错误码为: " + sdk.NET_DVR_GetLastError());
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
return;
}
Thread.sleep(2000);
//启动实时预览功能 创建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;
FRealDataCallBack fRealDataCallBack = new 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;
}
File file = new File(localSaveFilePath);
if (!file.exists()) {
file.mkdir();
}
//预览成功后 调用接口使视频资源保存到文件中
if (!sdk.NET_DVR_SaveRealData(cameraInfo.getKey(), file.getPath() + "/" + System.currentTimeMillis() + ".mp4")) {
System.out.println("保存到文件失败 错误码为: " + sdk.NET_DVR_GetLastError());
sdk.NET_DVR_StopRealPlay(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
return;
}
Thread.sleep(Short.parseShort(time+"000"));
System.out.println("PTZ已到达指定位置并录制结束");
sdk.NET_DVR_StopSaveRealData(cameraInfo.getKey());
}
/*****************************************************************
* 注册设备并返回参数
* 目的: 注册设备并返回key :Nativelong
* parameters: cameraInfo
*return: cameraInfo
* ****************************************************************/
private CameraInfo getParameter(CameraInfo cameraInfo) {
//设置设备通道号 查看Demo代码 通道号为1
NativeLong channel = new NativeLong(1);
cameraInfo.setChannel(channel);
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);
return cameraInfo;
}
}