@video-supply/dahua-player 0.1.0

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.
Files changed (119) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +1 -0
  3. package/README.md +192 -0
  4. package/README.zh-CN.md +202 -0
  5. package/dist/bin/copy-assets.cjs +51 -0
  6. package/dist/bin/copy-assets.cjs.map +1 -0
  7. package/dist/index.cjs +1447 -0
  8. package/dist/index.cjs.map +1 -0
  9. package/dist/index.d.cts +157 -0
  10. package/dist/index.d.ts +157 -0
  11. package/dist/index.js +1418 -0
  12. package/dist/index.js.map +1 -0
  13. package/package.json +55 -0
  14. package/wsplayer-gov/Version.xml +4 -0
  15. package/wsplayer-gov/WSPlayer/PlaySDKInterface.js +1 -0
  16. package/wsplayer-gov/WSPlayer/WSPlayer.js +1 -0
  17. package/wsplayer-gov/WSPlayer/audioTalkWorker.js +1 -0
  18. package/wsplayer-gov/WSPlayer/commonThread/libH264Enc.js +21 -0
  19. package/wsplayer-gov/WSPlayer/commonThread/libH264Enc.wasm +0 -0
  20. package/wsplayer-gov/WSPlayer/commonThread/libIVSDrawer.js +21 -0
  21. package/wsplayer-gov/WSPlayer/commonThread/libIVSDrawer.wasm +0 -0
  22. package/wsplayer-gov/WSPlayer/commonThread/libRenderEngine.js +21 -0
  23. package/wsplayer-gov/WSPlayer/commonThread/libRenderEngine.wasm +0 -0
  24. package/wsplayer-gov/WSPlayer/commonThread/libmavasp_litepacket.data +50 -0
  25. package/wsplayer-gov/WSPlayer/commonThread/libmavasp_litepacket.js +21 -0
  26. package/wsplayer-gov/WSPlayer/commonThread/libmavasp_litepacket.wasm +0 -0
  27. package/wsplayer-gov/WSPlayer/icon/RecordHover.svg +13 -0
  28. package/wsplayer-gov/WSPlayer/icon/RecordNormal.svg +13 -0
  29. package/wsplayer-gov/WSPlayer/icon/Recording.svg +15 -0
  30. package/wsplayer-gov/WSPlayer/icon/arrow-b.svg +9 -0
  31. package/wsplayer-gov/WSPlayer/icon/arrow-l.svg +9 -0
  32. package/wsplayer-gov/WSPlayer/icon/arrow-lb.svg +10 -0
  33. package/wsplayer-gov/WSPlayer/icon/arrow-lt.svg +10 -0
  34. package/wsplayer-gov/WSPlayer/icon/arrow-r.svg +9 -0
  35. package/wsplayer-gov/WSPlayer/icon/arrow-rb.svg +10 -0
  36. package/wsplayer-gov/WSPlayer/icon/arrow-rt.svg +10 -0
  37. package/wsplayer-gov/WSPlayer/icon/arrow-t.svg +9 -0
  38. package/wsplayer-gov/WSPlayer/icon/close-all-hover.svg +18 -0
  39. package/wsplayer-gov/WSPlayer/icon/close-all.svg +18 -0
  40. package/wsplayer-gov/WSPlayer/icon/close.svg +16 -0
  41. package/wsplayer-gov/WSPlayer/icon/close_hover.svg +16 -0
  42. package/wsplayer-gov/WSPlayer/icon/default.png +0 -0
  43. package/wsplayer-gov/WSPlayer/icon/draw-triangle_off.svg +14 -0
  44. package/wsplayer-gov/WSPlayer/icon/draw-triangle_off_hover.svg +14 -0
  45. package/wsplayer-gov/WSPlayer/icon/draw-triangle_on.svg +15 -0
  46. package/wsplayer-gov/WSPlayer/icon/draw-triangle_on_hover.svg +15 -0
  47. package/wsplayer-gov/WSPlayer/icon/fullscreen-hover.svg +13 -0
  48. package/wsplayer-gov/WSPlayer/icon/fullscreen.svg +13 -0
  49. package/wsplayer-gov/WSPlayer/icon/more.svg +13 -0
  50. package/wsplayer-gov/WSPlayer/icon/play-h.png +0 -0
  51. package/wsplayer-gov/WSPlayer/icon/play-n.png +0 -0
  52. package/wsplayer-gov/WSPlayer/icon/play-p.png +0 -0
  53. package/wsplayer-gov/WSPlayer/icon/ptz-icon1.svg +4 -0
  54. package/wsplayer-gov/WSPlayer/icon/ptz-icon2.svg +13 -0
  55. package/wsplayer-gov/WSPlayer/icon/ptz-icon3.svg +10 -0
  56. package/wsplayer-gov/WSPlayer/icon/ptz-icon4.svg +10 -0
  57. package/wsplayer-gov/WSPlayer/icon/ptz-icon5.svg +12 -0
  58. package/wsplayer-gov/WSPlayer/icon/ptz-icon6.svg +14 -0
  59. package/wsplayer-gov/WSPlayer/icon/ptz-select-hover.svg +3 -0
  60. package/wsplayer-gov/WSPlayer/icon/ptz-select.svg +3 -0
  61. package/wsplayer-gov/WSPlayer/icon/record_pause.svg +5 -0
  62. package/wsplayer-gov/WSPlayer/icon/record_play.svg +5 -0
  63. package/wsplayer-gov/WSPlayer/icon/screen_1.svg +11 -0
  64. package/wsplayer-gov/WSPlayer/icon/screen_16.svg +18 -0
  65. package/wsplayer-gov/WSPlayer/icon/screen_16_hover.svg +18 -0
  66. package/wsplayer-gov/WSPlayer/icon/screen_1_hover.svg +11 -0
  67. package/wsplayer-gov/WSPlayer/icon/screen_2.svg +18 -0
  68. package/wsplayer-gov/WSPlayer/icon/screen_25.svg +19 -0
  69. package/wsplayer-gov/WSPlayer/icon/screen_25_hover.svg +19 -0
  70. package/wsplayer-gov/WSPlayer/icon/screen_2_hover.svg +18 -0
  71. package/wsplayer-gov/WSPlayer/icon/screen_3.svg +13 -0
  72. package/wsplayer-gov/WSPlayer/icon/screen_3_hover.svg +13 -0
  73. package/wsplayer-gov/WSPlayer/icon/screen_4.svg +12 -0
  74. package/wsplayer-gov/WSPlayer/icon/screen_4_hover.svg +12 -0
  75. package/wsplayer-gov/WSPlayer/icon/screen_6.svg +16 -0
  76. package/wsplayer-gov/WSPlayer/icon/screen_6_hover.svg +16 -0
  77. package/wsplayer-gov/WSPlayer/icon/screen_8.svg +18 -0
  78. package/wsplayer-gov/WSPlayer/icon/screen_8_hover.svg +18 -0
  79. package/wsplayer-gov/WSPlayer/icon/screen_9.svg +17 -0
  80. package/wsplayer-gov/WSPlayer/icon/screen_9_hover.svg +17 -0
  81. package/wsplayer-gov/WSPlayer/icon/screen_custom_division.svg +9 -0
  82. package/wsplayer-gov/WSPlayer/icon/screen_custom_division_hover.svg +9 -0
  83. package/wsplayer-gov/WSPlayer/icon/screen_custom_division_merge.svg +3 -0
  84. package/wsplayer-gov/WSPlayer/icon/screen_custom_division_split.svg +6 -0
  85. package/wsplayer-gov/WSPlayer/icon/screen_more.svg +15 -0
  86. package/wsplayer-gov/WSPlayer/icon/snapshot.svg +38 -0
  87. package/wsplayer-gov/WSPlayer/icon/snapshot_hover.svg +38 -0
  88. package/wsplayer-gov/WSPlayer/icon/speed_left.svg +15 -0
  89. package/wsplayer-gov/WSPlayer/icon/speed_right.svg +15 -0
  90. package/wsplayer-gov/WSPlayer/icon/spread.png +0 -0
  91. package/wsplayer-gov/WSPlayer/icon/talk-off-hover.svg +11 -0
  92. package/wsplayer-gov/WSPlayer/icon/talk-off.svg +11 -0
  93. package/wsplayer-gov/WSPlayer/icon/talk-on.svg +9 -0
  94. package/wsplayer-gov/WSPlayer/icon/voice-have.svg +43 -0
  95. package/wsplayer-gov/WSPlayer/icon/voice-have_hover.svg +43 -0
  96. package/wsplayer-gov/WSPlayer/icon/voice-null.svg +38 -0
  97. package/wsplayer-gov/WSPlayer/icon/voice-null_hover.svg +38 -0
  98. package/wsplayer-gov/WSPlayer/icon/ws-ctrl-ellipsis-hover.svg +14 -0
  99. package/wsplayer-gov/WSPlayer/icon/ws-ctrl-ellipsis.svg +14 -0
  100. package/wsplayer-gov/WSPlayer/locale/lang/en_US.js +123 -0
  101. package/wsplayer-gov/WSPlayer/locale/lang/zh_CN.js +124 -0
  102. package/wsplayer-gov/WSPlayer/locale/localProvider.js +7 -0
  103. package/wsplayer-gov/WSPlayer/locale/locale.js +34 -0
  104. package/wsplayer-gov/WSPlayer/multiThread/libStreamClient.js +21 -0
  105. package/wsplayer-gov/WSPlayer/multiThread/libStreamClient.wasm +0 -0
  106. package/wsplayer-gov/WSPlayer/multiThread/libStreamClient.worker.js +1 -0
  107. package/wsplayer-gov/WSPlayer/multiThread/libplay.data +0 -0
  108. package/wsplayer-gov/WSPlayer/multiThread/libplay.js +1 -0
  109. package/wsplayer-gov/WSPlayer/multiThread/libplay.wasm +0 -0
  110. package/wsplayer-gov/WSPlayer/multiThread/libplay.worker.js +1 -0
  111. package/wsplayer-gov/WSPlayer/player.css +1098 -0
  112. package/wsplayer-gov/WSPlayer/singleThread/VideoDecodeWorker.js +1245 -0
  113. package/wsplayer-gov/WSPlayer/singleThread/libStreamClient.js +21 -0
  114. package/wsplayer-gov/WSPlayer/singleThread/libStreamClient.wasm +0 -0
  115. package/wsplayer-gov/WSPlayer/singleThread/libplay.data +0 -0
  116. package/wsplayer-gov/WSPlayer/singleThread/libplay.js +1 -0
  117. package/wsplayer-gov/WSPlayer/singleThread/libplay.wasm +0 -0
  118. package/wsplayer-gov/WSPlayer/window.division.css +80 -0
  119. package/wsplayer-gov/wsplayer.min.js +6 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ - Initial release: `DahuaPlayer.init(options)` wrapper
6
+ - Built-in `wsplayer-gov` assets with install-time copy to `public/wsplayer-gov`
7
+ - Jest + Puppeteer integration tests
8
+ - Vite example app
9
+
package/LICENSE ADDED
@@ -0,0 +1 @@
1
+ UNLICENSED
package/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # @video-supply/dahua-player
2
+
3
+ Dahua (WSPlayer) browser player wrapper. It provides a single entry API:
4
+
5
+ - `DahuaPlayer.init(options)`
6
+
7
+ This package includes Dahua static assets (`wsplayer-gov/`) and copies them into your app's static directory on install.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm i @video-supply/dahua-player
13
+ ```
14
+
15
+ ## Quick Start
16
+
17
+ ```ts
18
+ import { DahuaPlayer } from '@video-supply/dahua-player';
19
+
20
+ const player = DahuaPlayer.init({
21
+ container: 'player',
22
+ auth: { token: 'YOUR_DAHUA_TOKEN' },
23
+ cameraId: 'YOUR_CAMERA_ID',
24
+ autoPlay: true,
25
+ width: 'auto',
26
+ height: 'auto',
27
+ onError: (e) => console.error(e),
28
+ });
29
+
30
+ await player.ready;
31
+ ```
32
+
33
+ ### Multi-window / Record helpers
34
+
35
+ ```ts
36
+ const player = DahuaPlayer.init({
37
+ container: 'player',
38
+ auth: { token: 'YOUR_DAHUA_TOKEN' },
39
+ mode: 'record',
40
+ cameraIds: ['ID_1', 'ID_2', 'ID_3', 'ID_4'],
41
+ num: 4,
42
+ maxNum: 16,
43
+ });
44
+
45
+ await player.ready;
46
+
47
+ player.sdk.playRecordVideo({
48
+ startTime: Math.floor(Date.now() / 1000) - 60,
49
+ endTime: Math.floor(Date.now() / 1000),
50
+ recordSource: 2,
51
+ });
52
+
53
+ player.sdk.playSpeed(2, 0);
54
+ player.sdk.jumpPlayByDateTime('2026-03-01 12:00:00', 0);
55
+ player.sdk.setFullScreen();
56
+ ```
57
+
58
+ ## API
59
+
60
+ ### DahuaPlayer.init(options)
61
+
62
+ Required:
63
+
64
+ - `container: HTMLElement | string`
65
+ - `auth: { token: string; ip?: string; port?: number; protocol?: 'http' | 'https' }`
66
+
67
+ Optional:
68
+
69
+ - `cameraId?: string` (default `undefined`)
70
+ - `cameraIds?: string[]` (default `undefined`)
71
+ - `auth.ip/auth.port/auth.protocol` are used to generate `targetOrigin` for proxy forwarding
72
+ - `autoPlay?: boolean` (default `false`)
73
+ - `recordStartTime?: number` (unix seconds, required for `mode=record` + `autoPlay`)
74
+ - `recordEndTime?: number` (unix seconds, required for `mode=record` + `autoPlay`)
75
+ - `recordSource?: number` (optional, only for `mode=record` + `autoPlay`)
76
+ - `width?: number | 'auto'` (default `auto`)
77
+ - `height?: number | 'auto'` (default `auto`)
78
+ - `streamType?: 1 | 2 | 3` (default `2`)
79
+ - `searchOnline?: boolean` (default `false`)
80
+ - `num?: number` (initial window count, default `1`)
81
+ - `maxNum?: number` (max window count, default `1`)
82
+ - `showRecordProgressBar?: boolean` (default `true` in `mode=record`, otherwise `false`)
83
+ - `dblClickFullscreen?: boolean` (default `true`)
84
+ - `staticPath?: string` (default `/wsplayer-gov`)
85
+ - `sdkUrl?: string` (default `/wsplayer-gov/wsplayer.min.js`)
86
+ - `debug?: boolean` (default `false`)
87
+ - callbacks: `onReady/onPlay/onPause/onError/onDestroy`
88
+
89
+ Returns: `DahuaPlayerInstance`
90
+
91
+ ### Instance methods
92
+
93
+ - `ready: Promise<void>`
94
+ - Resolves when WSPlayer initialization is completed (initializationCompleted).
95
+ - This does not mean playback has started successfully.
96
+ - `pause(): void`
97
+ - Pauses the current window (defaults to window 0).
98
+ - Equivalent to calling `sdk.pause()` (compat wrapper).
99
+ - `destroy(): void`
100
+ - Destroys the instance and releases resources.
101
+ - Removes DOM nodes, clears timers, and releases sessionStorage shims.
102
+ - `on(event, handler) / off(event, handler)`
103
+ - Subscribe/unsubscribe events: `ready` / `play` / `pause` / `error` / `destroy`.
104
+ - `play` payload: `{ mode?: 'real' | 'record' }`.
105
+
106
+ ### SDK methods (`instance.sdk`)
107
+
108
+ - `getRaw(): any`
109
+ - Returns the underlying WSPlayer/PlayerManager instance (debugging or unwrapped methods).
110
+ - `playRealVideo(opt: any): void`
111
+ - Starts live preview playback.
112
+ - Channel inputs are accepted in the following order:
113
+ - `opt.channelList` (array of `{ channelCode: string }`)
114
+ - `opt.cameraIds` / `opt.cameraId` (converted internally)
115
+ - init `cameraIds/cameraId`
116
+ - Multi-channel playback is capped by current layout (`num`).
117
+ - `playRecordVideo(opt: any): void`
118
+ - Starts record playback.
119
+ - Same channel input and capping rules as `playRealVideo`.
120
+ - Common passthrough fields: `startTime/endTime/recordSource`.
121
+ - `pause(windowIndex?): void`
122
+ - Pauses the given window.
123
+ - `play(windowIndex?): void`
124
+ - Resumes the given window.
125
+ - `close(windowIndex?): void`
126
+ - Closes the given window.
127
+ - `setPlayerNum(num: number): void`
128
+ - Changes layout window count (e.g. 1/4/9/16).
129
+ - The multi-channel cap updates accordingly.
130
+ - `jumpPlayByDateTime(datetime: string | Date | number, index?: number): void`
131
+ - Seeks and plays at the given datetime (record mode only).
132
+ - `datetime` supports `YYYY-MM-DD HH:mm:ss` string, `Date`, or epoch seconds/milliseconds.
133
+ - `index` is the window index (defaults to 0).
134
+ - `playSpeed(speed: number, index: number): void`
135
+ - Sets record playback speed (record mode only).
136
+ - Allowed speeds: `0.125/0.25/0.5/1/1.25/1.5/2/4/8`.
137
+ - `setFullScreen(): void`
138
+ - Enters fullscreen.
139
+ - Prefers WSPlayer core method, falls back to browser Fullscreen API when unavailable.
140
+ - `setExitFullScreen(): void`
141
+ - Exits fullscreen.
142
+ - Prefers WSPlayer core method, falls back to browser Fullscreen API when unavailable.
143
+ - `callRaw(method: string, ...args: any[]): any`
144
+ - Fallback to call an underlying WSPlayer method by name.
145
+ - Throws if method is missing.
146
+
147
+ ### Events
148
+
149
+ - `ready`
150
+ - `play` (payload: `{ mode?: 'real' | 'record' }`)
151
+ - `pause`
152
+ - `error` (payload: `unknown`)
153
+ - `destroy`
154
+
155
+ ## Static assets
156
+
157
+ By default, on installation this package copies:
158
+
159
+ - `node_modules/@company/dahua-player/wsplayer-gov`
160
+
161
+ to your project:
162
+
163
+ - `<INIT_CWD>/public/wsplayer-gov`
164
+
165
+ Then the SDK is loaded from:
166
+
167
+ - `/wsplayer-gov/wsplayer.min.js`
168
+
169
+ ### Disable postinstall copy
170
+
171
+ ```bash
172
+ set DAHUA_PLAYER_SKIP_POSTINSTALL=1
173
+ npm i @company/dahua-player --registry <PRIVATE_REGISTRY>
174
+ ```
175
+
176
+ Then manually copy:
177
+
178
+ - `node_modules/@company/dahua-player/wsplayer-gov` → `public/wsplayer-gov`
179
+
180
+ ### Change public dir
181
+
182
+ ```bash
183
+ set DAHUA_PLAYER_PUBLIC_DIR=static
184
+ npm i @company/dahua-player --registry <PRIVATE_REGISTRY>
185
+ ```
186
+
187
+ ## Release (private registry)
188
+
189
+ ```bash
190
+ set NPM_REGISTRY=<PRIVATE_REGISTRY>
191
+ npm run release:private
192
+ ```
@@ -0,0 +1,202 @@
1
+ # @company/dahua-player(base-player)中文接入文档
2
+
3
+ 这是对大华 WSPlayer 的轻量封装,提供单入口初始化:
4
+
5
+ - `DahuaPlayer.init(options)`
6
+
7
+ 并对外暴露常用的播放/回放/倍速/跳转/全屏/布局切换等能力。
8
+
9
+ ## 快速开始
10
+
11
+ ```ts
12
+ import { DahuaPlayer } from '@video-supply/dahua-player';
13
+
14
+ const player = DahuaPlayer.init({
15
+ container: 'player',
16
+ auth: {
17
+ token: 'YOUR_DAHUA_TOKEN',
18
+ ip: '10.3.156.238',
19
+ port: 8320,
20
+ },
21
+ cameraId: 'YOUR_CAMERA_ID',
22
+ autoPlay: true,
23
+ width: 'auto',
24
+ height: 'auto',
25
+ });
26
+
27
+ await player.ready;
28
+ ```
29
+
30
+ ## 初始化参数(DahuaPlayer.init)
31
+
32
+ 必填:
33
+
34
+ - `container: HTMLElement | string`
35
+ - `auth: { token: string; ip?: string; port?: number; protocol?: 'http' | 'https' }`
36
+
37
+ 字段解释:
38
+
39
+ - `container`
40
+ - 播放器挂载容器
41
+ - `string`:按 DOM id 查找
42
+ - `HTMLElement`:直接使用该元素
43
+ - `auth.token`
44
+ - 鉴权 token(必填)
45
+ - 仅做非空校验;内部通过 sessionStorage shim 注入给 WSPlayer 使用,避免 token 落盘
46
+ - `auth.ip`
47
+ - 现场部署的大华平台 IP(可选)
48
+ - 用于内部拼装 `targetOrigin`,写入 `sessionStorage.wsplayer_origin`,可在网关/nginx 侧用于代理转发
49
+ - `auth.port`
50
+ - 现场部署的大华平台端口(可选)
51
+ - 同上,用于拼装 `targetOrigin`
52
+ - `auth.protocol`
53
+ - 协议(可选):`http` 或 `https`(默认 `https`)
54
+
55
+ 播放相关:
56
+
57
+ - `mode?: 'real' | 'record'`
58
+ - 播放模式:实时预览 / 录像回放(默认 `real`)
59
+ - `cameraId?: string`
60
+ - 单通道编码(可选)
61
+ - `cameraIds?: string[]`
62
+ - 多通道编码(可选)
63
+ - 最终实际播放数量会按“当前路数 num”裁剪
64
+ - `autoPlay?: boolean`
65
+ - `true` 时在 `ready` 后自动触发一次播放(默认 `false`)
66
+ - `mode=real` 需要 `cameraId/cameraIds` 至少一个存在
67
+ - `mode=record` 需要 `recordStartTime/recordEndTime` 且 `cameraId/cameraIds` 至少一个存在
68
+ - `recordStartTime?: number`
69
+ - 录像回放开始时间(Unix 秒)
70
+ - 仅 `mode=record + autoPlay=true` 使用
71
+ - `recordEndTime?: number`
72
+ - 录像回放结束时间(Unix 秒)
73
+ - 仅 `mode=record + autoPlay=true` 使用
74
+ - `recordSource?: number`
75
+ - 录像来源(透传给 WSPlayer)
76
+ - 仅 `mode=record + autoPlay=true` 使用
77
+ - `streamType?: 1 | 2 | 3`
78
+ - 码流类型:1 主码流 / 2 辅码流1 / 3 辅码流2(默认 `2`)
79
+ - `searchOnline?: boolean`
80
+ - 是否由组件内部查询在线状态(默认 `false`)
81
+
82
+ 布局/显示:
83
+
84
+ - `num?: number`
85
+ - 初始显示路数(默认 `1`)
86
+ - 常用值:`1/4/9/16/25`
87
+ - `maxNum?: number`
88
+ - 最大支持路数(默认 `1`)
89
+ - 上限仍受 WSPlayer 内核与浏览器性能影响
90
+ - `showRecordProgressBar?: boolean`
91
+ - 是否展示录像回放时间轴
92
+ - 未传时:`record` 默认 `true`,`real` 默认 `false`
93
+ - `dblClickFullscreen?: boolean`
94
+ - 是否启用双击切换全屏/退出全屏(默认 `true`)
95
+
96
+ 高级:
97
+
98
+ - `staticPath?: string`
99
+ - 静态资源根路径(默认 `/wsplayer-gov`)
100
+ - `sdkUrl?: string`
101
+ - WSPlayer 脚本地址(默认 `/wsplayer-gov/wsplayer.min.js`)
102
+ - `playerOptions?: Record<string, unknown>`
103
+ - 透传给底层 `PlayerManager` 的原始配置(与内部默认配置合并)
104
+ - `debug?: boolean`
105
+ - 是否打印库内部调试日志
106
+ - 回调
107
+ - `onReady`:内核初始化完成(不等同于播放成功)
108
+ - `onPlay`:播放成功(包含 real/record)
109
+ - `onPause`:暂停
110
+ - `onError`:初始化/播放等错误
111
+ - `onDestroy`:销毁
112
+ - `onSdkMessage`:透出 WSPlayer 原始消息(排障用)
113
+
114
+ ## 实例与 SDK 方法
115
+
116
+ ```ts
117
+ const instance = DahuaPlayer.init(...);
118
+ await instance.ready;
119
+ ```
120
+
121
+ - `instance.ready: Promise<void>`
122
+ - 初始化完成后 resolve(对应 WSPlayer 的 initializationCompleted)
123
+ - 只代表内核初始化完成,不代表已经播放成功
124
+ - `instance.pause(): void`
125
+ - 暂停当前播放窗口(默认窗口 0)
126
+ - 语义等价于调用 `instance.sdk.pause()`(库内部做了兼容处理)
127
+ - `instance.destroy(): void`
128
+ - 销毁播放器实例并释放资源
129
+ - 会移除 DOM、清理定时器、释放 sessionStorage shim
130
+ - `instance.on(event, handler) / instance.off(event, handler)`
131
+ - 订阅/取消订阅事件:`ready` / `play` / `pause` / `error` / `destroy`
132
+ - `play` 事件 payload:`{ mode?: 'real' | 'record' }`
133
+
134
+ `instance.sdk`:
135
+
136
+ - `getRaw(): any`
137
+ - 获取底层 WSPlayer/PlayerManager 实例(用于排障或调用未封装能力)
138
+ - `playRealVideo(opt: any): void`
139
+ - 实时预览播放
140
+ - `opt` 透传给底层,同时支持以下通道入参(优先级从高到低):
141
+ - `opt.channelList`(数组:`[{ channelCode: string }, ...]`)
142
+ - `opt.cameraIds` / `opt.cameraId`(内部会转为 channelList)
143
+ - 初始化时的 `cameraIds/cameraId`
144
+ - 多通道时会按当前路数 `num` 自动裁剪(最多播放 `num` 路)
145
+ - `playRecordVideo(opt: any): void`
146
+ - 录像回放播放
147
+ - 通道入参与裁剪规则同 `playRealVideo`
148
+ - 常用字段(透传底层):`startTime/endTime/recordSource`
149
+ - `pause(windowIndex?): void`
150
+ - 暂停指定窗口
151
+ - `windowIndex` 不传时默认暂停当前窗口(底层实现可能按 0 处理)
152
+ - `play(windowIndex?): void`
153
+ - 继续播放指定窗口
154
+ - `close(windowIndex?): void`
155
+ - 关闭指定窗口播放
156
+ - `setPlayerNum(num: number): void`
157
+ - 切换布局路数(例如 1/4/9/16)
158
+ - 变更后多通道播放的最大数量会随之变化(按新路数裁剪)
159
+ - `jumpPlayByDateTime(datetime: string | Date | number, index?: number): void`
160
+ - 录像跳转播放(仅 `mode=record` 可用)
161
+ - `datetime` 支持:
162
+ - `string`:推荐 `YYYY-MM-DD HH:mm:ss`
163
+ - `Date`
164
+ - `number`:时间戳(秒或毫秒,内部会自动兼容)
165
+ - `index`:窗口索引(默认窗口 0)
166
+ - `playSpeed(speed: number, index: number): void`
167
+ - 设置录像回放倍速(仅 `mode=record` 可用)
168
+ - `speed` 支持:`0.125/0.25/0.5/1/1.25/1.5/2/4/8`
169
+ - `index`:窗口索引(通常传 0)
170
+ - `setFullScreen(): void`
171
+ - 设置播放器全屏
172
+ - 优先调用 WSPlayer 内核全屏;如内核不支持,则回退浏览器 Fullscreen API
173
+ - `setExitFullScreen(): void`
174
+ - 退出全屏
175
+ - 优先调用 WSPlayer 内核;如内核不支持,则回退浏览器 Fullscreen API
176
+ - `callRaw(method: string, ...args: any[]): any`
177
+ - 兜底调用底层实例的方法
178
+ - `method` 为底层方法名字符串(不存在会抛出错误)
179
+
180
+ ## 录像回放示例(多路 + 跳转 + 倍速)
181
+
182
+ ```ts
183
+ const player = DahuaPlayer.init({
184
+ container: 'player',
185
+ auth: { token: 'YOUR_DAHUA_TOKEN' },
186
+ mode: 'record',
187
+ cameraIds: ['ID_1', 'ID_2', 'ID_3', 'ID_4'],
188
+ num: 4,
189
+ maxNum: 16,
190
+ });
191
+
192
+ await player.ready;
193
+
194
+ player.sdk.playRecordVideo({
195
+ startTime: Math.floor(Date.now() / 1000) - 60,
196
+ endTime: Math.floor(Date.now() / 1000),
197
+ recordSource: 2,
198
+ });
199
+
200
+ player.sdk.playSpeed(2, 0);
201
+ player.sdk.jumpPlayByDateTime('2026-03-01 12:00:00', 0);
202
+ ```
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+
25
+ // src/bin/copy-assets.ts
26
+ var import_node_fs = __toESM(require("fs"), 1);
27
+ var import_node_path = __toESM(require("path"), 1);
28
+ function resolveInitCwd() {
29
+ const initCwd = process.env.INIT_CWD;
30
+ if (initCwd && initCwd.trim()) return initCwd.trim();
31
+ return process.cwd();
32
+ }
33
+ function ensureDir(dir) {
34
+ import_node_fs.default.mkdirSync(dir, { recursive: true });
35
+ }
36
+ function copyDir(src, dest) {
37
+ if (!import_node_fs.default.existsSync(src)) return;
38
+ ensureDir(import_node_path.default.dirname(dest));
39
+ import_node_fs.default.cpSync(src, dest, { recursive: true, force: true });
40
+ }
41
+ function main() {
42
+ if (process.env.DAHUA_PLAYER_SKIP_POSTINSTALL === "1") return;
43
+ const pkgRoot = import_node_path.default.resolve(__dirname, "..", "..");
44
+ const srcDir = import_node_path.default.join(pkgRoot, "wsplayer-gov");
45
+ const initCwd = resolveInitCwd();
46
+ const publicDir = process.env.DAHUA_PLAYER_PUBLIC_DIR?.trim() || "public";
47
+ const destDir = import_node_path.default.join(initCwd, publicDir, "wsplayer-gov");
48
+ copyDir(srcDir, destDir);
49
+ }
50
+ main();
51
+ //# sourceMappingURL=copy-assets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/bin/copy-assets.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nfunction resolveInitCwd() {\n const initCwd = process.env.INIT_CWD;\n if (initCwd && initCwd.trim()) return initCwd.trim();\n return process.cwd();\n}\n\nfunction ensureDir(dir: string) {\n fs.mkdirSync(dir, { recursive: true });\n}\n\nfunction copyDir(src: string, dest: string) {\n if (!fs.existsSync(src)) return;\n ensureDir(path.dirname(dest));\n fs.cpSync(src, dest, { recursive: true, force: true });\n}\n\nfunction main() {\n if (process.env.DAHUA_PLAYER_SKIP_POSTINSTALL === '1') return;\n\n const pkgRoot = path.resolve(__dirname, '..', '..');\n const srcDir = path.join(pkgRoot, 'wsplayer-gov');\n const initCwd = resolveInitCwd();\n const publicDir = process.env.DAHUA_PLAYER_PUBLIC_DIR?.trim() || 'public';\n const destDir = path.join(initCwd, publicDir, 'wsplayer-gov');\n\n copyDir(srcDir, destDir);\n}\n\nmain();\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qBAAe;AACf,uBAAiB;AAEjB,SAAS,iBAAiB;AACxB,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,WAAW,QAAQ,KAAK,EAAG,QAAO,QAAQ,KAAK;AACnD,SAAO,QAAQ,IAAI;AACrB;AAEA,SAAS,UAAU,KAAa;AAC9B,iBAAAA,QAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC;AAEA,SAAS,QAAQ,KAAa,MAAc;AAC1C,MAAI,CAAC,eAAAA,QAAG,WAAW,GAAG,EAAG;AACzB,YAAU,iBAAAC,QAAK,QAAQ,IAAI,CAAC;AAC5B,iBAAAD,QAAG,OAAO,KAAK,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACvD;AAEA,SAAS,OAAO;AACd,MAAI,QAAQ,IAAI,kCAAkC,IAAK;AAEvD,QAAM,UAAU,iBAAAC,QAAK,QAAQ,WAAW,MAAM,IAAI;AAClD,QAAM,SAAS,iBAAAA,QAAK,KAAK,SAAS,cAAc;AAChD,QAAM,UAAU,eAAe;AAC/B,QAAM,YAAY,QAAQ,IAAI,yBAAyB,KAAK,KAAK;AACjE,QAAM,UAAU,iBAAAA,QAAK,KAAK,SAAS,WAAW,cAAc;AAE5D,UAAQ,QAAQ,OAAO;AACzB;AAEA,KAAK;","names":["fs","path"]}