@video-supply/dahua-player 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +229 -18
- package/README.zh-CN.md +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
# @video-supply/dahua-player
|
|
2
2
|
|
|
3
|
+
- [English](#english)
|
|
4
|
+
- [中文](#zh)
|
|
5
|
+
|
|
6
|
+
<a id="english"></a>
|
|
7
|
+
|
|
8
|
+
## English
|
|
9
|
+
|
|
3
10
|
Dahua (WSPlayer) browser player wrapper. It provides a single entry API:
|
|
4
11
|
|
|
5
12
|
- `DahuaPlayer.init(options)`
|
|
6
13
|
|
|
7
14
|
This package includes Dahua static assets (`wsplayer-gov/`) and copies them into your app's static directory on install.
|
|
8
15
|
|
|
9
|
-
|
|
16
|
+
### Install
|
|
10
17
|
|
|
11
18
|
```bash
|
|
12
19
|
npm i @video-supply/dahua-player
|
|
13
20
|
```
|
|
14
21
|
|
|
15
|
-
|
|
22
|
+
### Quick Start
|
|
16
23
|
|
|
17
24
|
```ts
|
|
18
25
|
import { DahuaPlayer } from '@video-supply/dahua-player';
|
|
@@ -30,7 +37,7 @@ const player = DahuaPlayer.init({
|
|
|
30
37
|
await player.ready;
|
|
31
38
|
```
|
|
32
39
|
|
|
33
|
-
|
|
40
|
+
#### Multi-window / Record helpers
|
|
34
41
|
|
|
35
42
|
```ts
|
|
36
43
|
const player = DahuaPlayer.init({
|
|
@@ -55,9 +62,9 @@ player.sdk.jumpPlayByDateTime('2026-03-01 12:00:00', 0);
|
|
|
55
62
|
player.sdk.setFullScreen();
|
|
56
63
|
```
|
|
57
64
|
|
|
58
|
-
|
|
65
|
+
### API
|
|
59
66
|
|
|
60
|
-
|
|
67
|
+
#### DahuaPlayer.init(options)
|
|
61
68
|
|
|
62
69
|
Required:
|
|
63
70
|
|
|
@@ -88,7 +95,7 @@ Optional:
|
|
|
88
95
|
|
|
89
96
|
Returns: `DahuaPlayerInstance`
|
|
90
97
|
|
|
91
|
-
|
|
98
|
+
#### Instance methods
|
|
92
99
|
|
|
93
100
|
- `ready: Promise<void>`
|
|
94
101
|
- Resolves when WSPlayer initialization is completed (initializationCompleted).
|
|
@@ -103,7 +110,7 @@ Returns: `DahuaPlayerInstance`
|
|
|
103
110
|
- Subscribe/unsubscribe events: `ready` / `play` / `pause` / `error` / `destroy`.
|
|
104
111
|
- `play` payload: `{ mode?: 'real' | 'record' }`.
|
|
105
112
|
|
|
106
|
-
|
|
113
|
+
#### SDK methods (`instance.sdk`)
|
|
107
114
|
|
|
108
115
|
- `getRaw(): any`
|
|
109
116
|
- Returns the underlying WSPlayer/PlayerManager instance (debugging or unwrapped methods).
|
|
@@ -144,7 +151,7 @@ Returns: `DahuaPlayerInstance`
|
|
|
144
151
|
- Fallback to call an underlying WSPlayer method by name.
|
|
145
152
|
- Throws if method is missing.
|
|
146
153
|
|
|
147
|
-
|
|
154
|
+
#### Events
|
|
148
155
|
|
|
149
156
|
- `ready`
|
|
150
157
|
- `play` (payload: `{ mode?: 'real' | 'record' }`)
|
|
@@ -152,11 +159,11 @@ Returns: `DahuaPlayerInstance`
|
|
|
152
159
|
- `error` (payload: `unknown`)
|
|
153
160
|
- `destroy`
|
|
154
161
|
|
|
155
|
-
|
|
162
|
+
### Static assets
|
|
156
163
|
|
|
157
164
|
By default, on installation this package copies:
|
|
158
165
|
|
|
159
|
-
- `node_modules/@
|
|
166
|
+
- `node_modules/@video-supply/dahua-player/wsplayer-gov`
|
|
160
167
|
|
|
161
168
|
to your project:
|
|
162
169
|
|
|
@@ -166,27 +173,231 @@ Then the SDK is loaded from:
|
|
|
166
173
|
|
|
167
174
|
- `/wsplayer-gov/wsplayer.min.js`
|
|
168
175
|
|
|
169
|
-
|
|
176
|
+
#### Disable postinstall copy
|
|
170
177
|
|
|
171
178
|
```bash
|
|
172
179
|
set DAHUA_PLAYER_SKIP_POSTINSTALL=1
|
|
173
|
-
npm i @
|
|
180
|
+
npm i @video-supply/dahua-player
|
|
174
181
|
```
|
|
175
182
|
|
|
176
183
|
Then manually copy:
|
|
177
184
|
|
|
178
|
-
- `node_modules/@
|
|
185
|
+
- `node_modules/@video-supply/dahua-player/wsplayer-gov` → `public/wsplayer-gov`
|
|
179
186
|
|
|
180
|
-
|
|
187
|
+
#### Change public dir
|
|
181
188
|
|
|
182
189
|
```bash
|
|
183
190
|
set DAHUA_PLAYER_PUBLIC_DIR=static
|
|
184
|
-
npm i @
|
|
191
|
+
npm i @video-supply/dahua-player
|
|
185
192
|
```
|
|
186
193
|
|
|
187
|
-
|
|
194
|
+
<a id="zh"></a>
|
|
195
|
+
|
|
196
|
+
## 中文
|
|
197
|
+
|
|
198
|
+
这是对大华 WSPlayer 的轻量封装,提供单入口初始化:
|
|
199
|
+
|
|
200
|
+
- `DahuaPlayer.init(options)`
|
|
201
|
+
|
|
202
|
+
并对外暴露常用的播放/回放/倍速/跳转/全屏/布局切换等能力。
|
|
203
|
+
|
|
204
|
+
### 安装
|
|
188
205
|
|
|
189
206
|
```bash
|
|
190
|
-
|
|
191
|
-
|
|
207
|
+
npm i @video-supply/dahua-player
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 快速开始
|
|
211
|
+
|
|
212
|
+
```ts
|
|
213
|
+
import { DahuaPlayer } from '@video-supply/dahua-player';
|
|
214
|
+
|
|
215
|
+
const player = DahuaPlayer.init({
|
|
216
|
+
container: 'player',
|
|
217
|
+
auth: {
|
|
218
|
+
token: 'YOUR_DAHUA_TOKEN',
|
|
219
|
+
ip: '10.3.156.238',
|
|
220
|
+
port: 8320,
|
|
221
|
+
},
|
|
222
|
+
cameraId: 'YOUR_CAMERA_ID',
|
|
223
|
+
autoPlay: true,
|
|
224
|
+
width: 'auto',
|
|
225
|
+
height: 'auto',
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
await player.ready;
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 初始化参数(DahuaPlayer.init)
|
|
232
|
+
|
|
233
|
+
必填:
|
|
234
|
+
|
|
235
|
+
- `container: HTMLElement | string`
|
|
236
|
+
- `auth: { token: string; ip?: string; port?: number; protocol?: 'http' | 'https' }`
|
|
237
|
+
|
|
238
|
+
字段解释:
|
|
239
|
+
|
|
240
|
+
- `container`
|
|
241
|
+
- 播放器挂载容器
|
|
242
|
+
- `string`:按 DOM id 查找
|
|
243
|
+
- `HTMLElement`:直接使用该元素
|
|
244
|
+
- `auth.token`
|
|
245
|
+
- 鉴权 token(必填)
|
|
246
|
+
- 仅做非空校验;内部通过 sessionStorage shim 注入给 WSPlayer 使用,避免 token 落盘
|
|
247
|
+
- `auth.ip`
|
|
248
|
+
- 现场部署的大华平台 IP(可选)
|
|
249
|
+
- 用于内部拼装 `targetOrigin`,写入 `sessionStorage.wsplayer_origin`,可在网关/nginx 侧用于代理转发
|
|
250
|
+
- `auth.port`
|
|
251
|
+
- 现场部署的大华平台端口(可选)
|
|
252
|
+
- 同上,用于拼装 `targetOrigin`
|
|
253
|
+
- `auth.protocol`
|
|
254
|
+
- 协议(可选):`http` 或 `https`(默认 `https`)
|
|
255
|
+
|
|
256
|
+
播放相关:
|
|
257
|
+
|
|
258
|
+
- `mode?: 'real' | 'record'`
|
|
259
|
+
- 播放模式:实时预览 / 录像回放(默认 `real`)
|
|
260
|
+
- `cameraId?: string`
|
|
261
|
+
- 单通道编码(可选)
|
|
262
|
+
- `cameraIds?: string[]`
|
|
263
|
+
- 多通道编码(可选)
|
|
264
|
+
- 最终实际播放数量会按“当前路数 num”裁剪
|
|
265
|
+
- `autoPlay?: boolean`
|
|
266
|
+
- `true` 时在 `ready` 后自动触发一次播放(默认 `false`)
|
|
267
|
+
- `mode=real` 需要 `cameraId/cameraIds` 至少一个存在
|
|
268
|
+
- `mode=record` 需要 `recordStartTime/recordEndTime` 且 `cameraId/cameraIds` 至少一个存在
|
|
269
|
+
- `recordStartTime?: number`
|
|
270
|
+
- 录像回放开始时间(Unix 秒)
|
|
271
|
+
- 仅 `mode=record + autoPlay=true` 使用
|
|
272
|
+
- `recordEndTime?: number`
|
|
273
|
+
- 录像回放结束时间(Unix 秒)
|
|
274
|
+
- 仅 `mode=record + autoPlay=true` 使用
|
|
275
|
+
- `recordSource?: number`
|
|
276
|
+
- 录像来源(透传给 WSPlayer)
|
|
277
|
+
- 仅 `mode=record + autoPlay=true` 使用
|
|
278
|
+
- `streamType?: 1 | 2 | 3`
|
|
279
|
+
- 码流类型:1 主码流 / 2 辅码流1 / 3 辅码流2(默认 `2`)
|
|
280
|
+
- `searchOnline?: boolean`
|
|
281
|
+
- 是否由组件内部查询在线状态(默认 `false`)
|
|
282
|
+
|
|
283
|
+
布局/显示:
|
|
284
|
+
|
|
285
|
+
- `num?: number`
|
|
286
|
+
- 初始显示路数(默认 `1`)
|
|
287
|
+
- 常用值:`1/4/9/16/25`
|
|
288
|
+
- `maxNum?: number`
|
|
289
|
+
- 最大支持路数(默认 `1`)
|
|
290
|
+
- 上限仍受 WSPlayer 内核与浏览器性能影响
|
|
291
|
+
- `showRecordProgressBar?: boolean`
|
|
292
|
+
- 是否展示录像回放时间轴
|
|
293
|
+
- 未传时:`record` 默认 `true`,`real` 默认 `false`
|
|
294
|
+
- `dblClickFullscreen?: boolean`
|
|
295
|
+
- 是否启用双击切换全屏/退出全屏(默认 `true`)
|
|
296
|
+
|
|
297
|
+
高级:
|
|
298
|
+
|
|
299
|
+
- `staticPath?: string`
|
|
300
|
+
- 静态资源根路径(默认 `/wsplayer-gov`)
|
|
301
|
+
- `sdkUrl?: string`
|
|
302
|
+
- WSPlayer 脚本地址(默认 `/wsplayer-gov/wsplayer.min.js`)
|
|
303
|
+
- `playerOptions?: Record<string, unknown>`
|
|
304
|
+
- 透传给底层 `PlayerManager` 的原始配置(与内部默认配置合并)
|
|
305
|
+
- `debug?: boolean`
|
|
306
|
+
- 是否打印库内部调试日志
|
|
307
|
+
- 回调
|
|
308
|
+
- `onReady`:内核初始化完成(不等同于播放成功)
|
|
309
|
+
- `onPlay`:播放成功(包含 real/record)
|
|
310
|
+
- `onPause`:暂停
|
|
311
|
+
- `onError`:初始化/播放等错误
|
|
312
|
+
- `onDestroy`:销毁
|
|
313
|
+
- `onSdkMessage`:透出 WSPlayer 原始消息(排障用)
|
|
314
|
+
|
|
315
|
+
### 实例与 SDK 方法
|
|
316
|
+
|
|
317
|
+
```ts
|
|
318
|
+
const instance = DahuaPlayer.init(...);
|
|
319
|
+
await instance.ready;
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
- `instance.ready: Promise<void>`
|
|
323
|
+
- 初始化完成后 resolve(对应 WSPlayer 的 initializationCompleted)
|
|
324
|
+
- 只代表内核初始化完成,不代表已经播放成功
|
|
325
|
+
- `instance.pause(): void`
|
|
326
|
+
- 暂停当前播放窗口(默认窗口 0)
|
|
327
|
+
- 语义等价于调用 `instance.sdk.pause()`(库内部做了兼容处理)
|
|
328
|
+
- `instance.destroy(): void`
|
|
329
|
+
- 销毁播放器实例并释放资源
|
|
330
|
+
- 会移除 DOM、清理定时器、释放 sessionStorage shim
|
|
331
|
+
- `instance.on(event, handler) / instance.off(event, handler)`
|
|
332
|
+
- 订阅/取消订阅事件:`ready` / `play` / `pause` / `error` / `destroy`
|
|
333
|
+
- `play` 事件 payload:`{ mode?: 'real' | 'record' }`
|
|
334
|
+
|
|
335
|
+
`instance.sdk`:
|
|
336
|
+
|
|
337
|
+
- `getRaw(): any`
|
|
338
|
+
- 获取底层 WSPlayer/PlayerManager 实例(用于排障或调用未封装能力)
|
|
339
|
+
- `playRealVideo(opt: any): void`
|
|
340
|
+
- 实时预览播放
|
|
341
|
+
- `opt` 透传给底层,同时支持以下通道入参(优先级从高到低):
|
|
342
|
+
- `opt.channelList`(数组:`[{ channelCode: string }, ...]`)
|
|
343
|
+
- `opt.cameraIds` / `opt.cameraId`(内部会转为 channelList)
|
|
344
|
+
- 初始化时的 `cameraIds/cameraId`
|
|
345
|
+
- 多通道时会按当前路数 `num` 自动裁剪(最多播放 `num` 路)
|
|
346
|
+
- `playRecordVideo(opt: any): void`
|
|
347
|
+
- 录像回放播放
|
|
348
|
+
- 通道入参与裁剪规则同 `playRealVideo`
|
|
349
|
+
- 常用字段(透传底层):`startTime/endTime/recordSource`
|
|
350
|
+
- `pause(windowIndex?): void`
|
|
351
|
+
- 暂停指定窗口
|
|
352
|
+
- `windowIndex` 不传时默认暂停当前窗口(底层实现可能按 0 处理)
|
|
353
|
+
- `play(windowIndex?): void`
|
|
354
|
+
- 继续播放指定窗口
|
|
355
|
+
- `close(windowIndex?): void`
|
|
356
|
+
- 关闭指定窗口播放
|
|
357
|
+
- `setPlayerNum(num: number): void`
|
|
358
|
+
- 切换布局路数(例如 1/4/9/16)
|
|
359
|
+
- 变更后多通道播放的最大数量会随之变化(按新路数裁剪)
|
|
360
|
+
- `jumpPlayByDateTime(datetime: string | Date | number, index?: number): void`
|
|
361
|
+
- 录像跳转播放(仅 `mode=record` 可用)
|
|
362
|
+
- `datetime` 支持:
|
|
363
|
+
- `string`:推荐 `YYYY-MM-DD HH:mm:ss`
|
|
364
|
+
- `Date`
|
|
365
|
+
- `number`:时间戳(秒或毫秒,内部会自动兼容)
|
|
366
|
+
- `index`:窗口索引(默认窗口 0)
|
|
367
|
+
- `playSpeed(speed: number, index: number): void`
|
|
368
|
+
- 设置录像回放倍速(仅 `mode=record` 可用)
|
|
369
|
+
- `speed` 支持:`0.125/0.25/0.5/1/1.25/1.5/2/4/8`
|
|
370
|
+
- `index`:窗口索引(通常传 0)
|
|
371
|
+
- `setFullScreen(): void`
|
|
372
|
+
- 设置播放器全屏
|
|
373
|
+
- 优先调用 WSPlayer 内核全屏;如内核不支持,则回退浏览器 Fullscreen API
|
|
374
|
+
- `setExitFullScreen(): void`
|
|
375
|
+
- 退出全屏
|
|
376
|
+
- 优先调用 WSPlayer 内核;如内核不支持,则回退浏览器 Fullscreen API
|
|
377
|
+
- `callRaw(method: string, ...args: any[]): any`
|
|
378
|
+
- 兜底调用底层实例的方法
|
|
379
|
+
- `method` 为底层方法名字符串(不存在会抛出错误)
|
|
380
|
+
|
|
381
|
+
### 录像回放示例(多路 + 跳转 + 倍速)
|
|
382
|
+
|
|
383
|
+
```ts
|
|
384
|
+
const player = DahuaPlayer.init({
|
|
385
|
+
container: 'player',
|
|
386
|
+
auth: { token: 'YOUR_DAHUA_TOKEN' },
|
|
387
|
+
mode: 'record',
|
|
388
|
+
cameraIds: ['ID_1', 'ID_2', 'ID_3', 'ID_4'],
|
|
389
|
+
num: 4,
|
|
390
|
+
maxNum: 16,
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
await player.ready;
|
|
394
|
+
|
|
395
|
+
player.sdk.playRecordVideo({
|
|
396
|
+
startTime: Math.floor(Date.now() / 1000) - 60,
|
|
397
|
+
endTime: Math.floor(Date.now() / 1000),
|
|
398
|
+
recordSource: 2,
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
player.sdk.playSpeed(2, 0);
|
|
402
|
+
player.sdk.jumpPlayByDateTime('2026-03-01 12:00:00', 0);
|
|
192
403
|
```
|
package/README.zh-CN.md
CHANGED