@cloud-app-dev/vidc 3.0.17 → 3.0.19

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 (78) hide show
  1. package/.umirc.ts +1 -1
  2. package/es/CustomRenderSelect/index.d.ts +1 -1
  3. package/es/CustomRenderSelect/index.js +3 -3
  4. package/es/LoaderScript/utils.js +1 -0
  5. package/es/Map/LevelCenter/DragMarker/index.d.ts +1 -4
  6. package/es/Map/LevelCenter/DragMarker/index.js +2 -5
  7. package/es/Map/LevelCenter/index.js +13 -2
  8. package/es/Map/SinglePoint/index.d.ts +10 -3
  9. package/es/Map/SinglePoint/index.js +37 -15
  10. package/es/Map/hook/useMapEvent.js +9 -8
  11. package/es/Map/index.d.ts +1 -1
  12. package/es/Player/api/index.d.ts +5 -1
  13. package/es/Player/api/index.js +36 -24
  14. package/es/Player/context.d.ts +21 -0
  15. package/es/Player/context.js +16 -0
  16. package/es/Player/contraller_bar/contraller_event.d.ts +1 -4
  17. package/es/Player/contraller_bar/contraller_event.js +37 -28
  18. package/es/Player/contraller_bar/index.d.ts +2 -7
  19. package/es/Player/contraller_bar/index.js +4 -12
  20. package/es/Player/contraller_bar/left_bar.d.ts +2 -7
  21. package/es/Player/contraller_bar/left_bar.js +29 -33
  22. package/es/Player/contraller_bar/right_bar.d.ts +1 -6
  23. package/es/Player/contraller_bar/right_bar.js +6 -3
  24. package/es/Player/contraller_bar/time.d.ts +3 -0
  25. package/es/Player/contraller_bar/time.js +34 -0
  26. package/es/Player/contraller_bar/useBarStatus.js +17 -24
  27. package/es/Player/contraller_bar/volume.d.ts +9 -0
  28. package/es/Player/contraller_bar/volume.js +86 -0
  29. package/es/Player/demo.js +5 -1
  30. package/es/Player/event/errorEvent.js +34 -43
  31. package/es/Player/event/eventName.d.ts +17 -2
  32. package/es/Player/event/eventName.js +5 -1
  33. package/es/Player/event/index.d.ts +2 -0
  34. package/es/Player/event/index.js +55 -3
  35. package/es/Player/fps_play.d.ts +11 -0
  36. package/es/Player/fps_play.js +99 -0
  37. package/es/Player/frontend_player.js +0 -2
  38. package/es/Player/frontend_timeline.d.ts +1 -5
  39. package/es/Player/frontend_timeline.js +14 -11
  40. package/es/Player/live_heart.js +1 -1
  41. package/es/Player/message.js +69 -84
  42. package/es/Player/player.d.ts +15 -15
  43. package/es/Player/segment_player.js +12 -29
  44. package/es/Player/segment_timeline.d.ts +1 -6
  45. package/es/Player/segment_timeline.js +56 -11
  46. package/es/Player/single_player.js +80 -35
  47. package/es/Player/style/bar.css +2 -1
  48. package/es/Player/style/iconfont.js +15 -16
  49. package/es/Player/style/index.css +8 -0
  50. package/es/Player/style/timeline.css +7 -0
  51. package/es/Player/style/volume.css +19 -0
  52. package/es/Player/timeline.d.ts +1 -1
  53. package/es/Player/timeline.js +26 -37
  54. package/es/Player/util.d.ts +2 -1
  55. package/es/Player/util.js +10 -6
  56. package/es/ScreenPlayer/Live.js +0 -1
  57. package/es/ScreenPlayer/LiveTools.js +7 -27
  58. package/es/ScreenPlayer/PlayerWithExt.d.ts +1 -1
  59. package/es/ScreenPlayer/PlayerWithExt.js +2 -4
  60. package/es/ScreenPlayer/Record.js +0 -1
  61. package/es/ScreenPlayer/RecordTools.js +31 -16
  62. package/es/ScreenPlayer/ScreenSelect.js +2 -2
  63. package/es/ScreenPlayer/TimeMode.js +1 -1
  64. package/es/ScreenPlayer/demo2.js +1 -1
  65. package/es/ScreenPlayer/index.css +17 -8
  66. package/es/ScreenPlayer/utils.js +4 -4
  67. package/es/index.d.ts +1 -0
  68. package/es/index.js +1 -0
  69. package/es/useRafInterval/index.d.ts +5 -0
  70. package/es/useRafInterval/index.js +94 -0
  71. package/icon-fix.js +31 -0
  72. package/package.json +1 -1
  73. package/es/Map/SinglePoint/Marker/index.d.ts +0 -7
  74. package/es/Map/SinglePoint/Marker/index.js +0 -29
  75. package/es/Player/event/browserTabEvent.d.ts +0 -9
  76. package/es/Player/event/browserTabEvent.js +0 -57
  77. package/es/ScreenPlayer/TimeSlider.d.ts +0 -129
  78. package/es/ScreenPlayer/TimeSlider.js +0 -556
@@ -0,0 +1,99 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+
5
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
6
+
7
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
8
+
9
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
10
+
11
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
+
13
+ import React, { useEffect, useMemo, useRef, useState } from 'react';
14
+ import Events from './event/eventName';
15
+ import useRafInterval from '../useRafInterval';
16
+ import { useRegisterPlayerEvent } from './event';
17
+ import { getDomStyleValue } from './util';
18
+ var oneFps = 1 / 30;
19
+
20
+ function FPSPlay(_ref) {
21
+ var api = _ref.api,
22
+ event = _ref.event,
23
+ fpsDelay = _ref.fpsDelay,
24
+ fps = _ref.fps;
25
+
26
+ var _useState = useState(Date.now()),
27
+ _useState2 = _slicedToArray(_useState, 2),
28
+ forceKey = _useState2[0],
29
+ update = _useState2[1];
30
+
31
+ var ref = useRef(null);
32
+ var timerRef = useRef(null);
33
+ var fps_second = useMemo(function () {
34
+ return fps ? 1 / fps : oneFps;
35
+ }, [fps]);
36
+ useEffect(function () {
37
+ var fpsCapture = function fpsCapture() {
38
+ if (!ref.current || !event.video) {
39
+ return;
40
+ }
41
+
42
+ var video = event.video;
43
+ var fpsTime = api.getCurrentTime() + fps_second;
44
+ video.currentTime = fpsTime;
45
+
46
+ if (video.currentTime >= api.getDuration()) {
47
+ clearInterval(timerRef.current);
48
+ video.currentTime = 0;
49
+ event.emit(Events.PLAY_ENDED);
50
+ }
51
+
52
+ var canvas = ref.current;
53
+ var ctx = canvas.getContext('2d');
54
+
55
+ var _video$getBoundingCli = video.getBoundingClientRect(),
56
+ width = _video$getBoundingCli.width,
57
+ height = _video$getBoundingCli.height;
58
+
59
+ canvas.width = width;
60
+ canvas.height = height;
61
+ var fit = getDomStyleValue(video, 'object-fit');
62
+
63
+ if (fit === 'fill') {
64
+ //全画面绘制,存在拉伸
65
+ ctx.drawImage(video, 0, 0, width, height);
66
+ } else {
67
+ // 自适应绘制
68
+ var videoWidth = video.videoWidth;
69
+ var videoHeight = video.videoHeight;
70
+ var scale = height / videoHeight;
71
+ var s_vw = scale * videoWidth;
72
+ var paddingSize = (width - s_vw) / 2;
73
+ ctx.drawImage(video, paddingSize, 0, s_vw, height);
74
+ }
75
+ };
76
+
77
+ fpsCapture();
78
+ timerRef.current = setInterval(fpsCapture, fpsDelay);
79
+ return function () {
80
+ clearInterval(timerRef.current);
81
+ };
82
+ }, [api, event, fpsDelay, forceKey, fps_second]);
83
+ useRegisterPlayerEvent(Events.CANVAS_PAUSE, function () {
84
+ clearInterval(timerRef.current);
85
+ });
86
+ useRegisterPlayerEvent(Events.CANVAS_PLAY, function () {
87
+ update(Date.now());
88
+ }); // TODO: 未知情况,video会自动播放,轮训检测并暂停零时解决
89
+
90
+ useRafInterval(function () {
91
+ return !api.paused ? api.pause() : null;
92
+ }, 10);
93
+ return /*#__PURE__*/React.createElement("canvas", {
94
+ className: "fps-play-canvas",
95
+ ref: ref
96
+ });
97
+ }
98
+
99
+ export default FPSPlay;
@@ -50,8 +50,6 @@ function FrontendPlayer(_a) {
50
50
  url: url,
51
51
  onSeek: onSeek,
52
52
  begin: begin,
53
- api: api,
54
- event: event,
55
53
  duration: duration
56
54
  });
57
55
  return /*#__PURE__*/React.createElement(SinglePlayer, Object.assign({
@@ -1,15 +1,11 @@
1
1
  /// <reference types="react" />
2
- import type Api from './api';
3
- import type VideoEventInstance from './event';
4
2
  import './style/timeline.less';
5
3
  interface ITimeLineProps {
6
- api: Api;
7
- event: VideoEventInstance;
8
4
  duration: number;
9
5
  begin: number;
10
6
  end: number;
11
7
  onSeek?: (time: number) => void;
12
8
  url?: string;
13
9
  }
14
- declare function FrontendTimeLine({ api, event, duration, begin, end, onSeek, url }: ITimeLineProps): JSX.Element;
10
+ declare function FrontendTimeLine({ duration, begin, end, onSeek, url }: ITimeLineProps): JSX.Element;
15
11
  export default FrontendTimeLine;
@@ -1,4 +1,4 @@
1
- import _useTrackedEffect from "ahooks/es/useTrackedEffect";
1
+ import _useUpdateEffect from "ahooks/es/useUpdateEffect";
2
2
 
3
3
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
4
 
@@ -12,21 +12,25 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
12
12
 
13
13
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
14
 
15
- import React, { useCallback, useEffect, useMemo, useState, startTransition, useRef } from 'react';
15
+ import React, { useCallback, useEffect, useMemo, useState, startTransition, useRef, useContext } from 'react';
16
16
  import useBarStatus from './contraller_bar/useBarStatus';
17
17
  import { useTimes } from './timeline';
18
18
  import { FMT } from './util';
19
19
  import moment from 'moment';
20
+ import { Context } from './context';
20
21
  import "./style/timeline.css";
21
22
 
22
23
  function FrontendTimeLine(_ref) {
23
- var api = _ref.api,
24
- event = _ref.event,
25
- duration = _ref.duration,
24
+ var duration = _ref.duration,
26
25
  begin = _ref.begin,
27
26
  end = _ref.end,
28
27
  onSeek = _ref.onSeek,
29
28
  url = _ref.url;
29
+
30
+ var _useContext = useContext(Context),
31
+ api = _useContext.api,
32
+ event = _useContext.event;
33
+
30
34
  var lastSeekCTimeRef = useRef(0); // time 是记录seek时跳了多少
31
35
 
32
36
  var _useState = useState({
@@ -43,13 +47,12 @@ function FrontendTimeLine(_ref) {
43
47
 
44
48
  var _useTimes = useTimes(api, event),
45
49
  _useTimes2 = _slicedToArray(_useTimes, 1),
46
- currentTime = _useTimes2[0];
50
+ currentTime = _useTimes2[0]; // eslint-disable-next-line no-sequences
47
51
 
48
- _useTrackedEffect(function (changes) {
49
- if (changes.includes(1)) {
50
- lastSeekCTimeRef.current = currentTime;
51
- }
52
- }, [currentTime, url]);
52
+
53
+ _useUpdateEffect(function () {
54
+ return lastSeekCTimeRef.current = currentTime, undefined;
55
+ }, [currentTime]);
53
56
 
54
57
  var rTime = useMemo(function () {
55
58
  return state.time + currentTime + lastSeekCTimeRef.current;
@@ -14,7 +14,7 @@ function useLiveHeart(_ref) {
14
14
  var cTimeRef = useRef(null);
15
15
 
16
16
  var run = function run() {
17
- if (!isLive && documentVisibility !== 'visible') {
17
+ if (!isLive || documentVisibility !== 'visible') {
18
18
  return;
19
19
  }
20
20
 
@@ -10,8 +10,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
10
10
 
11
11
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
12
 
13
- import React, { useEffect, useState, useMemo, useRef } from 'react';
13
+ import React, { useState, useMemo, useRef } from 'react';
14
14
  import IconFont from './iconfont';
15
+ import { useRegisterPlayerEvent, useVideoEvent } from './event';
15
16
  import EventName from './event/eventName';
16
17
  import "./style/message.css";
17
18
 
@@ -42,99 +43,83 @@ function VideoMessage(_ref) {
42
43
 
43
44
  return '';
44
45
  }, [state.errorTimer, state.status]);
45
- useEffect(function () {
46
- var openLoading = function openLoading() {
47
- clearTimeout(timeRef.current);
48
- timeRef.current = setTimeout(function () {
49
- return setState(function (old) {
50
- return Object.assign(Object.assign({}, old), {
51
- loading: true
52
- });
53
- });
54
- }, 200);
55
- };
56
46
 
57
- var closeLoading = function closeLoading() {
58
- clearTimeout(timeRef.current);
59
- setState(function (old) {
47
+ var openLoading = function openLoading() {
48
+ clearTimeout(timeRef.current);
49
+ timeRef.current = setTimeout(function () {
50
+ return setState(function (old) {
60
51
  return Object.assign(Object.assign({}, old), {
61
- loading: false
52
+ loading: true
62
53
  });
63
54
  });
64
- };
65
-
66
- var errorReload = function errorReload(timer) {
67
- clearTimeout(timeRef.current);
68
- setState(function () {
69
- return {
70
- status: 'reload',
71
- errorTimer: timer,
72
- loading: true
73
- };
55
+ }, 200);
56
+ };
57
+
58
+ var closeLoading = function closeLoading() {
59
+ clearTimeout(timeRef.current);
60
+ setState(function (old) {
61
+ return Object.assign(Object.assign({}, old), {
62
+ loading: false
74
63
  });
75
- };
76
-
77
- var reloadFail = function reloadFail() {
78
- return setState(function (old) {
79
- return Object.assign(Object.assign({}, old), {
80
- status: 'fail'
81
- });
64
+ });
65
+ };
66
+
67
+ var errorReload = function errorReload(timer) {
68
+ clearTimeout(timeRef.current);
69
+ setState(function () {
70
+ return {
71
+ status: 'reload',
72
+ errorTimer: timer,
73
+ loading: true
74
+ };
75
+ });
76
+ };
77
+
78
+ var reloadFail = function reloadFail() {
79
+ return setState(function (old) {
80
+ return Object.assign(Object.assign({}, old), {
81
+ status: 'fail'
82
82
  });
83
- };
83
+ });
84
+ };
84
85
 
85
- var reloadSuccess = function reloadSuccess() {
86
- return setState(function (old) {
87
- return Object.assign(Object.assign({}, old), {
88
- status: null
89
- });
86
+ var reloadSuccess = function reloadSuccess() {
87
+ return setState(function (old) {
88
+ return Object.assign(Object.assign({}, old), {
89
+ status: null
90
90
  });
91
- };
92
-
93
- var reload = function reload() {
94
- return setState(function (old) {
95
- return Object.assign(Object.assign({}, old), {
96
- status: 'reload',
97
- loading: true
98
- });
91
+ });
92
+ };
93
+
94
+ var reload = function reload() {
95
+ return setState(function (old) {
96
+ return Object.assign(Object.assign({}, old), {
97
+ status: 'reload',
98
+ loading: true
99
99
  });
100
- };
101
-
102
- var playEnd = function playEnd() {
103
- clearTimeout(timeRef.current);
104
- setState(function (old) {
105
- return Object.assign(Object.assign({}, old), {
106
- status: null,
107
- loading: false
108
- });
100
+ });
101
+ };
102
+
103
+ var playEnd = function playEnd() {
104
+ clearTimeout(timeRef.current);
105
+ setState(function (old) {
106
+ return Object.assign(Object.assign({}, old), {
107
+ status: null,
108
+ loading: false
109
109
  });
110
- api.pause();
111
- };
112
-
113
- event.addEventListener('loadstart', openLoading); // event.addEventListener('waiting', openLoading);
114
- // event.addEventListener('seeking', openLoading)
115
-
116
- event.addEventListener('loadeddata', closeLoading);
117
- event.addEventListener('canplay', closeLoading);
118
- event.on(EventName.ERROR_RELOAD, errorReload);
119
- event.on(EventName.RELOAD_FAIL, reloadFail);
120
- event.on(EventName.RELOAD_SUCCESS, reloadSuccess);
121
- event.on(EventName.RELOAD, reload);
122
- event.on(EventName.HISTORY_PLAY_END, playEnd);
123
- event.on(EventName.CLEAR_ERROR_TIMER, reloadSuccess);
124
- return function () {
125
- event.removeEventListener('loadstart', openLoading); // event.removeEventListener('waiting', openLoading);
126
- // event.removeEventListener('seeking', openLoading)
127
-
128
- event.removeEventListener('loadeddata', closeLoading);
129
- event.removeEventListener('canplay', closeLoading);
130
- event.off(EventName.ERROR_RELOAD, errorReload);
131
- event.off(EventName.RELOAD_FAIL, reloadFail);
132
- event.off(EventName.RELOAD_SUCCESS, reloadSuccess);
133
- event.off(EventName.RELOAD, reload);
134
- event.off(EventName.HISTORY_PLAY_END, playEnd);
135
- event.off(EventName.CLEAR_ERROR_TIMER, reloadSuccess);
136
- };
137
- }, [api, event]);
110
+ });
111
+ api.pause();
112
+ };
113
+
114
+ useVideoEvent('loadstart', openLoading);
115
+ useVideoEvent('loadeddata', closeLoading);
116
+ useVideoEvent('canplay', closeLoading);
117
+ useRegisterPlayerEvent(EventName.ERROR_RELOAD, errorReload);
118
+ useRegisterPlayerEvent(EventName.RELOAD_FAIL, reloadFail);
119
+ useRegisterPlayerEvent(EventName.RELOAD_SUCCESS, reloadSuccess);
120
+ useRegisterPlayerEvent(EventName.RELOAD, reload);
121
+ useRegisterPlayerEvent(EventName.HISTORY_PLAY_END, playEnd);
122
+ useRegisterPlayerEvent(EventName.CLEAR_ERROR_TIMER, reloadSuccess);
138
123
  var loading = state.loading,
139
124
  status = state.status;
140
125
  return /*#__PURE__*/React.createElement("div", {
@@ -132,6 +132,21 @@ export interface ISinglePlayerProps {
132
132
  * 自定义播放器的事件
133
133
  */
134
134
  playerEvents?: CustomEvent[];
135
+
136
+ /**
137
+ * 开启单帧播放
138
+ */
139
+ oneFpsPlay?: boolean;
140
+
141
+ /**
142
+ * 获取视频针的频次 (ms)
143
+ */
144
+ fpsDelay?: number;
145
+
146
+ /**
147
+ * 视频每秒多少帧,用于控制逐帧播放
148
+ */
149
+ fps?: number;
135
150
  }
136
151
 
137
152
  export interface IFrontendPlayerProps extends Omit<ISinglePlayerProps, 'isLive' | 'reload'> {
@@ -173,21 +188,6 @@ export const SinglePlayer: React.FunctionComponent<ISinglePlayerProps>;
173
188
  export const FrontendPlayer: React.FunctionComponent<IFrontendPlayerProps>;
174
189
  export const SegmentPlayer: React.FunctionComponent<ISegmentPlayerProps>;
175
190
 
176
- export interface EventName {
177
- RELOAD: 'reload'; //手动视频重载
178
- RELOAD_FAIL: 'reloadFail'; // 视频出错,重连失败
179
- RELOAD_SUCCESS: 'reloadSuccess'; //视频出错,重连成功
180
- ERROR: 'error'; //视频出错
181
- ERROR_RELOAD: 'errorRload'; //视频出错,自动重连
182
- HISTORY_PLAY_END: 'historyPlayEnd'; //历史视频列表播放结束
183
- SEEK: 'seek'; //跳跃播放时间
184
- TRANSFORM: 'transform'; //视频容器缩放
185
- CHANGE_PLAY_INDEX: 'changePlayIndex'; //历史视频列表播放索引改变
186
- HIDE_CONTRALLER: 'hideContraller';
187
- SHOW_CONTRALLER: 'showContraller';
188
- CLEAR_ERROR_TIMER: 'clearErrorTimer';
189
- }
190
-
191
191
  export type EventInfo = {
192
192
  type: string;
193
193
  listener: ((...args: any) => void)[];
@@ -1,14 +1,6 @@
1
1
  import _useUpdate from "ahooks/es/useUpdate";
2
2
  import _useLatest from "ahooks/es/useLatest";
3
3
 
4
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
5
-
6
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
-
8
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
9
-
10
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
11
-
12
4
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
13
5
 
14
6
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -26,13 +18,14 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
26
18
  import SinglePlayer from './single_player';
27
19
  import SegmentTimeLine from './segment_timeline';
28
20
  import Events from './event/eventName';
29
-
21
+ import { useRegisterPlayerEvent, useVideoEvent } from './event';
30
22
  /**
31
23
  * @desc 计算第一个url
32
24
  * @param segments
33
25
  * @param defaultIndex
34
26
  * @returns
35
27
  */
28
+
36
29
  function getFirstUrlIndex(segments) {
37
30
  var defaultIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
38
31
 
@@ -94,24 +87,16 @@ function usePlayIndex(event, segments) {
94
87
  }
95
88
  }, [segments, state.index]); // 监听片段播放状态,自动跳转下一个片段
96
89
 
97
- useEffect(function () {
98
- if (!event) {
99
- return undefined;
100
- }
101
-
102
- var fn = function fn() {
103
- return setState(function (old) {
104
- return Object.assign(Object.assign({}, old), {
105
- index: old.index + 1 < segments.length ? old.index + 1 : old.index
106
- });
90
+ var endHandle = function endHandle() {
91
+ return setState(function (old) {
92
+ return Object.assign(Object.assign({}, old), {
93
+ index: old.index + 1 < segments.length ? old.index + 1 : old.index
107
94
  });
108
- };
95
+ });
96
+ };
109
97
 
110
- event.addEventListener('ended', fn);
111
- return function () {
112
- return event.removeEventListener('ended', fn);
113
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
114
- }, [event, segments].concat(_toConsumableArray(deps)));
98
+ useVideoEvent('ended', endHandle, event);
99
+ useRegisterPlayerEvent(Events.PLAY_ENDED, endHandle, event);
115
100
  return {
116
101
  index: state.index,
117
102
  setIndex: function setIndex(i) {
@@ -214,13 +199,10 @@ function SegmentPlayer(_a) {
214
199
  var hasReady = api && event;
215
200
  var timeline = customTimeLine !== null && customTimeLine !== void 0 ? customTimeLine : /*#__PURE__*/React.createElement(SegmentTimeLine, {
216
201
  begin: begin,
217
- api: api,
218
- event: event,
219
202
  seekTo: seekTo,
220
203
  index: index,
221
204
  segments: segments,
222
- duration: duration,
223
- setIndex: setIndex
205
+ duration: duration
224
206
  });
225
207
  var onInit = useCallback(function () {
226
208
  update();
@@ -229,6 +211,7 @@ function SegmentPlayer(_a) {
229
211
  return /*#__PURE__*/React.createElement(SinglePlayer, Object.assign({
230
212
  ref: playRef,
231
213
  url: url,
214
+ isLive: false,
232
215
  onCanPlayerInit: onInit,
233
216
  reload: reload,
234
217
  extActions: {
@@ -1,17 +1,12 @@
1
1
  /// <reference types="react" />
2
- import type Api from './api';
3
- import type VideoEventInstance from './event';
4
2
  import type { ISegmentType } from './player';
5
3
  import './style/timeline.less';
6
4
  interface ITimeLineProps {
7
- api: Api;
8
- event: VideoEventInstance;
9
5
  index: number;
10
6
  segments: ISegmentType[];
11
7
  duration: number;
12
- setIndex: (i: number) => void;
13
8
  begin: number;
14
9
  seekTo: (time: number) => void;
15
10
  }
16
- declare function SegmentTimeLine({ api, event, index, segments, duration, begin, setIndex, seekTo }: ITimeLineProps): JSX.Element;
11
+ declare function SegmentTimeLine({ index, segments, duration, begin, seekTo }: ITimeLineProps): JSX.Element;
17
12
  export default SegmentTimeLine;
@@ -13,25 +13,39 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
13
13
 
14
14
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
15
15
 
16
- import React, { useCallback, useMemo } from 'react';
16
+ import React, { startTransition, useCallback, useContext, useMemo, useState } from 'react';
17
17
  import { useTimes } from './timeline';
18
18
  import useBarStatus from './contraller_bar/useBarStatus';
19
19
  import moment from 'moment';
20
20
  import { FMT } from './util';
21
+ import { Context } from './context';
21
22
  import "./style/timeline.css";
22
23
 
23
24
  function SegmentTimeLine(_ref) {
24
- var api = _ref.api,
25
- event = _ref.event,
26
- index = _ref.index,
25
+ var index = _ref.index,
27
26
  segments = _ref.segments,
28
27
  duration = _ref.duration,
29
28
  begin = _ref.begin,
30
- setIndex = _ref.setIndex,
31
29
  seekTo = _ref.seekTo;
30
+
31
+ var _useState = useState({
32
+ time: 0,
33
+ markTime: 0,
34
+ left: -1,
35
+ visible: false
36
+ }),
37
+ _useState2 = _slicedToArray(_useState, 2),
38
+ state = _useState2[0],
39
+ setState = _useState2[1];
40
+
41
+ var _useContext = useContext(Context),
42
+ api = _useContext.api,
43
+ event = _useContext.event,
44
+ isFpsPlay = _useContext.isFpsPlay;
45
+
32
46
  var status = useBarStatus(event);
33
47
 
34
- var _useTimes = useTimes(api, event),
48
+ var _useTimes = useTimes(api, event, isFpsPlay),
35
49
  _useTimes2 = _slicedToArray(_useTimes, 2),
36
50
  currentTime = _useTimes2[0],
37
51
  buffered = _useTimes2[1];
@@ -62,9 +76,31 @@ function SegmentTimeLine(_ref) {
62
76
  var duration = segments[i].endTime - segments[i].beginTime;
63
77
  var currentTime = current / rect.width * duration;
64
78
  seekTo(Math.round(currentTime + pTime));
65
- }, [segments, api, index, setIndex]);
79
+ }, [segments, begin, seekTo]);
80
+ var onLineMouseOver = useCallback(function (e) {
81
+ var rect = e.currentTarget.getBoundingClientRect();
82
+ var left = e.pageX - rect.left;
83
+ var mTime = left / rect.width * duration;
84
+ setState(function (old) {
85
+ return Object.assign(Object.assign({}, old), {
86
+ left: left,
87
+ markTime: begin + mTime * 1000
88
+ });
89
+ });
90
+ }, [begin, duration]);
91
+ var onLineMouseOut = useCallback(function () {
92
+ return startTransition(function () {
93
+ return setState(function (old) {
94
+ return Object.assign(Object.assign({}, old), {
95
+ left: -1
96
+ });
97
+ });
98
+ });
99
+ }, []);
66
100
  return /*#__PURE__*/React.createElement("div", {
67
- className: "player-timeline-layout player-segment-timeline-layout ".concat(status === 0 ? 'hide-time-line' : '')
101
+ className: "player-timeline-layout player-segment-timeline-layout ".concat(status === 0 ? 'hide-time-line' : ''),
102
+ onMouseMove: onLineMouseOver,
103
+ onMouseOut: onLineMouseOut
68
104
  }, /*#__PURE__*/React.createElement("div", {
69
105
  className: "segment-line-box"
70
106
  }, segments.map(function (v, i) {
@@ -73,7 +109,9 @@ function SegmentTimeLine(_ref) {
73
109
  title: /*#__PURE__*/React.createElement(TipTitle, {
74
110
  segments: segments,
75
111
  index: i,
76
- begin: begin
112
+ begin: begin,
113
+ current: currentTime * 1000 + begin,
114
+ markTime: state.markTime
77
115
  })
78
116
  }, /*#__PURE__*/React.createElement("div", {
79
117
  className: "segment-line-item ".concat(!v.url ? 'segment-line-item-none' : '', " ").concat(i === segments.length - 1 ? 'last-segment-line-item' : ''),
@@ -94,13 +132,20 @@ function SegmentTimeLine(_ref) {
94
132
  style: {
95
133
  width: "".concat(playPercent, "%")
96
134
  }
135
+ }), state.left !== -1 && /*#__PURE__*/React.createElement("span", {
136
+ className: "segment-line-mark",
137
+ style: {
138
+ left: state.left
139
+ }
97
140
  })));
98
141
  }
99
142
 
100
143
  function TipTitle(_ref2) {
101
144
  var index = _ref2.index,
102
145
  segments = _ref2.segments,
103
- begin = _ref2.begin;
146
+ begin = _ref2.begin,
147
+ current = _ref2.current,
148
+ markTime = _ref2.markTime;
104
149
 
105
150
  var _useMemo = useMemo(function () {
106
151
  if (index === 0) {
@@ -140,7 +185,7 @@ function TipTitle(_ref2) {
140
185
  style: {
141
186
  fontWeight: 600
142
187
  }
143
- }, "\u5F55\u50CF\u7247\u6BB5\u4FE1\u606F"), /*#__PURE__*/React.createElement("div", null, "\u5F00\u59CB\uFF1A", start), /*#__PURE__*/React.createElement("div", null, "\u7ED3\u675F\uFF1A", end), /*#__PURE__*/React.createElement("div", null, "\u72B6\u6001\uFF1A", /*#__PURE__*/React.createElement("span", {
188
+ }, "\u5F55\u50CF\u7247\u6BB5\u4FE1\u606F"), /*#__PURE__*/React.createElement("div", null, "\u5F00\u59CB\uFF1A", start), /*#__PURE__*/React.createElement("div", null, "\u7ED3\u675F\uFF1A", end), /*#__PURE__*/React.createElement("div", null, "\u523B\u5EA6\uFF1A", moment(markTime).format(FMT)), /*#__PURE__*/React.createElement("div", null, "\u5F53\u524D\uFF1A", moment(current).format(FMT)), /*#__PURE__*/React.createElement("div", null, "\u72B6\u6001\uFF1A", /*#__PURE__*/React.createElement("span", {
144
189
  style: {
145
190
  color: hasUrl ? 'green' : 'red'
146
191
  }