海康解码器-启动动态解码
启动动态解码(不用上传监控点到解码器直接使用外部信号源) 伪代码
public static boolean startDynamicSDK(int userId, DynamicOpVO dynamicOpVO) {
HCNetSDK.NET_DVR_PU_STREAM_CFG_V41 cfg = new HCNetSDK.NET_DVR_PU_STREAM_CFG_V41();
// 取流模式,0-无效,1-通过IP或域名取流,2-通过URL取流,3-通过动态域名解析向设备取流
cfg.byStreamMode = 2;
cfg.dwSize = cfg.size();
// 因为 uDecStreamMode 是 Union 类型 所以需要这个
cfg.uDecStreamMode.setType(HCNetSDK.NET_DVR_PU_STREAM_URL.class);
cfg.uDecStreamMode.read();
byte[] streamUrl = dynamicOpVO.getStreamUrl().getBytes(StandardCharsets.UTF_8);
// 必须使用这种方式来赋值
System.arraycopy(streamUrl, 0, cfg.uDecStreamMode.struUrlInfo.strURL, 0, streamUrl.length);
cfg.uDecStreamMode.struUrlInfo.byEnable = 1;
cfg.write();
int dwDecChanNum = getDecChanNum(dynamicOpVO);
boolean r = HikDeviceUtils.getHCNetSDK().NET_DVR_MatrixStartDynamic_V41(userId, dwDecChanNum, cfg.getPointer());
if (!r) {
HikDeviceUtils.lastError();
}
return r;
}
private static int getDecChanNum(BaseNo baseNo) {
int m_dwWinNo = baseNo.getWinNo();
int m_dwSubWinNo = baseNo.getSubWinNo();
int m_dwWallNo = baseNo.getWallNo();
return m_dwWinNo + ((m_dwSubWinNo & 0xff) << 16) + (m_dwWallNo << 24);
}
停止解码
public static boolean stopDynamicSDK(int userId, DynamicOpVO dynamicOpVO) {
int dwDecChanNum = getDecChanNum(dynamicOpVO);
boolean r = HikDeviceUtils.getHCNetSDK().NET_DVR_MatrixStopDynamic(userId, dwDecChanNum);
if (!r) {
HikDeviceUtils.lastError();
}
return r;
}
HikDeviceUtils.getHCNetSDK() 是HCNetSDK
// 墙编号、窗口编号、子窗口编号
private Integer wallNo;
private Integer winNo;
private Integer subWinNo;
// 流媒体取流地址 rtsp
private String streamUrl;