更新记录

1.0.0(2026-07-02)

  • 新版发布

平台兼容性

uni-app(5.01)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × 7.0 × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(5.01)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 7.0 × × ×

yt-hknet

海康威视网络摄像头 SDK 的 uni-app / uni-app x UTS 插件。提供设备登录、实时预览、抓拍、云台控制等能力。

平台支持

框架 Android App iOS App
uni-app(Vue2 / Vue3,推荐 nvue 页面) ✅ 已实现 ❌ 未实现
uni-app x(uvue) ✅ 已实现 ❌ 未实现

本插件同时兼容 uni-appuni-app x 的 UTS 插件调用方式;云台相关 API 使用对象入参(见下文 PtzPara / PtzCruisePara),以适配 uni-app JS 侧传参。


特别提醒

  • 购买本插件前,请先试用,请先试用,请先试用,确认满足需求之后再行购买。虚拟物品一旦购买之后无法退款。
  • 如有使用上的疑问、bug,可以进交流群联系作者;
  • 请在合法范围内使用,若使用本插件做非法开发,本方概不负责;
  • 插件需先引入再打自定义基座后使用
  • uniapp如需摄像头预览则必须把yt-hknet放在在nvue页面,且不能给yt-hknet设置背景色。更多问题详见下方常见问题
  • 可下载示例示例demo(unipp-x示例demo在uniapp示例demo的static文件夹下)

目录


插件结构

uni_modules/yt-hknet/
├── package.json
├── readme.md
└── utssdk/
    ├── app-android/
    │   ├── index.uts          # UTS API(登录、抓拍、云台等)
    │   ├── index.vue          # 原生预览组件 yt-hknet
    │   ├── PreviewView.kt
    │   ├── AndroidManifest.xml
    │   └── libs/
    │       └── yt_hik-release.aar
    └── app-ios/
        ├── index.uts          # iOS 占位,暂未实现
        └── index.vue

插件包含两部分:

类型 说明
UTS 模块 API import * as HKNet from '@/uni_modules/yt-hknet',用于 SDK 初始化、登录、抓拍、云台等
原生组件 <yt-hknet>,用于实时视频预览

平台与框架说明

uni-app(/ nvue)

  • 页面必须使用 nvue(原生渲染),预览组件 <yt-hknet>
  • UTS API 通过 import * as HKNet from '@/uni_modules/yt-hknet' 引入,在 .nvue<script> 中直接调用。
  • 预览组件 $refs 无需额外类型声明,直接调用 init / startPlay 等方法即可。

uni-app x(uvue)

  • 页面使用 .uvue,语法与 TypeScript 更接近。
  • 可选导入 YtHknetElement 作为预览组件 $refs 的类型。

云台 API 入参说明

以下 4 个云台 API 统一使用对象入参(定义见 utssdk/interface.uts):

类型 字段 说明
PtzPara key 摄像头标识
command 云台 / 镜头命令
speed? 可选,速度 1~7,默认 4
PtzCruisePara key 摄像头标识
route? 可选,巡航路径 1~32,默认 1
point? 可选,巡航点 1~32,默认 1
input? 可选,参数值,默认 1

接入步骤

1. 安装插件

uni_modules/yt-hknet 目录复制到项目的 uni_modules 下,或在 HBuilderX 中导入 uni_modules 插件。

2. 配置 manifest.json

建议 Android 最低 SDK 版本:

"app-android": {
  "distribute": {
    "abiFilters": ["arm64-v8a", "armeabi-v7a"],
    "minSdkVersion": "24"
  }
}

3. 初始化 SDK

App.vue(uni-app)或 App.uvue(uni-app x)的 onLaunch 中调用一次(推荐全局初始化):

// uni-app / uni-app x 通用
import * as HKNet from '@/uni_modules/yt-hknet'

export default {
  onLaunch() {
    HKNet.initSdk(true)   // 调试时传 true 输出 SDK 日志
  }
}

也可在首个业务页面 onLoad 中调用 initSdk,但全局只应初始化一次

4. 引入方式

import * as HKNet from '@/uni_modules/yt-hknet'
  • HKNet:所有 UTS 函数(登录、抓拍、云台等)

uni-app x 可选(预览组件 ref 类型提示):

import { YtHknetElement } from '@/uni_modules/yt-hknet'

典型调用流程

App.onLaunch
  └─ initSdk()

登录页
  └─ login(0, ip, port, user, pass)     → 会话写入 SDK 内部 HCNetConfig

操作页
  ├─ onReady + $nextTick
  │    └─ previewView.init(0)           → 绑定登录会话与 Surface 回调
  ├─ previewView.startPlay(0)           → 0=主码流,1=子码流
  ├─ capturePictureFile(0, path)        → 抓拍(无需预览)
  ├─ ptzStartMove({ key:0, command:21 }) / ptzStopMove({ key:0, command:21 })  → 云台(无需预览)
  └─ logout(0)                          → 退出登录

推荐顺序

  1. initSdk
  2. login
  3. 预览组件 init(key)startPlay(streamType)
  4. 业务操作(抓拍 / 云台)
  5. stopPlay + stopDevPreviewslogout

数值参数对照表

插件 API 与组件方法中涉及的业务数字如下,调用时直接传 number 即可。

摄像头 key(key

多路设备时用不同 key 区分登录会话与预览绑定关系。

数值 说明
0 默认摄像头 / 第一路设备(单设备场景固定传 0
1 第二路设备
2 第三路设备
以此类推

用于:loginlogoutisLogingetDeviceIpstopDevPreviewscapturePictureFile、云台系列 API,以及组件 init(key)

⚠️ isLogin(key)key摄像头标识(如 0),不是预览码流类型 streamType0/1)。


预览码流(streamType

用于组件 startPlay(streamType)switchStream(streamType)

数值 说明
0 主码流,画质高,延迟相对较高
1 子码流,画质较低,延迟更小

云台速度(speed,PtzPara 可选字段)

用于 ptzStartMoveptzStopMovespeed 字段;不传时默认 4

数值 说明
1 ~ 7 云台速度,数值越大越快
4 默认速度(推荐)

云台 / 镜头命令(command,PtzPara 必填字段)

用于 ptzStartMove({ key, command, speed? })ptzStopMove({ key, command, speed? })
按下与抬起必须传相同的 command

镜头控制

数值 说明
11 焦距变大(放大 / ZOOM IN)
12 焦距变小(缩小 / ZOOM OUT)
13 焦点前调
14 焦点后调
15 光圈扩大
16 光圈缩小

方向控制

数值 说明
21 云台上仰
22 云台下俯
23 云台左转
24 云台右转
25 上仰 + 左转
26 上仰 + 右转
27 下俯 + 左转
28 下俯 + 右转
29 左右自动扫描

预置点序号(presetIndex

用于 ptzGotoPresetptzSetPresetptzClearPreset

数值 说明
1 ~ 255 预置点序号,从 1 开始

巡航参数(PtzCruisePara)

用于 ptzStartCruise({ key, route?, point?, input? })ptzStopCruise({ key, route?, point?, input? })(停止时参数须与开始时一致)。

参数 数值范围 默认值 说明
route 1 ~ 32 1 巡航路径序号
point 1 ~ 32 1 巡航点序号
input 视设备而定 1 参数值(预置点 / 时间 / 速度等)

3D 定位坐标

用于 ptzSelZoomInEx(key, xTop, yTop, xBottom, yBottom)
以画面左上角为原点,按 255 归一化

xTop = 选中区域左上角X × 255 / 画面宽度
yTop = 选中区域左上角Y × 255 / 画面高度
xBottom = 选中区域右下角X × 255 / 画面宽度
yBottom = 选中区域右下角Y × 255 / 画面高度
参数 数值范围 说明
xTop 0 ~ 255 框选区域左上角 X
yTop 0 ~ 255 框选区域左上角 Y
xBottom 0 ~ 255 框选区域右下角 X
yBottom 0 ~ 255 框选区域右下角 Y

设备登录端口(port

数值 说明
8000 海康设备 SDK 登录默认端口

API 参考

以下函数均从 @/uni_modules/yt-hknet 导入。单设备场景下 key 一般传 0

SDK 生命周期

initSdk(isLog: boolean): void

初始化海康 SDK。

参数 说明
isLog 是否输出 SDK 日志,调试建议 true
HKNet.initSdk(true)

releaseSdk(): void

释放 SDK 资源,应用退出时调用。

HKNet.releaseSdk()

登录 / 登出

login(key, ip, port, userName, passWord): boolean

登录网络摄像头 / NVR 设备。

参数 类型 说明
key number 摄像头标识,单设备传 0
ip string 设备 IP,如 192.168.1.64
port number 设备端口,默认 8000
userName string 用户名
passWord string 密码

返回值true 登录成功,false 失败。

const ok = HKNet.login(
  0,
  '192.168.1.64',
  8000,
  'admin',
  'your_password'
)

logout(key: number): void

退出指定 key 的登录会话。应先停止预览再 logout。

HKNet.logout(0)

isLogin(key: number): boolean

判断指定 key 是否已登录。

HKNet.isLogin(0)

getDeviceIp(key: number): string | null

获取已登录设备的 IP,未登录返回 null

getDevicePort(key: number): number

获取已登录设备的端口,未登录返回 0

getDeviceUserName(key: number): string | null

获取已登录设备的用户名,未登录返回 null


预览 / 抓拍

预览画面渲染由 <yt-hknet> 组件 负责;以下 API 用于停止预览与抓拍。

stopDevPreviews(key: number): void

停止指定 key 的 SDK 预览句柄(释放 previewId)。
建议与组件的 stopPlay() 同时调用

HKNet.stopDevPreviews(0)

capturePictureFile(key: number, filePath: string): boolean

抓拍当前通道 JPEG 到指定路径。

说明
前提 已登录即可,不依赖预览是否开启
文件 SDK 要求目标文件已存在,建议先用 createCaptureFilePath()
const filePath = HKNet.createCaptureFilePath()
if (filePath != null) {
  const ok = HKNet.capturePictureFile(0, filePath)
}

createCaptureFilePath(): string | null

在应用私有 Pictures 目录创建抓拍文件,返回绝对路径;失败返回 null


云台控制

云台相关 API 登录即可调用,无需开启预览

ptzStartMove(para: PtzPara): boolean

开始云台 / 镜头动作。

字段 类型 说明
key number 摄像头标识,单设备传 0
command number 云台命令,见 云台 / 镜头命令
speed number 可选,传 1~7,默认 4

必须与 ptzStopMove 成对使用:按钮 按下 时 start,抬起 时 stop。

// 模板:上方向键
@touchstart="onPtzTouchStart(21)"
@touchend="onPtzTouchEnd"

// 脚本
onPtzTouchStart(command) {
  HKNet.ptzStartMove({ key: 0, command: command })       // 默认速度 4
  // HKNet.ptzStartMove({ key: 0, command: command, speed: 6 }) // 指定速度 6
  this.currentPtzCommand = command
}
onPtzTouchEnd() {
  if (this.currentPtzCommand >= 0) {
    HKNet.ptzStopMove({ key: 0, command: this.currentPtzCommand })
    this.currentPtzCommand = -1
  }
}

// 放大:command 传 11
HKNet.ptzStartMove({ key: 0, command: 11 })
HKNet.ptzStopMove({ key: 0, command: 11 })

ptzStopMove(para: PtzPara): boolean

停止云台动作。command 须与对应的 ptzStartMove 一致;speed 默认 4

ptzGotoPreset(key, presetIndex): boolean

转到预置点。presetIndex1~255

HKNet.ptzGotoPreset(0, 1)   // 转到预置点 1

ptzSetPreset(key, presetIndex): boolean

将当前云台位置保存为预置点。

HKNet.ptzSetPreset(0, 1)    // 保存为预置点 1

ptzClearPreset(key, presetIndex): boolean

清除指定预置点。

HKNet.ptzClearPreset(0, 1)  // 清除预置点 1

ptzStartCruise(para: PtzCruisePara): boolean

开始巡航。routepointinput 不传时默认均为 1

HKNet.ptzStartCruise({ key: 0, route: 1, point: 1, input: 1 })
// 仅传 key,使用全部默认值
HKNet.ptzStartCruise({ key: 0 })

ptzStopCruise(para: PtzCruisePara): boolean

停止巡航,参数须与 ptzStartCruise 一致。

HKNet.ptzStopCruise({ key: 0, route: 1, point: 1, input: 1 })

ptzRunTrack(key): boolean

开始运行已录制的云台轨迹。

HKNet.ptzRunTrack(0)

ptzSelZoomInEx(key, xTop, yTop, xBottom, yBottom): boolean

3D 定位 / 区域缩放,坐标 0~255,需设备支持。

// 框选区域 (10,20)-(30,40) 放大
HKNet.ptzSelZoomInEx(0, 10, 20, 30, 40)

预览组件 yt-hknet

模板用法

<view class="preview-container">
  <yt-hknet ref="ythknet" class="preview-box"></yt-hknet>
</view>
.preview-container {
  margin-top: 16px;
}
.preview-box {
  width: 100%;
  height: 200px;   /* 必须设置固定高度 */
}

组件方法(通过 ref 调用)

方法 参数 说明
init(key) 摄像头 key,单设备传 0 绑定登录会话,注册 Surface 生命周期回调。须在登录成功后、开始预览前调用
startPlay(streamType) 0 主码流 / 1 子码流 开始实时预览
stopPlay() 停止当前组件上的预览
switchStream(streamType) 0 / 1 播放中切换码流(内部先 stop 再 start)

UTS 调用示例

uni-app(nvue)

import * as HKNet from '@/uni_modules/yt-hknet'

const CAMERA_KEY = 0   // 业务侧自行定义,与 login 时 key 保持一致

getPreviewRef() {
  return this.$refs['ythknet']
}

// 页面 onReady 后初始化(等原生组件挂载完成)
onReady() {
  this.$nextTick(() => {
    this.getPreviewRef()?.init(CAMERA_KEY)
  })
}

// 开始主码流预览
startPreviewMain() {
  const view = this.getPreviewRef()
  if (view == null) return

  view.stopPlay()
  HKNet.stopDevPreviews(CAMERA_KEY)

  view.init(CAMERA_KEY)
  view.startPlay(0)    // 0=主码流
}

uni-app x(uvue,可选类型)

import * as HKNet from '@/uni_modules/yt-hknet'
import { YtHknetElement } from '@/uni_modules/yt-hknet'

const CAMERA_KEY = 0

getPreviewRef(): YtHknetElement | null {
  return this.$refs['ythknet'] as YtHknetElement | null
}

单窗口切换主/子码流

同一 <yt-hknet> 组件即可,无需两个预览窗口:

view.startPlay(0)           // 主码流
view.startPlay(1)           // 子码流
view.switchStream(1)        // 播放中切换到子码流

停止预览:

this.getPreviewRef()?.stopPlay()
HKNet.stopDevPreviews(CAMERA_KEY)

完整示例

登录页

import * as HKNet from '@/uni_modules/yt-hknet'

const CAMERA_KEY = 0

loginDevice() {
  const success = HKNet.login(
    CAMERA_KEY,
    ip.trim(),
    parseInt(port) || 8000,
    username.trim(),
    password.trim()
  )
  if (success) {
    uni.redirectTo({ url: '/pages/operation/operation' })
  }
}

操作页(预览 + 抓拍 + 云台)

参考本仓库 Demo:

页面 说明
pages/login/login.vue 登录并跳转操作页
pages/operation/operation.nvue 预览、抓拍、云台完整示例
pages/index/index.vue 单页集成登录 + 预览(简化 Demo)

操作页核心逻辑:

const CAMERA_KEY = 0

onLoad() {
  if (!HKNet.isLogin(CAMERA_KEY)) {
    uni.redirectTo({ url: '/pages/login/login' })
    return
  }
}

onReady() {
  this.$nextTick(() => {
    this.getPreviewRef()?.init(CAMERA_KEY)
  })
}

onUnload() {
  this.getPreviewRef()?.stopPlay()
  HKNet.stopDevPreviews(CAMERA_KEY)
}

云台方向键示例(对象入参):

onPtzTouchStart(command) {
  HKNet.ptzStartMove({ key: CAMERA_KEY, command: command, speed: 4 })
  this.currentPtzCommand = command
}
onPtzTouchEnd() {
  if (this.currentPtzCommand >= 0) {
    HKNet.ptzStopMove({ key: CAMERA_KEY, command: this.currentPtzCommand, speed: 4 })
    this.currentPtzCommand = -1
  }
}

布局与预览注意事项

原生预览底层为 Android SurfaceView,布局不当会导致有登录、能抓拍,但画面不显示

✅ 推荐做法

  1. <yt-hknet> 设置固定宽高,如 width: 100%; height: 200px
  2. 不要将预览组件放入 scroll-view 内部
  3. 预览按钮、状态文字放在预览组件同级,位于 scroll-view 上方
  4. onReady + $nextTick 中调用 init(),确保原生 View 已挂载
  5. 开始预览前调用 init(key),再 startPlay(streamType)
  6. 停止预览时同时调用 stopPlay() + stopDevPreviews(key)
  7. 页面 onUnload 时停止预览,避免 Surface 销毁后 SDK 仍持有句柄

❌ 避免

  • 预览组件放在 scroll-view
  • 父容器使用 flex: 1scroll-view 与 SurfaceView 同级且可能遮挡
  • 未调用 init() 直接 startPlay()loginBean 未绑定,预览无画面)
  • streamType0/1)误传给 isLogin()(应传摄像头 key,如 0

网络与环境要求

  • 手机需能 TCP 访问 设备 IP:端口(默认 8000),不要求必须同一网段,但需网络路由可达
  • 局域网调试时,建议手机与摄像头在同一网段(如均为 192.168.1.x
  • 注意 访客 WiFi / AP 隔离 导致设备间无法互访
  • 外网访问需公网 IP、端口映射、VPN 或海康/萤石云平台,非 SDK 限制

常见问题

登录失败

  • 检查 IP、端口(8000)、用户名、密码
  • 确认手机能 ping 通或访问设备 IP
  • 检查是否跨网段且无路由(如手机 192.168.9.x,设备 192.168.8.x

能抓拍但预览无画面

  • 确认已调用 previewView.init(0)(或与 login 时相同的 key)
  • 确认在 onReady 之后初始化,而非仅在 onLoad
  • 检查预览组件是否被 scroll-view 遮挡或高度为 0
  • 停止预览后重新开始:stopPlay + stopDevPreviewsinitstartPlay
  • 检查<yt-hknet>标签不能设置背景色,设置了去掉重试。

子码流预览提示未登录

  • isLogin() 的参数必须是摄像头 key(如 0),不能传码流类型 1

云台无响应

  • 确认设备支持 PTZ 且已登录
  • 方向控制须 按下 start、抬起 stop,不能只调 start
  • command 对照 数值参数对照表 确认数字是否正确
  • 预置点序号范围 1~255

多设备

  • 每台设备使用不同 key012…)分别 login
  • 每个预览窗口 init 时传入对应的 key

参考链接


更多好用插件推荐

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: