package com.netsdk.demo.customize;
|
|
import static com.netsdk.lib.Utils.getOsPrefix;
|
|
import java.io.File;
|
import java.io.UnsupportedEncodingException;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.Scanner;
|
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.netsdk.lib.NetSDKLib.LLong;
|
import com.netsdk.lib.NetSDKLib.NET_PTZ_PRESET;
|
import com.netsdk.lib.NetSDKLib.NET_PTZ_PRESET_LIST;
|
import com.netsdk.lib.NetSDKLib.NET_RECORDFILE_INFO;
|
import com.netsdk.lib.callback.impl.DefaultDisconnectCallback;
|
import com.netsdk.lib.callback.impl.DefaultHaveReconnectCallBack;
|
import com.netsdk.lib.enumeration.EM_CFG_LC_LIGHT_TYPE;
|
import com.netsdk.lib.enumeration.EM_CFG_LC_MODE;
|
import com.netsdk.lib.enumeration.EM_NEW_CONFIG;
|
import com.netsdk.lib.structure.CFG_LIGHTING_V2_DAYNIGHT;
|
import com.netsdk.lib.structure.CFG_LIGHTING_V2_INFO;
|
import com.netsdk.lib.structure.CFG_LIGHTING_V2_UNIT;
|
import com.netsdk.lib.structure.NET_LIGHT_INFO;
|
import com.sun.jna.Memory;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
/**
|
* DVR相关功能
|
*/
|
public class DVRConfigDemo {
|
// SDk对象初始化
|
public static final NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
|
public static final NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
|
|
// 判断是否初始化
|
private static boolean bInit = false;
|
// 判断log是否打开
|
private static boolean bLogOpen = false;
|
// 设备信息
|
private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex();
|
// 登录句柄
|
private NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0);
|
|
// 回调函数需要是静态的,防止被系统回收
|
// 断线回调
|
private static NetSDKLib.fDisConnect disConnectCB = DefaultDisconnectCallback.getINSTANCE();
|
// 重连回调
|
private static NetSDKLib.fHaveReConnect haveReConnectCB = DefaultHaveReconnectCallBack.getINSTANCE();
|
|
// 编码格式
|
public static String encode;
|
|
static {
|
String osPrefix = getOsPrefix();
|
if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
|
encode = "GBK";
|
} else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
|
encode = "UTF-8";
|
}
|
}
|
|
/**
|
* 获取当前时间
|
*/
|
public static String GetDate() {
|
SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
return simpleDate.format(new java.util.Date()).replaceAll("[^0-9]", "-");
|
}
|
|
/**
|
* 初始化SDK库
|
*/
|
public static boolean Init() {
|
bInit = netsdk.CLIENT_Init(disConnectCB, null);// 进程启动时,初始化一次
|
if (!bInit) {
|
System.out.println("Initialize SDK failed");
|
return false;
|
}
|
// 配置日志
|
DVRConfigDemo.enableLog();
|
|
// 设置断线重连回调接口, 此操作为可选操作,但建议用户进行设置
|
netsdk.CLIENT_SetAutoReconnect(haveReConnectCB, null);
|
|
// 设置登录超时时间和尝试次数,可选
|
// 登录请求响应超时时间设置为3S
|
int waitTime = 3000;
|
// 登录时尝试建立链接 1 次
|
int tryTimes = 1;
|
netsdk.CLIENT_SetConnectTime(waitTime, tryTimes);
|
// 设置更多网络参数, NET_PARAM 的nWaittime , nConnectTryNum 成员与 CLIENT_SetConnectTime
|
// 接口设置的登录设备超时时间和尝试次数意义相同,可选
|
NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
|
// 登录时尝试建立链接的超时时间
|
netParam.nConnectTime = 10000;
|
// 设置子连接的超时时间
|
netParam.nGetConnInfoTime = 3000;
|
netsdk.CLIENT_SetNetworkParam(netParam);
|
return true;
|
}
|
|
/**
|
* 打开 sdk log
|
*/
|
private static void enableLog() {
|
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
|
File path = new File("sdklog/");
|
if (!path.exists())
|
path.mkdir();
|
|
// 这里的log保存地址依据实际情况自己调整
|
String logPath = path.getAbsoluteFile().getParent() + "\\sdklog\\" + "sdklog" + GetDate() + ".log";
|
setLog.nPrintStrategy = 0;
|
setLog.bSetFilePath = 1;
|
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
|
System.out.println(logPath);
|
setLog.bSetPrintStrategy = 1;
|
bLogOpen = netsdk.CLIENT_LogOpen(setLog);
|
if (!bLogOpen)
|
System.err.println("Failed to open NetSDK log");
|
}
|
|
/**
|
* 高安全登录
|
*/
|
public void loginWithHighLevel() {
|
// 输入结构体参数
|
NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() {
|
{
|
szIP = m_strIpAddr.getBytes();
|
nPort = m_nPort;
|
szUserName = m_strUser.getBytes();
|
szPassword = m_strPassword.getBytes();
|
}
|
};
|
// 输出结构体参数
|
NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
|
|
// 写入sdk
|
m_hLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam);
|
if (m_hLoginHandle.longValue() == 0) {
|
System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIpAddr, m_nPort,
|
netsdk.CLIENT_GetLastError());
|
} else {
|
deviceInfo = pstOutParam.stuDeviceInfo; // 获取设备信息
|
System.out.println("Login Success");
|
System.out.println("Device Address:" + m_strIpAddr);
|
System.out.println("设备包含:" + deviceInfo.byChanNum + "个通道");
|
}
|
}
|
|
/**
|
* 退出
|
*/
|
public void logOut() {
|
if (m_hLoginHandle.longValue() != 0) {
|
netsdk.CLIENT_Logout(m_hLoginHandle);
|
System.out.println("LogOut Success");
|
}
|
}
|
|
/**
|
* 清理sdk环境并退出
|
*/
|
public static void cleanAndExit() {
|
if (bLogOpen) {
|
netsdk.CLIENT_LogClose(); // 关闭sdk日志打印
|
}
|
netsdk.CLIENT_Cleanup(); // 进程关闭时,调用一次
|
System.exit(0);
|
}
|
|
|
/**
|
* 获取当前云台的预置点列表
|
*/
|
public void getPresetList() {
|
int MAX_QUERY_PRESET_NUM = 20; // 目前设置的最大查询预置点个数,根据实际调整
|
int nType = NetSDKLib.NET_DEVSTATE_PTZ_PRESET_LIST;
|
NET_PTZ_PRESET_LIST stuPresetList = new NET_PTZ_PRESET_LIST();
|
|
NET_PTZ_PRESET[] arrPreset = new NET_PTZ_PRESET[MAX_QUERY_PRESET_NUM];
|
for (int i = 0; i < arrPreset.length; i++) {
|
arrPreset[i] = new NET_PTZ_PRESET();
|
}
|
|
stuPresetList.dwMaxPresetNum = arrPreset.length;
|
int nMemoryLen = arrPreset[0].size() * stuPresetList.dwMaxPresetNum;
|
stuPresetList.pstuPtzPorsetList = new Memory(nMemoryLen); // 申请内存
|
stuPresetList.pstuPtzPorsetList.clear(nMemoryLen);
|
ToolKits.SetStructArrToPointerData(arrPreset, stuPresetList.pstuPtzPorsetList); // 将数组内存拷贝到Pointer
|
int nChannel = 0; // 通道号
|
stuPresetList.write();
|
IntByReference intRetLen = new IntByReference();
|
if (netsdk.CLIENT_QueryRemotDevState(m_hLoginHandle,nType,nChannel,stuPresetList.getPointer(), stuPresetList.size(), intRetLen, 5000)) {
|
//if(netsdk.CLIENT_QueryDevState(m_hLoginHandle, nType, stuPresetList.getPointer(), stuPresetList.size(), intRetLen, 5000)) {
|
stuPresetList.read();
|
ToolKits.GetPointerDataToStructArr(stuPresetList.pstuPtzPorsetList, arrPreset);
|
System.out.println("返回预置点个数: " + stuPresetList.dwRetPresetNum);
|
for (int i = 0; i < stuPresetList.dwRetPresetNum; ++i) {
|
try {
|
System.out.println(" 编号:"+arrPreset[i].nIndex);
|
System.out.println(" 名称:"+new String(arrPreset[i].szName, encode));
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
}
|
} else {
|
System.err.println("QueryDevState Failed!" + ToolKits.getErrorCode());
|
}
|
}
|
|
|
|
/**
|
* 转至预置点
|
*/
|
public void MovePreset() {
|
int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
|
int nPresetIndex = 2; // 预置点值,从1开始
|
if(PTZControl(dwPTZCommand, 0, nPresetIndex, 0, 0, null)) {
|
System.out.println("MovePreset success!");
|
} else {
|
System.err.println("MovePreset Failed!" + ToolKits.getErrorCode());
|
}
|
}
|
|
private int nQueryChannel = 0;// 通道号
|
|
public boolean PTZControl(int dwPTZCommand, int lParam1, int lParam2, int lParam3, int dwStop, Pointer param4) {
|
return netsdk.CLIENT_DHPTZControlEx2(m_hLoginHandle, nQueryChannel, dwPTZCommand, lParam1, lParam2, lParam3, dwStop,param4);
|
}
|
|
|
private int serialNum = 1;
|
/**
|
* 同步方式抓图 , 建议抓拍的频率不要超过1s
|
*/
|
public void syncSnapPicture() {
|
|
NetSDKLib.NET_IN_SNAP_PIC_TO_FILE_PARAM snapParamIn = new NetSDKLib.NET_IN_SNAP_PIC_TO_FILE_PARAM();
|
NetSDKLib.NET_OUT_SNAP_PIC_TO_FILE_PARAM snapParamOut = new NetSDKLib.NET_OUT_SNAP_PIC_TO_FILE_PARAM(1024 * 1024);
|
|
snapParamIn.stuParam.Channel = 0;
|
snapParamIn.stuParam.Quality = 3;
|
snapParamIn.stuParam.ImageSize = 1; // 0:QCIF,1:CIF,2:D1
|
snapParamIn.stuParam.mode = 0; // -1:表示停止抓图, 0:表示请求一帧, 1:表示定时发送请求, 2:表示连续请求
|
snapParamIn.stuParam.InterSnap = 5;
|
snapParamIn.stuParam.CmdSerial = serialNum;
|
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyMMddHHmmss");
|
final String fileName = "SyncSnapPicture_" + dateFormat.format(new Date()) + "_" + serialNum + ".jpg";
|
System.arraycopy(fileName.getBytes(), 0, snapParamIn.szFilePath, 0, fileName.getBytes().length);
|
|
final int timeOut = 5000; // 5 second
|
|
|
Pointer pInbuf =new Memory(snapParamIn.size());
|
ToolKits.SetStructDataToPointer(snapParamIn, pInbuf, 0);
|
|
Pointer pOutbuf =new Memory(snapParamOut.size());
|
ToolKits.SetStructDataToPointer(snapParamOut, pOutbuf, 0);
|
|
if (!netsdk.CLIENT_SnapPictureToFile(m_hLoginHandle, pInbuf, pOutbuf, timeOut)) {
|
System.err.printf("CLIENT_SnapPictureEx Failed ! Last Error[%x]\n", netsdk.CLIENT_GetLastError());
|
return;
|
}
|
|
ToolKits.GetPointerData(pOutbuf,snapParamOut);
|
Pointer szPicBuf = snapParamOut.szPicBuf;
|
byte[] byteArray = szPicBuf.getByteArray(0, snapParamOut.dwPicBufRetLen);
|
System.out.println("CLIENT_SnapPictureToFile Success. " + new File(fileName).getAbsolutePath());
|
}
|
|
|
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
private void setTime(Calendar calendar, NetSDKLib.NET_TIME stuTime) {
|
stuTime.setTime(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH),
|
calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));
|
}
|
|
// 下载句柄
|
private NetSDKLib.LLong m_hDownLoadHandle = new NetSDKLib.LLong(0);
|
|
/**
|
* 下载录像 转码流 通用接口 可以从回调获取转码流数据
|
*/
|
public void downloadRecordFileWithConvertedDataType() {
|
|
int nStreamType = 0; // 0-主辅码流,1-主码流,2-辅码流
|
int nChannel = 0; // 通道号
|
int nType = 0; // 文件类型
|
NetSDKLib.NET_TIME stTimeStart = new NetSDKLib.NET_TIME(); // 开始时间
|
NetSDKLib.NET_TIME stTimeEnd = new NetSDKLib.NET_TIME(); // 结束时间
|
|
Calendar calendar = Calendar.getInstance();
|
|
@SuppressWarnings("resource")
|
Scanner scanner = new Scanner(System.in);
|
try {
|
// 请选择要下载的码流 0-主辅码流,1-主码流,2-辅码流
|
nStreamType = 1; // 默认主码流
|
|
System.out.println("请输入真实通道号(注意sdk从0开始计数): ");
|
nChannel = scanner.nextInt();
|
|
// 0 私有码流
|
// 1 国标PS码流
|
// 2 TS码流
|
// 3 MP4文件(从回调函数出来的是私有码流数据,参数dwDataType值为0)
|
// 4 裸H264码流
|
// 5 流式FLV
|
// 请输入保存的文件类型 码流转换类型 0 私有码流; 1 国标PS码流; 2 TS码流; 3 MP4文件; 4 裸H264码流; 5 流式FLV");
|
nType = 4; // 转成 裸H264码流
|
//nType = 3; // 转成 MP4文件
|
System.out.println("请输入录像开始时间(格式:yyyy-MM-dd HH:mm:ss): ");
|
String startTime = scanner.next().trim() + " " + scanner.next().trim();
|
calendar.setTime(format.parse(startTime));
|
setTime(calendar, stTimeStart);
|
|
System.out.println("请输入录像结束时间(格式:yyyy-MM-dd HH:mm:ss): ");
|
String endTime = scanner.next().trim() + " " + scanner.next().trim();
|
calendar.setTime(format.parse(endTime));
|
setTime(calendar, stTimeEnd);
|
} catch (ParseException e) {
|
System.err.println("时间输入非法");
|
return;
|
}
|
|
File dir = new File("RecordFiles");
|
if (!dir.exists()) {// 判断目录是否存在
|
dir.mkdir();
|
}
|
|
String savedFileName = "RecordFiles/RecordCovertTest" + System.currentTimeMillis() + ".dav"; // 保存录像文件名
|
this.downloadRecordFileConverted(nStreamType, nChannel, stTimeStart, stTimeEnd, savedFileName, nType);
|
}
|
|
/**
|
* 下载录像,通用接口(把原始码流转换成其他封装格式的码流)
|
*/
|
public void downloadRecordFileConverted(int nStreamType, int nChannel,
|
NetSDKLib.NET_TIME stTimeStart, NetSDKLib.NET_TIME stTimeEnd,
|
String savedFileName, int nType) {
|
|
if (!setStreamType(nStreamType)) {
|
System.err.println("Set Stream Type Failed!." + ToolKits.getErrorCode());
|
return;
|
}
|
|
NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE stIn = new NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE();
|
|
stIn.emDataType = nType; // 封装类型
|
stIn.emRecordType = NetSDKLib.EM_QUERY_RECORD_TYPE.EM_RECORD_TYPE_ALL; // 所有录像
|
stIn.nChannelID = nChannel;
|
stIn.stStartTime = stTimeStart; // 开始时间
|
stIn.stStopTime = stTimeEnd; // 结束时间
|
stIn.cbDownLoadPos = DownloadPosCallback.getInstance(); // 下载监控回调函数
|
stIn.dwPosUser = null;
|
stIn.fDownLoadDataCallBack = DownLoadDataCallBack.getInstance(); // 下载数据回调函数
|
stIn.dwDataUser = null;
|
stIn.szSavedFileName = savedFileName;
|
|
NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE stOut = new NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE();
|
stIn.write();
|
stOut.write();
|
m_hDownLoadHandle = netsdk.CLIENT_DownloadByDataType(m_hLoginHandle, stIn.getPointer(), stOut.getPointer(), 5000);
|
if (m_hDownLoadHandle.longValue() != 0) {
|
System.out.println("DownloadByDataType Succeed!");
|
} else {
|
System.err.println("DownloadByDataType Failed! " + ToolKits.getErrorCode());
|
}
|
}
|
|
|
/**
|
* 设置回放时的码流类型: 主码流/辅码流
|
*
|
*/
|
public boolean setStreamType(int m_streamType) {
|
int emType = NetSDKLib.EM_USEDEV_MODE.NET_RECORD_STREAM_TYPE; // 回放录像枚举
|
IntByReference steamType = new IntByReference(m_streamType); // 0-主辅码流,1-主码流,2-辅码流
|
return netsdk.CLIENT_SetDeviceMode(m_hLoginHandle, emType, steamType.getPointer());
|
}
|
|
/**
|
* 下载数据回调,这里可以拿到原始的二进制码流数据
|
* 回调写成单例模式, 如果回调里需要处理数据,请另开线程
|
*/
|
public static class DownLoadDataCallBack implements NetSDKLib.fDataCallBack {
|
|
private DownLoadDataCallBack() {
|
}
|
|
private static class DownloadDataCallBackHolder {
|
private static final DownLoadDataCallBack dataCB = new DownLoadDataCallBack();
|
}
|
|
public static DownLoadDataCallBack getInstance() {
|
return DownLoadDataCallBack.DownloadDataCallBackHolder.dataCB;
|
}
|
|
public int invoke(NetSDKLib.LLong lRealHandle, int dwDataType, Pointer pBuffer, int dwBufSize, Pointer dwUser) {
|
|
// byte[] data = pBuffer.getByteArray(0, dwBufSize); // 这是二进制码流数据, 如果有其他用途可以从这里取出来
|
System.out.println("dwDataType [ " + dwDataType + " ]");
|
// 不同的封装类型,回调里返回的 dwDataType 是不同的,它们遵循下面的逻辑
|
if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_PRIVATE)) {
|
System.out.println("DownLoad DataCallBack [ " + dwDataType + " ]");
|
} else if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_GBPS)) {
|
System.out.println("DownLoad DataCallBack [ " + dwDataType + " ]");
|
} else if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_TS)) {
|
System.out.println("DownLoad DataCallBack [ " + dwDataType + " ]");
|
} else if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_MP4)) {
|
System.out.println("DownLoad DataCallBack [ " + dwDataType + " ]");
|
} else if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_H264)) {
|
System.out.println("DownLoad DataCallBack [ " + dwDataType + " ]");
|
} else if (dwDataType == (NetSDKLib.NET_DATA_CALL_BACK_VALUE + NetSDKLib.EM_REAL_DATA_TYPE.EM_REAL_DATA_TYPE_FLV_STREAM)) {
|
System.out.println("DownLoad DataCallBack [ " + dwDataType + " ]");
|
}
|
return 0;
|
}
|
}
|
|
/**
|
* 下载进度回调函数
|
* 回调写成单例模式, 如果回调里需要处理数据,请另开线程
|
*/
|
public static class DownloadPosCallback implements NetSDKLib.fTimeDownLoadPosCallBack {
|
|
private DownloadPosCallback() {
|
}
|
|
private static class CallBackHolder {
|
private static final DownloadPosCallback callback = new DownloadPosCallback();
|
}
|
|
public static DownloadPosCallback getInstance() {
|
return DownloadPosCallback.CallBackHolder.callback;
|
}
|
|
@Override
|
public void invoke(LLong lPlayHandle, int dwTotalSize, int dwDownLoadSize, int index, NET_RECORDFILE_INFO.ByValue recordfileinfo, Pointer dwUser) {
|
|
System.out.println(String.format("dwDownLoadSize: %d || dwTotalSize: %d ", dwDownLoadSize, dwTotalSize));
|
if (dwDownLoadSize == -1) { // 下载结束
|
System.out.println("Downloading Complete. ");
|
new StopDownloadTask(lPlayHandle).start(); // 注意这里需要另起线程
|
}
|
}
|
|
private static class StopDownloadTask extends Thread {
|
private final NetSDKLib.LLong lDownloadHandle;
|
|
public StopDownloadTask(NetSDKLib.LLong lDownloadHandle) {
|
this.lDownloadHandle = lDownloadHandle;
|
}
|
|
public void run() {
|
stopDownLoadRecordFile(lDownloadHandle);
|
}
|
}
|
}
|
|
/**
|
* 停止下载录像
|
*
|
* @param hDownLoadHandle 下载句柄
|
*/
|
private static void stopDownLoadRecordFile(NetSDKLib.LLong hDownLoadHandle) {
|
if (hDownLoadHandle.longValue() == 0) {
|
return;
|
}
|
netsdk.CLIENT_StopDownload(hDownLoadHandle);
|
}
|
|
|
/**
|
* 停止下载录像
|
*/
|
public void stopDownLoadRecordFile() {
|
stopDownLoadRecordFile(m_hDownLoadHandle);
|
}
|
|
|
/**
|
* 获取摄像头通道列表
|
*/
|
public void getMatrixCamerasInfo () {
|
int cameraCount = deviceInfo.byChanNum; // 通道号个数
|
NetSDKLib.NET_MATRIX_CAMERA_INFO[] cameraInfo = new NetSDKLib.NET_MATRIX_CAMERA_INFO[cameraCount];
|
for(int i = 0; i < cameraCount; i++) {
|
cameraInfo[i] = new NetSDKLib.NET_MATRIX_CAMERA_INFO();
|
}
|
|
// 入参
|
NetSDKLib.NET_IN_MATRIX_GET_CAMERAS inMatrix = new NetSDKLib.NET_IN_MATRIX_GET_CAMERAS();
|
|
// 出参
|
NetSDKLib.NET_OUT_MATRIX_GET_CAMERAS outMatrix = new NetSDKLib.NET_OUT_MATRIX_GET_CAMERAS();
|
outMatrix.nMaxCameraCount = cameraCount;
|
outMatrix.pstuCameras = new Memory(cameraInfo[0].size() * cameraCount);
|
outMatrix.pstuCameras.clear(cameraInfo[0].size() * cameraCount);
|
|
ToolKits.SetStructArrToPointerData(cameraInfo, outMatrix.pstuCameras); // 将数组内存拷贝到Pointer
|
|
if(netsdk.CLIENT_MatrixGetCameras(m_hLoginHandle, inMatrix, outMatrix, 5000)) {
|
ToolKits.GetPointerDataToStructArr(outMatrix.pstuCameras, cameraInfo); // 将 Pointer 的内容 输出到 数组
|
|
for(int j = 0; j < outMatrix.nRetCameraCount; j++) {
|
if(cameraInfo[j].bRemoteDevice == 0) { // 过滤远程设备
|
continue;
|
}
|
System.out.println("通道号:" + cameraInfo[j].nChannelID);
|
System.out.println("IP : " + new String(cameraInfo[j].stuRemoteDevice.szIp).trim());
|
System.out.println("nPort : " + cameraInfo[j].stuRemoteDevice.nPort);
|
System.out.println("szUser : " + new String(cameraInfo[j].stuRemoteDevice.szUser).trim());
|
System.out.println("szPwd : " + new String(cameraInfo[j].stuRemoteDevice.szPwd).trim());
|
System.out.println("通道个数 : " + cameraInfo[j].stuRemoteDevice.nVideoInputChannels);
|
}
|
} else {
|
System.err.println("MatrixGetCameras Failed." + ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* 全彩相机补光灯灵敏度配置
|
*/
|
public void cfgCmdLightingV2() {
|
String command = EM_NEW_CONFIG.CFG_CMD_LIGHTING_V2.getValue();
|
int channel = 7;// 通道号
|
CFG_LIGHTING_V2_INFO info = new CFG_LIGHTING_V2_INFO();
|
// 获取配置
|
if (ToolKits.GetDevConfig(m_hLoginHandle, channel, command, info)) {
|
System.out.println("通道 : " + info.nChannel);
|
System.out.println("白天黑夜对应灯光配置数量:"+info.nDNLightInfoNum);
|
CFG_LIGHTING_V2_DAYNIGHT[] anDNLightInfo = info.anDNLightInfo;// 白天黑夜对应灯光配置 从元素0开始分别表示 白天、夜晚、普通、顺光、一般逆光、强逆光、低照度、自定义
|
/**--------白天-----------*/
|
int nLightInfoLen =anDNLightInfo[0].nLightInfoLen;
|
System.out.println("灯光类型数量: "+nLightInfoLen);
|
CFG_LIGHTING_V2_UNIT[] anLightInfo = anDNLightInfo[0].anLightInfo;// 获取白天下的补光灯配置信息
|
for (int i = 0; i < nLightInfoLen; i++) {
|
System.out.println("------------------");
|
System.out.println("灯光类型:"+EM_CFG_LC_LIGHT_TYPE.getNoteByValue(anLightInfo[i].emLightType));
|
System.out.println("灯光模式:"+EM_CFG_LC_MODE.getNoteByValue(anLightInfo[i].emMode));
|
System.out.println("近光灯组数量 :"+anLightInfo[i].nNearLightLen);
|
NET_LIGHT_INFO[] anNearLight = anLightInfo[i].anNearLight;
|
for (int j = 0; j < anLightInfo[i].nNearLightLen; j++) {
|
System.out.println("亮度百分比:"+anNearLight[j].nLight);
|
}
|
}
|
// 设置,在获取配置的基础上设置
|
// 配置文件 -白天 配置文件 - 白光模式 模式-手动 模式- 0-100
|
info.anDNLightInfo[0].anLightInfo[1].anNearLight[0].nLight = 50;
|
if (ToolKits.SetDevConfig(m_hLoginHandle, channel, command, info)) {
|
System.out.println("Set CFG_CMD_LIGHTING_V2 Succeed!");
|
} else {
|
System.err.println("Set CFG_CMD_LIGHTING_V2 Failed!" + netsdk.CLIENT_GetLastError());
|
}
|
} else {
|
System.err.println("Get CFG_CMD_LIGHTING_V2 Failed!" + netsdk.CLIENT_GetLastError());
|
}
|
}
|
|
/******************************** 测试控制台 ***************************************/
|
|
// 配置登陆地址,端口,用户名,密码
|
private String m_strIpAddr = "172.11.1.111";//172.11.1.111 172.11.222.228
|
private int m_nPort = 37777;
|
private String m_strUser = "admin";
|
private String m_strPassword = "admin123";
|
|
public static void main(String[] args) {
|
DVRConfigDemo demo = new DVRConfigDemo();
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
|
}
|
|
/**
|
* 初始化测试
|
*/
|
public void InitTest() {
|
DVRConfigDemo.Init();
|
this.loginWithHighLevel();
|
}
|
|
/**
|
* 加载测试内容
|
*/
|
public void RunTest() {
|
CaseMenu menu = new CaseMenu();
|
// 通过SDK对接硬盘录像机,获取指定球机摄像头所设预置点位列表(含守望点)的接口
|
menu.addItem(new CaseMenu.Item(this, "获取当前云台的预置点列表", "getPresetList"));
|
// 通过SDK对接硬盘录像机,控制指定球机摄像头自带照明设备开关的接口
|
menu.addItem(new CaseMenu.Item(this, "全彩相机补光灯灵敏度配置", "cfgCmdLightingV2"));
|
// 通过SDK对接硬盘录像机,控制指定球机摄像头转到指定预置位的接口
|
menu.addItem(new CaseMenu.Item(this, "转至预置点" , "MovePreset"));
|
// 通过SDK对接硬盘录像机,控制指定摄像头截取视频画面的接口
|
menu.addItem(new CaseMenu.Item(this, "同步方式抓图 ", "syncSnapPicture"));
|
// 通过SDK对接硬盘录像机,控制指定摄像头的某一时间段的视频流的接口,接口需反馈基于H.264编码的视频片段,并能启动下载、查看下载进度、停止下载。
|
menu.addItem(new CaseMenu.Item(this, "按时间下载录像(通用转码流接口)", "downloadRecordFileWithConvertedDataType"));
|
menu.addItem(new CaseMenu.Item(this, "停止下载录像", "stopDownLoadRecordFile"));
|
// 通过SDK对接硬盘录像机,查询摄像头通道列表
|
menu.addItem(new CaseMenu.Item(this, "获取摄像头通道列表", "getMatrixCamerasInfo"));
|
menu.run();
|
}
|
|
/**
|
* 结束测试
|
*/
|
public void EndTest() {
|
System.out.println("End Test");
|
this.logOut(); // 登出设备
|
System.out.println("See You...");
|
DVRConfigDemo.cleanAndExit(); // 清理资源并退出
|
}
|
/******************************** 结束 ***************************************/
|
|
}
|