开发海康威视sdk ,IPC设备,视频回调用的是官方提供的Demo中的(fRealDataCallBack )
在最下面代码可以设置Thread.sleep()设置拍摄时长
- 文件结构
- 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;
}
public void setAddress(String address){
this.address = address;
}
public void setUserName(String userName){
this.userName = userName;
}
public void setPwd(String pwd){
this.pwd = pwd;
}
public void setPort(short port){
this.port = port;
}
public NativeLong getUserId(){
return userId;
}
public NativeLong getChannel(){
return channel;
}
public String getAddress(){
return address;
}
public short getPort(){
return port;
}
public String getUserName() {
return userName;
}
public String getPwd() {
return pwd;
}
public void setChannel(NativeLong channel) {
this.channel = channel;
}
public void setUserId(NativeLong userId) {
this.userId = userId;
}
}
- HIKSDKSaveRealData中的内容
package ClientDemo;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import java.io.File;
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");
//查看当前DVR参数信息和初始化注册等 传入连接信息 不需要可以注释掉
HikSdk.getDVRConfig(cameraInfo);
HikSdk.SaveRealDataformDir(cameraInfo);
}
/*
* 获取实时视频方法 传入连接信息对象
* 目的:获取到实时视频存入指定文件中 保存为Mp4格式文件
* */
public void getDVRConfig(CameraInfo cameraInfo){
HCNetSDK sdk =HCNetSDK.INSTANCE; //创建hcnetsdk实例对象
if (!sdk.NET_DVR_Init()){
System.out.println("初始化失败..........");
return;
}
//设置超时时间与重连次数
sdk.NET_DVR_SetConnectTime(2000, 1);
sdk.NET_DVR_SetReconnect(10000, true);
//创建设备
HCNetSDK.NET_DVR_DEVICEINFO_V30 deInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
System.out.println("设备信息: " +deInfo);
//注册用户设备
NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getAddress(), cameraInfo.getPort(),
cameraInfo.getUserName(), cameraInfo.getPwd(), deInfo);
//把返回的UserId放进实例对象中
cameraInfo.setUserId(id);
//判断是否注册成功 login
if(cameraInfo.getUserId().intValue()<0){
System.out.println("注册失败,错误码为"+sdk.NET_DVR_GetLastError());
return;
}
//查看DVR工作状态
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;
}
//ip参数设置
IntByReference ibrBytesReturned = new IntByReference(0);// 获取IP接入配置参数
HCNetSDK.NET_DVR_IPPARACFG ipcfg = new HCNetSDK.NET_DVR_IPPARACFG();//IP接入配置结构
ipcfg.write();
//获取接受数据的缓冲指针
Pointer lpIpParaConfig = ipcfg.getPointer();
/*获取相关参数配置 参数说明
*第一个参数为 loginV30的返回值 Id
* 第二个参数为 获取配置的代号code
* 第三个参数为 通道号 置零即可
* 第四个参数为 缓冲区指针大小 从demo对象中后获取对象获取指针size
* 第五个参数为 实际收到的数据长度指针 创建IntByReference对象即可
* */
sdk.NET_DVR_GetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0),
lpIpParaConfig, ipcfg.size(), ibrBytesReturned);
ipcfg.read();
System.out.print("IP地址:" + cameraInfo.getAddress());
System.out.println("|设备状态:" + devwork.dwDeviceStatic);// 0正常,1CPU占用率过高,2硬件错误,3未知
/* 显示模拟通道
*获取模拟通道个数
* 具体获取其他参数详见sdk文档 -参数配置-5.13.3
* */
for (int i = 0; i < deInfo.byChanNum; i++) {
System.out.print("Camera" + i + 1);// 模拟通道号名称
System.out.print("|是否录像:" + devwork.struChanStatic[i].byRecordStatic);// 0不录像,不录像
System.out.print("|信号状态:" + devwork.struChanStatic[i].bySignalStatic);// 0正常,1信号丢失
System.out.println("|硬件状态:" + devwork.struChanStatic[i].byHardwareStatic);// 0正常,1异常
}
//注销用户
sdk.NET_DVR_Logout(cameraInfo.getUserId());//释放SDK资源
sdk.NET_DVR_Cleanup();
}
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("获取设备能力集失败,返回设备状态失败...............");
}
//启动实时预览功能 创建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);
//判断是否预览成功
if(key.intValue()==-1){
System.out.println("预览失败 错误代码为: "+sdk.NET_DVR_GetLastError());
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
}
// 如果没有文件则创建 保存在 D://realData/result.mp4 中
File file = new File("D:\\realData");
if (!file.exists()) {
file.mkdir();
}
//预览成功后 调用接口使视频资源保存到文件中
if(!sdk.NET_DVR_SaveRealData(key, file.getAbsolutePath()+ "\\result.mp4")){
System.out.println("保存到文件失败 错误码为: "+sdk.NET_DVR_GetLastError());
sdk.NET_DVR_StopRealPlay(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
}
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
//上面设置的睡眠时间可以当做拍摄时长来使用,然后调用结束预览,注销用户,释放资源就可以了
sdk.NET_DVR_StopRealPlay(key);
sdk.NET_DVR_Logout(cameraInfo.getUserId());
sdk.NET_DVR_Cleanup();
// 程序运行完毕退出阻塞状态
System.exit(0);
}
}
提取出来的视频可以用plotplayer播放,很方便。
- config.txt中的内容
// 配置文件为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