|
|
|
@ -274,8 +274,10 @@ public class HikIvsVendorService implements IvsVendorAdapter { |
|
|
|
validatePathCameraCode(request.getCameraCode(), request.getDomainCode()); |
|
|
|
// 先从 ivs_camera 读取前端 IP,避免数字通道直接走 NVR SDK 时出现 error 29。 |
|
|
|
String cameraIp = resolveCameraIp(request.getCameraCode(), request.getDomainCode()); |
|
|
|
log.info("抓图的相机ip {}",cameraIp); |
|
|
|
// 查询启用的 NVR 并解析 IVS 通道,后续抓图始终使用同一个目标。 |
|
|
|
Target target = resolveTarget(request.getCameraCode(), request.getDomainCode()); |
|
|
|
log.info("查询启用的 NVR {} 并解析 IVS 通道 {}", target.nvr, target.channel); |
|
|
|
// 复用 /hik/nvr/playback/hls/ui/actions/snapshot 背后的业务服务,保持厂商 SDK 只在海康层。 |
|
|
|
HikNvrUiActionService actions = uiActionService.forNvr(toNvrInfo(target.nvr)); |
|
|
|
// 将 IVS 通道转换为海康操作服务所需的页面逻辑通道并执行 JPEG 抓图。 |
|
|
|
@ -287,6 +289,7 @@ public class HikIvsVendorService implements IvsVendorAdapter { |
|
|
|
// 使用 UTC 记录 IVS 要求的紧凑时间格式,避免服务器时区影响查询结果。 |
|
|
|
String snapTime = LocalDateTime.now(ZoneOffset.UTC).format(IVS_TIME); |
|
|
|
// 保存任务元数据和图片内容,列表接口只返回元数据,图片接口再返回 JPEG 字节。 |
|
|
|
log.info("保存任务元数据和图片内容 taskId {}", taskId); |
|
|
|
snapshotRecords.put(taskId, new SnapshotRecord( |
|
|
|
taskId, request.getCameraCode(), request.getDomainCode(), |
|
|
|
snapTime, image == null ? new byte[0] : image.clone())); |
|
|
|
@ -311,6 +314,7 @@ public class HikIvsVendorService implements IvsVendorAdapter { |
|
|
|
if (request == null || !hasText(request.getTaskID())) { |
|
|
|
throw HikNvrPlaybackException.badRequest("taskID不能为空"); |
|
|
|
} |
|
|
|
log.info("抓图的任务id {}",request.getTaskID()); |
|
|
|
// 读取任务缓存;任务尚未完成或已过期时返回空列表而不是伪造图片记录。 |
|
|
|
SnapshotRecord record = snapshotRecords.get(request.getTaskID().trim()); |
|
|
|
List<IvsPlatformSnapshotView.SnapshotInfo> infos = new ArrayList<>(); |
|
|
|
|