/** * Promise 风格调用:SDK 方法本身返回 Promise / thenable。 * 同步异常、Promise reject 与同步返回 `-1` 均收敛为 `HikError`;其它非 thenable 直接 resolve。 */ export declare function callPromise(sdk: WebVideoCtrlSDK, method: string, ...args: unknown[]): Promise; /** 同步调用:直接转发 SDK 方法返回值(用于 `I_GetWindowStatus` 等立即返回的 API)。 */ export declare function callSync(sdk: WebVideoCtrlSDK, method: string, ...args: unknown[]): T; /** * 回调式调用:SDK 方法通过 `options.success / options.error` 通知结果。 * * - callback 挂载到 `args` 中最后一个 plain object 上,缺失时自动追加。 * - 用户预先填的 `success / error` 仍会被调用,但其异常不会污染 Promise 状态。 * - SDK 同步返回 `-1` 视为立即失败,避免 Promise 永久 pending。 */ export declare function callWithCallback(sdk: WebVideoCtrlSDK, method: string, ...args: unknown[]): Promise; export declare interface CaptureOptions { /** 文件名;按扩展名决定格式(`.bmp` 为 BMP,其它默认 JPEG)。 */ fileName?: string; windowIndex?: number; /** 设置后不再下载文件,而是回传原始 Uint8Array(对应官方 `cbCallback`)。 */ onData?: (data: Uint8Array) => void | Promise; } /** 聚合自模拟 / 数字 / 零通道的通道信息。 */ export declare interface ChannelInfo { id: string; name: string; kind: ChannelKind; /** 模拟通道恒为 true,数字通道按 `` 字段判定。 */ online: boolean; /** 仅零通道有意义,模拟/数字均为 true。 */ enabled: boolean; /** 模拟通道独有的视频制式 PAL / NTSC。 */ videoFormat?: string; } export declare type ChannelKind = 'analog' | 'digital' | 'zero'; /** 创建 `HikPlayer` 实例的工厂函数,便于注入 SDK 替身。 */ export declare function createHikPlayer(options?: HikPlayerOptions): HikPlayer; /** 当前时间字符串,等价于 `formatDate(new Date(), pattern)`。 */ export declare function currentTimestamp(pattern?: string): string; export declare const DEFAULT_PORT: { readonly HTTP: 80; readonly HTTPS: 443; readonly RTSP: 554; }; /** 设备端抓图参数(无需先在窗口中预览)。 */ export declare interface DeviceCaptureOptions { /** 设备通道号。 */ channel: number; /** 保存文件名;SDK 固定保存为 JPEG。 */ fileName?: string; /** 请求的图片宽度,必须与 `height` 同时传入。 */ width?: number; /** 请求的图片高度,必须与 `width` 同时传入。 */ height?: number; /** 按日期建立子目录,默认 `true`。 */ byDateDirectory?: boolean; } /** 设备登录凭据。 */ export declare interface DeviceCredentials { /** 设备 IP 或域名。 */ host: string; /** 端口;默认 `http=80` / `https=443`。 */ port?: number; /** 协议,默认 `http`。 */ protocol?: ProtocolScheme; username: string; password: string; /** 透传给 `I_Login` 的扩展参数。 */ login?: DeviceLoginOptions; } /** 解析自 `I_GetDeviceInfo` XML 的设备基本信息。 */ export declare interface DeviceInfo { deviceName: string; deviceId: string; deviceType: string; model: string; serialNumber: string; macAddress: string; firmwareVersion: string; firmwareReleasedDate: string; encoderVersion: string; encoderReleasedDate: string; /** 原始 XML 文档,供进一步解析。 */ raw: Document; } export declare interface DeviceLoginOptions { /** 异步交互,默认 `true`。 */ async?: boolean; /** CGI 协议;`1` 强制 ISAPI,缺省由 SDK 自动协商。 */ cgi?: number; } /** `I_GetDevicePort` 返回的端口信息。 */ export declare interface DevicePort { /** 设备 HTTP/HTTPS 端口 */ iDevicePort: number; /** 设备 RTSP 端口 */ iRtspPort: number; /** HTTP 管理端口;部分设备与 `iDevicePort` 相同。 */ iHttpPort?: number; /** WebSocket 取流端口(HTTP 页面)。 */ iWebSocketPort?: number; /** WebSocket Secure 取流端口(HTTPS 页面)。 */ iWebSocketsPort?: number; } /** 登录成功返回的会话信息。 */ export declare interface DeviceSession { /** 设备唯一标识 `_`。 */ id: string; host: string; port: number; username: string; protocol: ProtocolScheme; } export declare interface DownloadByTimeOptions extends DownloadOptions { fileName: string; startTime: string; endTime: string; } export declare interface DownloadOptions { /** 按日期建立子目录,默认 true。 */ byDateDirectory?: boolean; } /** * 将 SDK 回调入参统一为 `Document`。 * * `success(data)` 入参可能形态: * - `Document`:现代 SDK 主路径 * - `string`:早期版本透传 responseText * - jQuery `jqXHR`:旧 demo 兼容路径,含 `responseXML` 或 `responseText` */ export declare function ensureXmlDocument(input: unknown): Document | null; /** `I2_OpenFileDlg` 对话框类型(`0` 文件夹,`1` 文件)。 */ export declare const FILE_DIALOG: { readonly Directory: 0; readonly File: 1; }; export declare type FileDialogType = typeof FILE_DIALOG[keyof typeof FILE_DIALOG]; /** * 按 `yyyy-MM-dd HH:mm:ss[.SSS]` 格式化日期。 * * 支持的 token:`yyyy / MM / dd / HH / mm / ss / SSS`。 */ export declare function formatDate(date: Date, pattern?: string): string; /** * 海康封装库统一错误类型。 * * 优先用 `code` 做分支判断,避免依赖 `message` 文案;原始错误经由 `cause` 透传(ES2022)。 */ export declare class HikError extends Error { readonly name = "HikError"; readonly code: HikErrorCode; readonly details?: HikErrorDetails; constructor(code: HikErrorCode, message: string, details?: HikErrorDetails, cause?: unknown); } /** * 错误码枚举,用于 `switch` 分支判断与日志聚合。 * * - `SDK_NOT_FOUND` 未检测到 `window.WebVideoCtrl`(多半 `webVideoCtrl.js` 未加载) * - `SDK_METHOD_MISSING` SDK 目标方法不存在(常见于版本不匹配) * - `SDK_CALL_FAILED` SDK 回调 `error` 或抛异常;详情见 `details.status / responseXml` * - `NOT_INITIALIZED` 未调用 `init()` 就操作播放器 * - `ALREADY_INITIALIZED` 已初始化的播放器被重复初始化 * - `INITIALIZATION_TIMEOUT` 底层播放组件未在指定时间内完成初始化 * - `INVALID_ARGUMENT` 参数校验失败(如端口越界、时间区间反转) * - `DEVICE_NOT_FOUND` 未登录或已登出的设备被引用 * - `WINDOW_NOT_PLAYING` 对未播放窗口执行 `stop / pause` * - `SCRIPT_LOAD_FAILED` `loadWebVideoCtrl()` 加载脚本失败或超时 */ export declare type HikErrorCode = 'SDK_NOT_FOUND' | 'SDK_METHOD_MISSING' | 'SDK_CALL_FAILED' | 'NOT_INITIALIZED' | 'ALREADY_INITIALIZED' | 'INITIALIZATION_TIMEOUT' | 'INVALID_ARGUMENT' | 'DEVICE_NOT_FOUND' | 'WINDOW_NOT_PLAYING' | 'SCRIPT_LOAD_FAILED'; /** 错误附带的调试信息,所有字段均可选。 */ export declare interface HikErrorDetails { /** 触发错误的 SDK 方法名 */ method?: string; /** HTTP 状态码(来自 SDK `error(status, xmlDoc)` 回调) */ status?: number; /** 设备返回的 XML 文本(已序列化) */ responseXml?: string; /** SDK 同步返回值(如 `I_Logout` 返回 -1) */ returnValue?: unknown; [key: string]: unknown; } /** * 海康无插件 WebVideoCtrl 的现代化 TypeScript 客户端。 * * 一个实例对应"一个插件 + 一组登录设备 + 一组播放窗口"。 * SDK 的同步 / Promise / 回调三种调用形态统一抽象为 `async/await`。 * 通过 `on/off/once` 订阅强类型事件(同步派发)。 * * 推荐使用 {@link createHikPlayer} 创建实例,便于注入测试 SDK 替身。 */ export declare class HikPlayer { #private; constructor(options?: HikPlayerOptions); /** 是否已完成初始化。 */ get isInitialized(): boolean; /** 当前选中窗口索引;未初始化时为 0。 */ get activeWindowIndex(): number; /** 已挂载的容器 id;未初始化时为 null。 */ get containerId(): string | null; /** 底层 SDK 实例,供高级扩展使用。 */ get sdk(): WebVideoCtrlSDK; /** 浏览器是否支持无插件模式(Chromium 内核 ≥ 91)。 */ supportsNoPlugin(): boolean; /** 检查官方播放组件版本;无插件模式固定返回 `0`。 */ checkPluginVersion(): number; /** * 初始化播放器。 * * 流程:环境校验 → `I_InitPlugin` → `cbInitPluginComplete` 内调用 * `I_InsertOBJECTPlugin` 挂载到容器。 */ init(options: PluginInitOptions): Promise; /** * 停止全部播放、释放 Worker、清空事件订阅。 * 重复调用安全;销毁后实例不再可用。适合 SPA 路由切换 / 组件卸载时调用。 */ destroy(): Promise; /** 调整插件渲染尺寸;不传按容器实际尺寸自适应。 */ resize(width?: number | string, height?: number | string): void; /** 订阅事件,返回取消订阅函数。 */ on(event: K, handler: (payload: HikPlayerEventMap[K]) => void): () => void; /** 仅触发一次,触发后自动解除订阅。 */ once(event: K, handler: (payload: HikPlayerEventMap[K]) => void): () => void; /** 取消订阅;不传 handler 则清空该事件全部监听。 */ off(event: K, handler?: (payload: HikPlayerEventMap[K]) => void): void; /** 切换分屏布局(1=1x1 / 2=2x2 / 3=3x3 / 4=4x4)。 */ changeLayout(layout: number): Promise; /** * 进入全屏播放。 * 官方无插件接口只能进入全屏;传 `false` 时由封装层调用浏览器 Fullscreen API 退出。 */ fullScreen(enable?: boolean): Promise; /** 获取窗口状态;未播放或越界返回 null。 */ getWindowStatus(windowIndex?: number): WindowStatus | null; /** 全部正在播放的窗口。 */ getAllWindows(): WindowStatus[]; /** * 登录设备。 * * 返回的 `DeviceSession.id` 即 SDK 内部的 `_` 标识, * 后续接口的 `deviceId` 参数均应使用此值。 */ login(credentials: DeviceCredentials): Promise; /** 登出设备,自动停止相关播放窗口并清空 SecretKey。 */ logout(deviceId: string): Promise; /** 已登录设备列表。 */ listDevices(): DeviceSession[]; /** 查询设备会话;未登录时返回 undefined。 */ getDevice(deviceId: string): DeviceSession | undefined; /** 设备基本信息(型号、序列号、版本等)。 */ getDeviceInfo(deviceId: string): Promise; /** 获取设备安全能力版本 XML。 */ getSecurityVersion(deviceId: string): Promise; /** 同步读取设备 HTTP / RTSP 端口。 */ getDevicePort(deviceId: string): DevicePort; /** 模拟通道(DVR 同轴摄像头)。 */ getAnalogChannels(deviceId: string): Promise; /** 数字通道(NVR 接入的网络摄像头)。 */ getDigitalChannels(deviceId: string): Promise; /** 零通道(整机预览,NVR/混合 DVR 特有)。 */ getZeroChannels(deviceId: string): Promise; /** * 一次性获取设备的全部通道(合并模拟 / 数字 / 零)。 * 任一接口失败仅丢弃该类通道,便于在能力不全的设备上降级。 */ getChannels(deviceId: string): Promise; /** 语音对讲通道列表(保留原始 XML,业务层按需解析)。 */ getAudioChannels(deviceId: string): Promise; /** 开始实时预览。 */ startPreview(deviceId: string, options: PreviewOptions): Promise; /** 停止指定窗口的预览 / 回放,缺省为当前选中窗口。 */ stop(windowIndex?: number): Promise; /** 停止全部窗口(含预览与回放)。 */ stopAll(): Promise; /** 按时间段开始回放;时间格式必须为 `yyyy-MM-dd HH:mm:ss`。 */ startPlayback(deviceId: string, options: PlaybackOptions): Promise; /** 暂停回放。 */ pause(windowIndex?: number): Promise; /** 从暂停 / 单帧恢复正常回放。 */ resume(windowIndex?: number): Promise; /** 加速回放(每次提升一档)。 */ playFast(windowIndex?: number): Promise; /** 减速回放(每次降低一档)。 */ playSlow(windowIndex?: number): Promise; /** 当前窗口的 OSD 时间,格式 `yyyy-MM-dd HH:mm:ss`。 */ getOsdTime(windowIndex?: number): Promise; /** 打开声音。 */ openSound(windowIndex?: number): Promise; /** 关闭声音。 */ closeSound(windowIndex?: number): Promise; /** 设置音量(0-100)。 */ setVolume(volume: number, windowIndex?: number): Promise; /** 启用电子放大。 */ enableEZoom(windowIndex?: number): Promise; /** 禁用电子放大。 */ disableEZoom(windowIndex?: number): Promise; /** * 启用 3D 放大。 * 启用后按住左键从左上拖到右下放大,反之缩小。 */ enable3DZoom(windowIndex?: number, onZoomInfo?: (info: unknown) => void): Promise; /** 禁用 3D 放大。 */ disable3DZoom(windowIndex?: number): Promise; /** 设置该窗口的码流加密密钥。 */ setSecretKey(secretKey: string, windowIndex?: number): Promise; /** * 抓拍当前画面。 * * - 不传 `onData`:保存到浏览器下载文件夹(`.bmp` 抓 BMP,否则 JPEG)。 * - 传 `onData`:仅回调原始 Uint8Array,不下载文件。 * * @returns SDK 实际使用的文件名 */ capture(options?: CaptureOptions): Promise; /** 直接从设备通道抓取 JPEG,无需先在播放窗口中预览。 */ captureDevice(deviceId: string, options: DeviceCaptureOptions): Promise; /** 开始本地录像,保存到浏览器下载文件夹。 */ startRecording(options?: RecordingOptions): Promise; /** 停止本地录像。 */ stopRecording(windowIndex?: number): Promise; /** * 搜索指定通道、时间段内的录像。 * SDK 单次最多返回 40 条,`searchPos` 或 `page` 控制翻页;`status` 为 `MORE` 表示仍有后续数据。 */ searchRecords(deviceId: string, options: RecordSearchOptions): Promise; /** * 按 `playbackURI` 下载录像。 * V3.4.0 无插件模式通常直接触发浏览器下载并 resolve `undefined`。 */ downloadRecord(deviceId: string, playbackUri: string, fileName: string, options?: DownloadOptions): Promise; /** 按时间段下载录像(需设备支持)。 */ downloadRecordByTime(deviceId: string, playbackUri: string, options: DownloadByTimeOptions): Promise; /** 开始 PTZ 动作;松开按键时务必调用 `ptzStop()`,否则球机持续运动。 */ ptzStart(options: PtzControlOptions): Promise; /** 停止 PTZ 动作。 */ ptzStop(action: PtzControlOptions['action'], windowIndex?: number): Promise; /** 保存预置位(先用 PTZ 调整画面,再调用此方法绑定到 ID)。 */ setPreset(presetId: number, windowIndex?: number): Promise; /** 调用预置位。 */ goPreset(presetId: number, windowIndex?: number): Promise; /** 导出设备配置文件(SDK 弹出系统保存框)。 */ exportDeviceConfig(deviceId: string, password: string): Promise; /** * 导入设备配置文件。 * * `fileName` 与 `file` 通常来自 `openFileDialog(FILE_DIALOG.File)`。 * V3.4.0 实际上传浏览器 File 句柄,仅传文件名通常无法完成导入。 */ importDeviceConfig(deviceId: string, fileName: string, options: ImportDeviceConfigOptions): Promise; /** 恢复出厂参数(`basic` 保留网络与用户,`full` 全量重置)。 */ restoreDefault(deviceId: string, mode: RestoreMode): Promise; /** 重启设备;成功仅表示设备已收到指令。 */ restart(deviceId: string): Promise; /** 断线重连(不会重新登录)。 */ reconnect(deviceId: string): Promise; /** 开始固件异步升级;升级完成后设备需要重启。`file` 通常来自 `openFileDialog(FILE_DIALOG.File)`。 */ startUpgrade(deviceId: string, fileName: string, options: StartUpgradeOptions): Promise; /** 查询升级进度;不传 `deviceId` 时仅在单设备场景自动推断。 */ getUpgradeProgress(deviceId?: string): Promise<{ percent: number; upgrading: boolean; }>; /** 透传 ISAPI 请求到设备;登录后已持有认证信息,`auth` 通常无需显式传入。 */ sendHttpRequest(deviceId: string, uri: string, options?: HttpRequestOptions): Promise; /** 通道字符叠加配置(OSD 文字)。 */ getTextOverlay(deviceId: string, uri: string): Promise; /** 打开系统文件 / 文件夹对话框;`szFileName === '-1'` 表示用户取消。 */ openFileDialog(type: 0 | 1): Promise; } /** `on / off / once` 的事件名 → 负载映射;命名规约 `:`。 */ export declare interface HikPlayerEventMap { 'plugin:initialized': void; 'plugin:destroyed': void; 'plugin:error': { windowIndex: number; errorCode: number; error: unknown; }; 'plugin:performance-lack': void; 'plugin:secret-key-error': { windowIndex: number; }; /** 异常事件(取流断开 / 回放结束 / 对讲失败 / 空间不足等)。 */ 'plugin:event': { eventType: PluginEventCode | number; windowIndex: number; param2: number; }; 'window:selected': { windowIndex: number; }; 'window:dblclick': { windowIndex: number; fullScreen: boolean; }; 'device:connected': DeviceSession; 'device:disconnected': { deviceId: string; }; 'preview:started': { deviceId: string; channel: number; windowIndex: number; zeroChannel: boolean; }; 'preview:stopped': { deviceId: string; windowIndex: number; }; 'preview:stopped-all': void; 'playback:started': { deviceId: string; channel: number; windowIndex: number; startTime: string; endTime: string; }; 'playback:stopped': { deviceId: string; windowIndex: number; }; 'recording:started': { fileName: string; windowIndex: number; }; 'recording:stopped': { windowIndex: number; }; 'capture:completed': { fileName: string; windowIndex: number; asFile: boolean; }; 'device-capture:completed': { deviceId: string; channel: number; fileName: string; }; } export declare interface HikPlayerOptions { /** 注入自定义 SDK 实例;缺省读取 `window.WebVideoCtrl`。便于测试替换。 */ sdk?: WebVideoCtrlSDK; } export declare interface HttpRequestOptions { /** 默认 `GET`。 */ method?: 'GET' | 'POST' | 'PUT' | 'DELETE'; /** 请求体(XML 字符串),用于 PUT/POST。 */ body?: string; /** 默认 `true`。 */ async?: boolean; /** `true` 携带已登录设备认证;字符串则直接作为 `auth` 字段透传。 */ auth?: boolean | string; } export declare interface ImportDeviceConfigOptions { /** 导入密码;未加密配置可不传。 */ password?: string; /** `openFileDialog(FILE_DIALOG.File)` 返回的 File 句柄(无插件模式必填)。 */ file: File; } /** 标准 DNS 主机名;兼容局域网单标签名称与 punycode 域名。 */ export declare function isHostname(value: string): boolean; /** 严格匹配点分十进制 IPv4。 */ export declare function isIPv4(value: string): boolean; /** 校验标准 IPv6(接受带方括号和 IPv4 映射地址)。 */ export declare function isIPv6(value: string): boolean; /** 不创建实例的情况下检测浏览器是否支持无插件模式。 */ export declare function isNoPluginSupported(): boolean; /** 主机地址综合校验(IPv4 / IPv6 / 域名 / `localhost`)。 */ export declare function isValidHost(host: string): boolean; /** 端口号是否合法(1-65535 的整数)。 */ export declare function isValidPort(port: number): boolean; /** 校验 `[start, end]` 区间合法。 */ export declare function isValidTimeRange(start: string, end: string): boolean; /** * 分屏布局,传给 `I_InitPlugin.iWndowType` 与 `I_ChangeWndNum`。 * * 取值非平方关系:`1/2/3/4` 直接对应 `1x1 / 2x2 / 3x3 / 4x4`,超过 4 按 4x4 处理。 */ export declare const LAYOUT: { readonly Single: 1; readonly Quad: 2; readonly Nine: 3; readonly Sixteen: 4; }; export declare type Layout = typeof LAYOUT[keyof typeof LAYOUT]; /** * 异步加载 `webVideoCtrl.js`,返回 SDK 实例。 * * 已存在 `window.WebVideoCtrl` 时直接复用;否则注入 `