@ray-js/ray-ipc-player 2.0.30 → 2.1.0-beta.1

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.
@@ -0,0 +1,319 @@
1
+ import "core-js/modules/es.json.stringify.js";
2
+ import { useCallback } from 'react';
3
+ import { useMemoizedFn } from 'ahooks';
4
+ import { publishDps, showToast, performanceEvent, getCurrentPages } from '@ray-js/ray';
5
+ import Strings from '../i18n';
6
+ import { getIsConnected, getIsOnPreview, getDpIdByDpCode, ipcTTTOperatorLog } from '../utils';
7
+ /**
8
+ * 播放器连接相关逻辑的自定义 hook
9
+ */
10
+ export const usePlayerConnection = _ref => {
11
+ let {
12
+ devId,
13
+ ipcCtx,
14
+ playState,
15
+ setPlayState,
16
+ setVideoErrCode,
17
+ onChangeStreamStatus,
18
+ onInitPreview,
19
+ playerRoute,
20
+ privateState,
21
+ isLowPowerDevice,
22
+ awakeStatus,
23
+ wirelessFlag,
24
+ setEnableWakeUpInterval,
25
+ setLowPrivateOutTimeFlag,
26
+ setMqttPrivateFlag,
27
+ privateLowPowerDeviceTimeOutRef,
28
+ privateWakeOutTimeRef,
29
+ firstPreviewTimeRef,
30
+ retryCount,
31
+ muteRef,
32
+ setMuted
33
+ } = _ref;
34
+ /**
35
+ * 获取当前页面路由
36
+ */
37
+ const getPlayerRoute = useCallback(() => {
38
+ const pages = getCurrentPages(); // 获取当前页面栈
39
+ const currentPage = pages[pages.length - 1]; // 获取当前页面实例
40
+ return currentPage.route;
41
+ }, []);
42
+
43
+ /**
44
+ * 重试连接
45
+ */
46
+ const _retry = useCallback(async () => {
47
+ console.log('调用了重试');
48
+ ipcTTTOperatorLog('VID: ipcCtx.isConnected');
49
+ const connectState = await getIsConnected(ipcCtx.current);
50
+ console.log('调用了重试--connectState');
51
+ const isOnPreview = await getIsOnPreview(ipcCtx.current);
52
+ console.log('调用了重试--isOnPreview');
53
+ setPlayState(d => {
54
+ d.connectState = !!connectState;
55
+ d.errorMsg = '';
56
+ d.errorState = false;
57
+ d.loadingState = !isOnPreview;
58
+ });
59
+ setVideoErrCode('');
60
+ ipcTTTOperatorLog("VID: start_create_p2p_connect");
61
+ ipcCtx.current && createConnect();
62
+ }, [ipcCtx, setPlayState, setVideoErrCode]);
63
+
64
+ /**
65
+ * 无需关心连接状态直接发起重新连接
66
+ */
67
+ const _reConnect = useCallback(() => {
68
+ console.log('不在播放器路由内, 不进行标记');
69
+ // 排除默认值为"",不等于播放器路由时, 不进行连接操作
70
+ if (playerRoute !== '' && playerRoute !== getPlayerRoute()) {
71
+ return;
72
+ }
73
+ setPlayState(d => {
74
+ d.connectState = true;
75
+ d.loadingText = Strings.getLang('ipc_player_get_video_stream');
76
+ d.errorMsg = '';
77
+ d.errorState = false;
78
+ d.loadingState = true;
79
+ });
80
+ setVideoErrCode('');
81
+ ipcTTTOperatorLog("VID: start_create_p2p_connect");
82
+ ipcCtx.current && createConnect();
83
+ }, [playerRoute, getPlayerRoute, setPlayState, setVideoErrCode, ipcCtx]);
84
+
85
+ /**
86
+ * 关闭隐私模式,重新拉流
87
+ */
88
+ const handleReWakeCamera = useCallback(async () => {
89
+ setPlayState(d => {
90
+ d.connectState = true;
91
+ d.errorMsg = '';
92
+ d.loadingText = Strings.getLang('ipc_player_private_open_stream');
93
+ d.errorState = false;
94
+ d.loadingState = true;
95
+ });
96
+ setVideoErrCode('');
97
+ const sendDpId = await getDpIdByDpCode(devId, 'basic_private');
98
+ if (sendDpId === -1) {
99
+ showToast(Strings.getLang('ipc_player_basic_private_not_exist'));
100
+ } else {
101
+ publishDps({
102
+ deviceId: devId,
103
+ dps: {
104
+ [sendDpId]: false
105
+ },
106
+ mode: 1,
107
+ pipelines: [0, 1, 2, 3, 4, 5, 6],
108
+ options: {},
109
+ success: () => {
110
+ console.log('下发隐私模式成功');
111
+ }
112
+ });
113
+ }
114
+ }, [devId, setPlayState, setVideoErrCode]);
115
+
116
+ /**
117
+ * 低功耗设备关闭隐私模式,先判断设备是否唤醒,唤醒后才可下发隐私模式DP
118
+ */
119
+ const handleReWakeCameraLowPowerDevice = useMemoizedFn(() => {
120
+ setVideoErrCode('');
121
+ setLowPrivateOutTimeFlag(false);
122
+ if (awakeStatus) {
123
+ setPlayState(d => {
124
+ d.connectState = true;
125
+ d.errorMsg = '';
126
+ d.loadingText = Strings.getLang('ipc_player_private_open_stream');
127
+ d.errorState = false;
128
+ d.loadingState = true;
129
+ });
130
+ // 如果值为true, 表示设备为唤醒状态,直接下发隐私模式DP
131
+ handleReWakeCamera();
132
+ } else {
133
+ setPlayState(d => {
134
+ d.connectState = true;
135
+ d.errorMsg = '';
136
+ d.loadingText = Strings.getLang('ipc_player_private_open_low_stream');
137
+ d.errorState = false;
138
+ d.loadingState = true;
139
+ });
140
+ // 如果值为false, 表示设备为睡眠状态,需要唤醒设备
141
+ setMqttPrivateFlag(true);
142
+ setEnableWakeUpInterval(true);
143
+ // 2秒后停止下发唤醒, 防止频繁唤醒, 此时若Mqtt监听到1协议,也会停止下发唤醒
144
+ privateLowPowerDeviceTimeOutRef.current = setTimeout(() => {
145
+ setEnableWakeUpInterval(false);
146
+ // 清除定时器
147
+ privateLowPowerDeviceTimeOutRef.current && clearTimeout(privateLowPowerDeviceTimeOutRef.current);
148
+ }, 2000);
149
+
150
+ // 15 秒后若设备还是未唤醒,未监听到Mqtt消息以及唤醒Dp上报, 则提示报错
151
+ privateWakeOutTimeRef.current = setTimeout(() => {
152
+ // 清除定时器
153
+ privateLowPowerDeviceTimeOutRef.current && clearTimeout(privateWakeOutTimeRef.current);
154
+ setPlayState(d => {
155
+ d.connectState = false;
156
+ d.errorMsg = Strings.getLang('ipc_player_private_open_low_stream_fail');
157
+ d.errorState = true;
158
+ d.loadingState = false;
159
+ });
160
+ setMqttPrivateFlag(false);
161
+ setLowPrivateOutTimeFlag(true);
162
+ }, 15000);
163
+ }
164
+ });
165
+
166
+ /**
167
+ * 建立连接
168
+ */
169
+ const createConnect = useMemoizedFn(async params => {
170
+ var _ipcCtx$current;
171
+ if (playerRoute !== '' && playerRoute !== getPlayerRoute()) {
172
+ console.log('不在播放器路由内, 不进行连接操作');
173
+ return;
174
+ }
175
+ // 若走到连接状态,需清除低功耗15秒超时定时
176
+ privateLowPowerDeviceTimeOutRef.current && clearTimeout(privateWakeOutTimeRef.current);
177
+ setLowPrivateOutTimeFlag(false);
178
+ // 表示为 149 低功耗设备, 唤醒设备
179
+ if (isLowPowerDevice) {
180
+ // 下发唤醒
181
+ setEnableWakeUpInterval(true);
182
+ }
183
+ (_ipcCtx$current = ipcCtx.current) === null || _ipcCtx$current === void 0 || _ipcCtx$current.connect({
184
+ success: () => {
185
+ ipcTTTOperatorLog("VID: create_p2p_connect_success");
186
+ // 清除唤醒定时器
187
+ setEnableWakeUpInterval(false);
188
+ setPlayState(d => {
189
+ d.connectState = true;
190
+ d.loadingText = Strings.getLang('ipc_player_get_video_stream');
191
+ d.errorState = false;
192
+ d.errorMsg = '';
193
+ });
194
+ onChangeStreamStatus && onChangeStreamStatus(1001);
195
+ ipcTTTOperatorLog("VID: start_to_preview");
196
+ startPreview(params);
197
+ },
198
+ fail: () => {
199
+ // 清除唤醒定时器
200
+ setEnableWakeUpInterval(false);
201
+ ipcTTTOperatorLog("VID: create_p2p_connect_failure");
202
+ // 针对进入面板上报149状态的为true的设备直接忽略
203
+ if (!wirelessFlag) {
204
+ setPlayState(d => {
205
+ d.connectState = false;
206
+ d.errorState = true;
207
+ d.errorMsg = Strings.getLang('ipc_player_connect_fail');
208
+ d.loadingState = false;
209
+ });
210
+ onChangeStreamStatus && onChangeStreamStatus(-1001);
211
+ }
212
+ }
213
+ });
214
+ });
215
+
216
+ /**
217
+ * 开启预览
218
+ */
219
+ const startPreview = useMemoizedFn(params => {
220
+ var _ipcCtx$current2;
221
+ (_ipcCtx$current2 = ipcCtx.current) === null || _ipcCtx$current2 === void 0 || _ipcCtx$current2.startPreview({
222
+ success: () => {
223
+ ipcTTTOperatorLog('VID: start_preview_success');
224
+ if (typeof performanceEvent === 'function' && !firstPreviewTimeRef.current) {
225
+ performanceEvent({
226
+ launchData: '出流成功耗时',
227
+ success: () => {
228
+ firstPreviewTimeRef.current = true;
229
+ }
230
+ });
231
+ }
232
+ setPlayState(d => {
233
+ d.loadingState = false;
234
+ d.errorState = false;
235
+ d.errorMsg = '';
236
+ });
237
+ setMuted(muteRef.current);
238
+ params && onInitPreview && onInitPreview(devId);
239
+ onChangeStreamStatus && onChangeStreamStatus(1002);
240
+ },
241
+ fail: async e => {
242
+ ipcTTTOperatorLog("VID: start_preview_fail: ".concat(JSON.stringify(e)));
243
+ const isOnPreview = await getIsOnPreview(ipcCtx.current);
244
+ ipcTTTOperatorLog("VID: get_is_on_preview_status_".concat(isOnPreview));
245
+ if (isOnPreview || e !== null && e !== void 0 && e.errorMsg.includes('doing preview')) {
246
+ // 忽略重复预览异常的报错
247
+ setPlayState(d => {
248
+ d.loadingState = false;
249
+ d.errorState = false;
250
+ d.errorMsg = '';
251
+ });
252
+ setMuted(muteRef.current);
253
+ onChangeStreamStatus && onChangeStreamStatus(1002);
254
+ return;
255
+ }
256
+ // 针对进入到面板,接收到上报为设备休眠的情况直接忽略
257
+ if (!wirelessFlag) {
258
+ setPlayState(d => {
259
+ d.errorState = true;
260
+ d.loadingState = false;
261
+ d.errorMsg = Strings.getLang('ipc_player_preview_fail');
262
+ });
263
+ onChangeStreamStatus && onChangeStreamStatus(-1002);
264
+ }
265
+ }
266
+ });
267
+ });
268
+
269
+ /**
270
+ * 暂停预览
271
+ */
272
+ const stopPreview = useCallback(() => {
273
+ var _ipcCtx$current3;
274
+ ipcTTTOperatorLog("VID: begin_to_stop_preview");
275
+ ipcTTTOperatorLog("VID: set_mute_is_true");
276
+ setMuted(true);
277
+ (_ipcCtx$current3 = ipcCtx.current) === null || _ipcCtx$current3 === void 0 || _ipcCtx$current3.stopPreview({
278
+ success: () => {
279
+ ipcTTTOperatorLog("VID: stop_preview_success");
280
+ },
281
+ fail: e => {
282
+ ipcTTTOperatorLog("VID: stop_preview_failure: ".concat(JSON.stringify(e)));
283
+ }
284
+ });
285
+ }, [ipcCtx, setMuted]);
286
+
287
+ /**
288
+ * 断开连接
289
+ */
290
+ const disconnect = useCallback(() => {
291
+ return new Promise((resolve, reject) => {
292
+ var _ipcCtx$current4;
293
+ (_ipcCtx$current4 = ipcCtx.current) === null || _ipcCtx$current4 === void 0 || _ipcCtx$current4.disconnect({
294
+ success: res => {
295
+ resolve(res);
296
+ setPlayState(d => {
297
+ d.connectState = false;
298
+ });
299
+ onChangeStreamStatus && onChangeStreamStatus(1009);
300
+ },
301
+ fail: e => {
302
+ reject(e);
303
+ onChangeStreamStatus && onChangeStreamStatus(-1009);
304
+ }
305
+ });
306
+ });
307
+ }, [ipcCtx, setPlayState, onChangeStreamStatus]);
308
+ return {
309
+ _retry,
310
+ _reConnect,
311
+ createConnect,
312
+ startPreview,
313
+ stopPreview,
314
+ disconnect,
315
+ handleReWakeCamera,
316
+ handleReWakeCameraLowPowerDevice,
317
+ getPlayerRoute
318
+ };
319
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 处理播放器 props 解构的自定义 hook
3
+ */
4
+ export declare const usePlayerProps: any;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * 处理播放器 props 解构的自定义 hook
3
+ */
4
+ export const usePlayerProps = props => {
5
+ const {
6
+ updateLayout = '',
7
+ devId = '',
8
+ objectFit = 'contain',
9
+ onChangeStreamStatus,
10
+ onPlayerTap,
11
+ onZoomChange,
12
+ onCameraPreviewFailure,
13
+ onCameraNotifyWeakNetwork,
14
+ onInitPreview,
15
+ defaultMute = true,
16
+ onlineStatus = true,
17
+ loadText = '',
18
+ rotateZ = 0,
19
+ scalable = true,
20
+ scaleMultiple = 0,
21
+ ptzControllable = true,
22
+ clarity = 'normal',
23
+ ipcPlayerContext,
24
+ onCtx,
25
+ playerStyle = {
26
+ borderRadius: 0,
27
+ bgColor: '#000000',
28
+ borderStyle: 'solid',
29
+ borderColor: '',
30
+ borderWidth: 0
31
+ },
32
+ privateState = false,
33
+ extend = {},
34
+ brandColor = '#FF592A',
35
+ renderErrIcon,
36
+ isShare = false,
37
+ onPlayerContainerTap,
38
+ reConnect = false,
39
+ awakeStatus = undefined,
40
+ ignoreHideStopPreview = false,
41
+ onChangeIgnoreHideStopPreview,
42
+ hideSuggestedText = false,
43
+ hideHelpButton = false,
44
+ hideFeedBackButton = false,
45
+ playerRoute = '',
46
+ defaultAutoPlay = true,
47
+ limitFlow = false
48
+ } = props;
49
+
50
+ // 解构 playerStyle
51
+ const {
52
+ borderRadius,
53
+ bgColor,
54
+ borderStyle,
55
+ borderColor,
56
+ borderWidth
57
+ } = playerStyle;
58
+
59
+ // 计算衍生状态
60
+ const isLowPowerDevice = awakeStatus !== undefined;
61
+ return {
62
+ // 基础配置
63
+ updateLayout,
64
+ devId,
65
+ objectFit,
66
+ defaultMute,
67
+ onlineStatus,
68
+ loadText,
69
+ rotateZ,
70
+ scalable,
71
+ scaleMultiple,
72
+ ptzControllable,
73
+ clarity,
74
+ ipcPlayerContext,
75
+ privateState,
76
+ extend,
77
+ brandColor,
78
+ isShare,
79
+ reConnect,
80
+ awakeStatus,
81
+ ignoreHideStopPreview,
82
+ hideSuggestedText,
83
+ hideHelpButton,
84
+ hideFeedBackButton,
85
+ playerRoute,
86
+ defaultAutoPlay,
87
+ limitFlow,
88
+ // 样式相关
89
+ borderRadius,
90
+ bgColor,
91
+ borderStyle,
92
+ borderColor,
93
+ borderWidth,
94
+ // 计算属性
95
+ isLowPowerDevice,
96
+ // 回调函数
97
+ onChangeStreamStatus,
98
+ onPlayerTap,
99
+ onZoomChange,
100
+ onCameraPreviewFailure,
101
+ onCameraNotifyWeakNetwork,
102
+ onInitPreview,
103
+ onCtx,
104
+ renderErrIcon,
105
+ onPlayerContainerTap,
106
+ onChangeIgnoreHideStopPreview
107
+ };
108
+ };
@@ -127,6 +127,10 @@ declare const _default: kit.I18N<{
127
127
  ipc_sim_err_system: string;
128
128
  ipc_sim_err_of_traffic: string;
129
129
  ipc_player_traffic_load_online_zero_tip: string;
130
+ ipc_player_traffic_load_offline_limit_tip: string;
131
+ ipc_player_recharge_flow_btn: string;
132
+ ipc_player_sleep_tip: string;
133
+ ipc_player_open_sleep_mode: string;
130
134
  };
131
135
  zh: {
132
136
  ipc_player_get_video_stream: string;
@@ -255,6 +259,10 @@ declare const _default: kit.I18N<{
255
259
  ipc_player_sim_err_system: string;
256
260
  ipc_player_sim_err_of_traffic: string;
257
261
  ipc_player_traffic_load_online_zero_tip: string;
262
+ ipc_player_traffic_load_offline_limit_tip: string;
263
+ ipc_player_recharge_flow_btn: string;
264
+ ipc_player_sleep_tip: string;
265
+ ipc_player_open_sleep_mode: string;
258
266
  };
259
267
  }, {
260
268
  ipc_player_get_video_stream: string;
@@ -383,6 +391,10 @@ declare const _default: kit.I18N<{
383
391
  ipc_sim_err_system: string;
384
392
  ipc_sim_err_of_traffic: string;
385
393
  ipc_player_traffic_load_online_zero_tip: string;
394
+ ipc_player_traffic_load_offline_limit_tip: string;
395
+ ipc_player_recharge_flow_btn: string;
396
+ ipc_player_sleep_tip: string;
397
+ ipc_player_open_sleep_mode: string;
386
398
  } | {
387
399
  ipc_player_get_video_stream: string;
388
400
  ipc_player_private_open_stream: string;
@@ -510,5 +522,9 @@ declare const _default: kit.I18N<{
510
522
  ipc_player_sim_err_system: string;
511
523
  ipc_player_sim_err_of_traffic: string;
512
524
  ipc_player_traffic_load_online_zero_tip: string;
525
+ ipc_player_traffic_load_offline_limit_tip: string;
526
+ ipc_player_recharge_flow_btn: string;
527
+ ipc_player_sleep_tip: string;
528
+ ipc_player_open_sleep_mode: string;
513
529
  }>;
514
530
  export default _default;
@@ -126,6 +126,10 @@ declare const _default: {
126
126
  ipc_sim_err_system: string;
127
127
  ipc_sim_err_of_traffic: string;
128
128
  ipc_player_traffic_load_online_zero_tip: string;
129
+ ipc_player_traffic_load_offline_limit_tip: string;
130
+ ipc_player_recharge_flow_btn: string;
131
+ ipc_player_sleep_tip: string;
132
+ ipc_player_open_sleep_mode: string;
129
133
  };
130
134
  zh: {
131
135
  ipc_player_get_video_stream: string;
@@ -254,6 +258,10 @@ declare const _default: {
254
258
  ipc_player_sim_err_system: string;
255
259
  ipc_player_sim_err_of_traffic: string;
256
260
  ipc_player_traffic_load_online_zero_tip: string;
261
+ ipc_player_traffic_load_offline_limit_tip: string;
262
+ ipc_player_recharge_flow_btn: string;
263
+ ipc_player_sleep_tip: string;
264
+ ipc_player_open_sleep_mode: string;
257
265
  };
258
266
  };
259
267
  export default _default;
@@ -137,7 +137,11 @@ export default {
137
137
  // 4G流量
138
138
  ipc_sim_err_system: 'System freezes',
139
139
  ipc_sim_err_of_traffic: 'The current device has no data, please recharge first',
140
- ipc_player_traffic_load_online_zero_tip: 'Insufficient traffic, Please recharge in time'
140
+ ipc_player_traffic_load_online_zero_tip: 'Insufficient traffic, Please recharge in time',
141
+ ipc_player_traffic_load_offline_limit_tip: 'Device offline. Please top up 4G data.',
142
+ ipc_player_recharge_flow_btn: 'Top up',
143
+ ipc_player_sleep_tip: 'The device is in sleep mode',
144
+ ipc_player_open_sleep_mode: 'Open'
141
145
  },
142
146
  zh: {
143
147
  ipc_player_get_video_stream: '正在获取视频流',
@@ -277,6 +281,10 @@ export default {
277
281
  // 4G流量
278
282
  ipc_player_sim_err_system: '系统冻结',
279
283
  ipc_player_sim_err_of_traffic: '当前设备已无流量,请尽快充值',
280
- ipc_player_traffic_load_online_zero_tip: '可用流量额度不足,已关闭视频流,请及时充值流量'
284
+ ipc_player_traffic_load_online_zero_tip: '可用流量额度不足,已关闭视频流,请及时充值流量',
285
+ ipc_player_traffic_load_offline_limit_tip: '设备已离线,请及时充值4G流量',
286
+ ipc_player_recharge_flow_btn: '去充值',
287
+ ipc_player_sleep_tip: '设备处于休眠中',
288
+ ipc_player_open_sleep_mode: '开启'
281
289
  }
282
290
  };