最近这段时间一直在间歇开发海康威视SDK,现记录最近开发出的新功能,根据配置文件内容到达指定位置,指定放大倍数,拍摄指定时长的视频,并把视频分为一个完整视频和指定时长的视频,简单来说就是你可以通过配置文件指定摄像机去那个位置,多少放大倍数,拍摄多长时间,然后把拍摄完的视频保存成一个完成过程视频和一个个指定时长的视频
- 初始化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
1.配置文件内容
// 配置文件为TXT格式 ,这里只是做说明
//运行时不允许出现这些注释,删掉即可
// 只允许出现第一行 IP地址 端口号 用户名 密码
192.168.1.64 8000 admin gw*123456
// 第二行-第N行 为配置参数 水平角度 垂直角度 放大倍数 拍摄时长 单位/S
// 水平角度如水平旋转45度,那么只需要计算十六进制450的十进制参数即可 计算出1104即为旋转45度
100 2000 50 6
1500 1200 120 6
400 500 190 6
100 2000 50 6
- 按照上面这个配置文件执行的话,出现的效果是有几组参数就录制几个视频,视频时长按照配置文件录制
2. 文件对应位置
- 我这个目录结构是这样的 在javaDemo的src–>ClientDemo目录下
3. 相机对象类 CameraInfo
package ClientDemo;
import com.sun.jna.NativeLong;
public class CameraInfo {
private String address;
private String userName;
private String pwd;
private short port;
private NativeLong userId;
private NativeLong channel;
private NativeLong key;
// 下面为该类的GET SET方法
public NativeLong getKey() {
return key;
}
public void setKey(NativeLong key) {
this.key = key;
}
}
4. java实现代码
- 请先保证你已经部署了海康威视的Java SDK,如果没有部署请参考我这篇文章
- https://blog.csdn.net/weixin_44232093/article/details/104815264
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;
}
}
版权声明:本文为weixin_44232093原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。