nicecode-v2/packages/meta/es/VideoPlayer/VideoPlayer.js

700 lines
41 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
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."); }
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); }
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; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
import { noop, get, addEventListenerWrapper, dataURLToBlob, nextTick, toRealNumber, getTransforms, formatDurationTime } from '@zhst/func';
import Align from 'rc-align';
import { useLatest, useUpdateEffect, useFullscreen, useUnmount } from '@zhst/hooks';
import classNames from 'classnames';
import { message } from '..';
import { IconFont } from '@zhst/icon';
import { Cropper, EVENT_CROP_START, EVENT_CROP_END, Viewer } from "../ImageEditor";
import FlvPlayer, { FLV_EVENT } from "./components/FlvPlayer";
import Range from "./components/Progress";
import Loading from "./components/Loading";
import { CROP_TYPE } from "../utils/constants";
import { downloadFrame, getShowStatus } from "./videoPlayerHelper";
import "./index.less";
var componentName = "zhst-image__video-view";
var VideoPlayer = /*#__PURE__*/forwardRef(function (props, ref) {
var url = props.url,
_props$maxDuration = props.maxDuration,
maxDuration = _props$maxDuration === void 0 ? 20 : _props$maxDuration,
_props$screenshotButt = props.screenshotButtonAlign,
screenshotButtonAlign = _props$screenshotButt === void 0 ? {
points: ['bl', 'br'],
offset: [6, 0],
overflow: {
adjustX: true,
adjustY: true
}
} : _props$screenshotButt,
_props$autoPlay = props.autoPlay,
autoPlay = _props$autoPlay === void 0 ? false : _props$autoPlay,
odList = props.odList,
showOD = props.showOD,
_props$width = props.width,
width = _props$width === void 0 ? '100%' : _props$width,
_props$height = props.height,
height = _props$height === void 0 ? '532px' : _props$height,
_props$backgroundColo = props.backgroundColor,
backgroundColor = _props$backgroundColo === void 0 ? '#333' : _props$backgroundColo,
_props$screenshotButt2 = props.screenshotButtonRender,
screenshotButtonRender = _props$screenshotButt2 === void 0 ? function () {
return /*#__PURE__*/React.createElement("div", {
style: {
color: '#fff',
width: '80px',
top: 0
}
}, "\u56DE\u8C03DOM");
} : _props$screenshotButt2,
onCropChange = props.onCropChange,
defaultNormalizationRect = props.defautlNormalizationRect,
playerProps = props.playerProps;
// ========================== 播放 =========================
//实例参数
var containerRef = useRef(null); //容器ref
var videoRef = useRef(null); //video 标签dom
var videoInsRef = useRef(null); //flv 实例
var _useState = useState(0),
_useState2 = _slicedToArray(_useState, 2),
playSeq = _useState2[0],
setPlaySeq = _useState2[1]; // 通过重置playid使FLV组件重新渲染
var videoRemoveListener = useRef(noop); //移除dom监听的中间函数
var loadingTimeRef = useRef(0); //最后一次加载时间
var delayLoadingTimer = useRef(null); //算loading的定时器
//状态参数
var _useState3 = useState(false),
_useState4 = _slicedToArray(_useState3, 2),
isReady = _useState4[0],
setIsReady = _useState4[1]; //
var _useState5 = useState(false),
_useState6 = _slicedToArray(_useState5, 2),
isPlay = _useState6[0],
setIsPlay = _useState6[1]; //当前是否播放
var _useState7 = useState(false),
_useState8 = _slicedToArray(_useState7, 2),
isEnd = _useState8[0],
setIsEnd = _useState8[1]; //是否播放结束
var _useState9 = useState(false),
_useState10 = _slicedToArray(_useState9, 2),
isError = _useState10[0],
setIsError = _useState10[1]; //播放出错
var _useState11 = useState(false),
_useState12 = _slicedToArray(_useState11, 2),
isVideoLoadFinished = _useState12[0],
setIsVideoLoadFinish = _useState12[1]; //是否缓存加载完成
var _useState13 = useState(0),
_useState14 = _slicedToArray(_useState13, 2),
playTime = _useState14[0],
setPlayTime = _useState14[1]; //当前播放时间
var _useState15 = useState(true),
_useState16 = _slicedToArray(_useState15, 2),
isLoadingVideo = _useState16[0],
setIsLoadingVideo = _useState16[1]; //是否加载中
var _useState17 = useState(false),
_useState18 = _slicedToArray(_useState17, 2),
isDelayLoading = _useState18[0],
setIsDelayLoading = _useState18[1]; //显示的转圈loading 延迟0.2s显示
//设置延迟转圈圈
var latestIsLoadingVideo = useLatest(isLoadingVideo);
var setIsLoadingVideoWrapper = function setIsLoadingVideoWrapper(isLoading) {
setIsLoadingVideo(function (preLoading) {
if (!preLoading && isLoading) {
loadingTimeRef.current = new Date().getTime();
}
if (!isLoading) {
loadingTimeRef.current = null;
}
//延迟0。2s相关
if (!isLoading) {
setIsDelayLoading(false);
}
if (!delayLoadingTimer.current && preLoading) {
delayLoadingTimer.current = setTimeout(function () {
if (latestIsLoadingVideo.current) {
//0.2s后才显示
setIsDelayLoading(true);
}
delayLoadingTimer.current = null;
}, 200);
}
return isLoading;
});
};
// 初始化loading 30s 直接显示错误
// TODO :逻辑忘记了 不应该是每次init player吗
useEffect(function () {
var timer = setInterval(function () {
if (loadingTimeRef.current) {
if (new Date().getTime() - loadingTimeRef.current > 1000 * 30) {
checkIsErr();
}
}
}, 1000);
return function () {
clearInterval(timer);
};
}, []);
//结束的时候暂停 保证不播了
useUpdateEffect(function () {
if (isEnd) {
var _videoInsRef$current, _videoInsRef$current$;
videoInsRef === null || videoInsRef === void 0 || (_videoInsRef$current = videoInsRef.current) === null || _videoInsRef$current === void 0 || (_videoInsRef$current$ = _videoInsRef$current.pause) === null || _videoInsRef$current$ === void 0 || _videoInsRef$current$.call(_videoInsRef$current);
}
}, [isEnd]);
// 捕捉视频播放报错
var checkIsErr = function checkIsErr() {
setIsError(true);
try {
var _videoInsRef$current2, _videoInsRef$current3;
videoInsRef === null || videoInsRef === void 0 || (_videoInsRef$current2 = videoInsRef.current) === null || _videoInsRef$current2 === void 0 || (_videoInsRef$current3 = _videoInsRef$current2.destroy) === null || _videoInsRef$current3 === void 0 || _videoInsRef$current3.call(_videoInsRef$current2);
} catch (error) {
console.error(error);
}
};
// 初始化
var latestMaxDuration = useLatest(maxDuration);
var initPlayer = useCallback(function (ins, dom) {
videoRef.current = dom;
videoInsRef.current = ins;
var maxDuration = latestMaxDuration.current || 0;
//监听播放事件
var video = dom;
var errorLister = function errorLister(e) {
checkIsErr();
console.error('视频出错了', e, video.currentTime);
};
var waitingListener = function waitingListener() {
setIsLoadingVideoWrapper(true);
// console.debug('视频加载等待', e, video.currentTime);
};
var playingListener = function playingListener() {
setIsLoadingVideoWrapper(false);
setIsError(false);
// console.debug('视频从等待中播放', e, video.currentTime);
};
var playLister = function playLister() {
setIsPlay(true);
setIsError(false);
// console.debug('提示该视频正在播放中', e, video.currentTime);
};
var pauseListener = function pauseListener() {
setIsPlay(false);
// console.debug('暂停播放', e, video.currentTime);
};
var endedListner = function endedListner() {
setIsEnd(true);
setIsVideoLoadFinish(true);
// console.debug('视频播放完了', e, video.currentTime);
};
var timeupdateListner = function timeupdateListner() {
var nowTime = video.currentTime;
if (nowTime >= maxDuration) {
setIsEnd(true);
setIsVideoLoadFinish(true);
}
setPlayTime(nowTime);
};
// see https://github.com/bilibili/flv.js/issues/337
var windowErrorHandle = function windowErrorHandle(errorEvent) {
try {
if (errorEvent['message'] == "Uncaught TypeError: Cannot read property 'flushStashedSamples' of null") {
checkIsErr();
console.error('视频出错了 window监听', errorEvent);
}
} catch (error) {
console.error(error);
}
};
video.addEventListener('error', errorLister);
video.addEventListener('waiting', waitingListener);
video.addEventListener('playing', playingListener);
video.addEventListener('play', playLister);
video.addEventListener('pause', pauseListener);
video.addEventListener('ended', endedListner);
video.addEventListener('timeupdate', timeupdateListner);
window.addEventListener('error', windowErrorHandle);
videoRemoveListener.current = function () {
video.removeEventListener('error', errorLister);
video.removeEventListener('waiting', waitingListener);
video.removeEventListener('playing', playingListener);
video.removeEventListener('play', playLister);
video.removeEventListener('pause', pauseListener);
video.removeEventListener('ended', endedListner);
video.removeEventListener('timeupdate', timeupdateListner);
window.removeEventListener('error', windowErrorHandle);
};
videoInsRef === null || videoInsRef === void 0 || videoInsRef.current.on(FLV_EVENT.ERROR, function (type, errDetail, info) {
checkIsErr();
console.error('videoInsRef 错误', type, errDetail, info, video.currentTime);
});
var playPromise = videoInsRef === null || videoInsRef === void 0 ? void 0 : videoInsRef.current.play();
//先ready 遮挡会导致播放失败
setIsReady(true);
playPromise.then(function () {
setIsReady(true);
}).catch(function () {
try {} catch (error) {}
// setIsError(true);
for (var _len = arguments.length, arg = new Array(_len), _key = 0; _key < _len; _key++) {
arg[_key] = arguments[_key];
}
console.error('playPromise视频出错了', arg);
});
}, []);
useUnmount(function () {
try {
videoRemoveListener.current();
} catch (e) {
console.error(e);
}
});
// 重新加载
var _reload = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
var oldTime;
return _regeneratorRuntime().wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
if (!videoInsRef.current) {
_context.next = 15;
break;
}
oldTime = videoInsRef.current.currentTime;
videoInsRef.current.currentTime = 0;
//如果修改时间不成功,则走重新加载的逻辑
if (!(oldTime === videoInsRef.current.currentTime)) {
_context.next = 14;
break;
}
//重置状态
setIsReady(false);
setIsPlay(false);
setIsLoadingVideoWrapper(false);
setIsReady(false);
setIsEnd(false);
setIsVideoLoadFinish(false);
setPlayTime(0);
//清楚dom事件监听
try {
videoRemoveListener.current();
} catch (error) {
console.error(error);
}
setPlaySeq(function (pre) {
return pre + 1;
});
return _context.abrupt("return");
case 14:
videoInsRef.current.play();
case 15:
setPlayTime(0);
setIsEnd(false);
case 17:
case "end":
return _context.stop();
}
}, _callee);
}));
return function reload() {
return _ref.apply(this, arguments);
};
}();
// 进度条操作
var seek = function seek(v) {
if (videoInsRef.current && isVideoLoadFinished) {
setPlayTime(parseFloat(v));
videoInsRef.current.currentTime = parseFloat(v);
} else {
message.warning('待视频加载完,才可操作进度条');
}
};
// ========================== 视频opt bar =========================
var _useFullscreen = useFullscreen(containerRef, {
pageFullscreen: true
}),
_useFullscreen2 = _slicedToArray(_useFullscreen, 2),
isFullscreen = _useFullscreen2[0],
toggleFullscreen = _useFullscreen2[1].toggleFullscreen;
var showMaxDuration = !!maxDuration ? maxDuration : toRealNumber(get(videoRef, 'current.duration', 0));
var showSlider = videoInsRef.current && isVideoLoadFinished;
var showStatus = getShowStatus(isDelayLoading, isEnd, isError);
// ========================== 截图 =========================
var corpContainerRef = useRef();
var cropInsRef = useRef(null);
var _useState19 = useState(false),
_useState20 = _slicedToArray(_useState19, 2),
showCrop = _useState20[0],
_setShowCrop = _useState20[1];
//回显默认框选
var isFirstFlagRef = useRef(true);
useEffect(function () {
var isFirst = isFirstFlagRef.current;
if (!isLoadingVideo && isReady && isFirst && defaultNormalizationRect && !showStatus) {
nextTick(function () {
_setShowCrop(true);
});
}
}, [isLoadingVideo, showStatus]);
//定位按钮相关参数
var alginContainerRef = useRef(null);
var alignRef = useRef(null);
var _useState21 = useState(null),
_useState22 = _slicedToArray(_useState21, 2),
cropRect = _useState22[0],
setCropRect = _useState22[1];
// 监听showCrop, isReady - 是否可编辑、视频播放组件是否挂载
useEffect(function () {
var handlerCropStart;
var handlerCropEnd;
setCropRect(null);
if (!isReady) return;
if (showCrop) {
var _canvas$parentNode, _videoInsRef$current4;
handlerCropStart = addEventListenerWrapper(corpContainerRef.current, EVENT_CROP_START, function () {
setCropRect(null);
});
handlerCropEnd = addEventListenerWrapper(corpContainerRef.current, EVENT_CROP_END, function (event) {
var _alignRef$current, _alignRef$current$for;
var data = event.detail;
setCropRect({
x: data.left,
y: data.top,
w: data.width,
h: data.height
});
alignRef === null || alignRef === void 0 || (_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 || (_alignRef$current$for = _alignRef$current.forceAlign) === null || _alignRef$current$for === void 0 || _alignRef$current$for.call(_alignRef$current);
});
var video = videoRef.current;
//计算 limitcroppbox
var scale = Math.min(video.offsetWidth / video.videoWidth, video.offsetHeight / video.videoHeight);
var finalVideoWidth = video.videoWidth * scale;
var finalVideoHeight = video.videoHeight * scale;
var cropBoxLimited = {
width: finalVideoWidth,
height: finalVideoHeight,
top: (video.offsetHeight - finalVideoHeight) / 2,
left: (video.offsetWidth - finalVideoWidth) / 2
};
//获取视频图片
var canvas = document.createElement('canvas');
canvas.width = video.offsetWidth;
canvas.height = video.offsetHeight;
canvas.style.display = 'none';
document.body.appendChild(canvas);
var ctx = canvas.getContext('2d');
ctx === null || ctx === void 0 || ctx.drawImage(video, (video.offsetWidth - finalVideoWidth) / 2, (video.offsetHeight - finalVideoHeight) / 2, finalVideoWidth, finalVideoHeight);
var imageData = canvas.toDataURL('image/png');
(_canvas$parentNode = canvas.parentNode) === null || _canvas$parentNode === void 0 || _canvas$parentNode.removeChild(canvas);
//回显编辑框
var isFirst = isFirstFlagRef.current;
var initialCropBoxData = null;
if (isFirst && defaultNormalizationRect) {
initialCropBoxData = {
left: defaultNormalizationRect.x * finalVideoWidth + cropBoxLimited.left,
top: defaultNormalizationRect.y * finalVideoHeight + cropBoxLimited.top,
width: defaultNormalizationRect.w * finalVideoWidth,
height: defaultNormalizationRect.h * finalVideoHeight
};
}
isFirstFlagRef.current = false;
// 初始化圈选工具
cropInsRef.current = new Cropper(corpContainerRef.current, {
showMask: true,
cropBoxLimited: cropBoxLimited,
editAble: false,
img: imageData,
initialCropBoxData: initialCropBoxData
});
videoInsRef === null || videoInsRef === void 0 || (_videoInsRef$current4 = videoInsRef.current) === null || _videoInsRef$current4 === void 0 || _videoInsRef$current4.pause();
} else {
var _videoInsRef$current5;
var _element = videoInsRef.current._mediaElement || {};
videoInsRef === null || videoInsRef === void 0 || (_videoInsRef$current5 = videoInsRef.current) === null || _videoInsRef$current5 === void 0 || _videoInsRef$current5.play();
// 挂载图片选择
cropInsRef.current = new Viewer(corpContainerRef.current, {
scaleAble: false,
selectAble: false,
dragAble: false,
width: _element.clientWidth,
height: _element.clientHeight,
backgroundColor: 'transparent'
});
// 判定是否存在od框
showOD && (odList === null || odList === void 0 ? void 0 : odList.forEach(function (_od) {
var _cropInsRef$current;
cropInsRef === null || cropInsRef === void 0 || (_cropInsRef$current = cropInsRef.current) === null || _cropInsRef$current === void 0 || _cropInsRef$current.addShape(_od);
}));
}
return function () {
var _handlerCropStart, _handlerCropEnd, _cropInsRef$current2, _cropInsRef$current2$;
(_handlerCropStart = handlerCropStart) === null || _handlerCropStart === void 0 || _handlerCropStart.remove();
(_handlerCropEnd = handlerCropEnd) === null || _handlerCropEnd === void 0 || _handlerCropEnd.remove();
cropInsRef === null || cropInsRef === void 0 || (_cropInsRef$current2 = cropInsRef.current) === null || _cropInsRef$current2 === void 0 || (_cropInsRef$current2$ = _cropInsRef$current2.destroy) === null || _cropInsRef$current2$ === void 0 || _cropInsRef$current2$.call(_cropInsRef$current2);
cropInsRef.current = null;
};
}, [showCrop, isReady]);
var latestCropRect = useLatest(cropRect);
var getCropInfo = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
var _canvas$parentNode2;
var cropRect, video, rectList, extendRectList, selectIndex, scale, finalVideoWidth, finalVideoHeight, canvas, ctx, base64, blobData, file, newRect;
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
cropRect = latestCropRect.current;
video = videoRef.current;
if (video) {
_context3.next = 4;
break;
}
return _context3.abrupt("return");
case 4:
rectList = [];
extendRectList = [];
selectIndex = 0; //获取视频图片的url
scale = Math.min(video.offsetWidth / video.videoWidth, video.offsetHeight / video.videoHeight);
finalVideoWidth = video.videoWidth * scale;
finalVideoHeight = video.videoHeight * scale;
canvas = document.createElement('canvas');
canvas.width = finalVideoWidth;
canvas.height = finalVideoHeight;
canvas.style.display = 'none';
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
ctx.drawImage(video, 0, 0, finalVideoWidth, finalVideoHeight);
base64 = canvas.toDataURL('image/jpeg');
blobData = dataURLToBlob(base64);
(_canvas$parentNode2 = canvas.parentNode) === null || _canvas$parentNode2 === void 0 || _canvas$parentNode2.removeChild(canvas);
file = new window.File([blobData], "".concat(new Date().getTime()));
newRect = {
w: cropRect.w / finalVideoWidth,
h: cropRect.h / finalVideoHeight,
x: (cropRect.x - (video.offsetWidth - finalVideoWidth) / 2) / finalVideoWidth,
y: (cropRect.y - (video.offsetHeight - finalVideoHeight) / 2) / finalVideoHeight
};
rectList.push(newRect);
extendRectList.push(newRect);
//扩展框获取imgkey
extendRectList.forEach( /*#__PURE__*/function () {
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(rect, index) {
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
extendRectList[index] = _objectSpread({}, rect);
case 1:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function (_x, _x2) {
return _ref3.apply(this, arguments);
};
}());
return _context3.abrupt("return", {
rectList: rectList,
extendRectList: extendRectList,
selectIndex: selectIndex,
file: file
});
case 26:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return function getCropInfo() {
return _ref2.apply(this, arguments);
};
}();
// 监听showCrop、cropRect - 监听是否可编辑、绘制的矩形
useEffect(function () {
//计算归一化crop rect
var normalizationRect = null;
if (showCrop && cropRect) {
var video = videoRef.current;
var scale = Math.min(video.offsetWidth / video.videoWidth, video.offsetHeight / video.videoHeight);
var finalVideoWidth = video.videoWidth * scale;
var finalVideoHeight = video.videoHeight * scale;
var cropBoxLimited = {
width: finalVideoWidth,
height: finalVideoHeight,
top: (video.offsetHeight - finalVideoHeight) / 2,
left: (video.offsetWidth - finalVideoWidth) / 2
};
normalizationRect = {
x: (cropRect.x - cropBoxLimited.left) / cropBoxLimited.width,
y: (cropRect.y - cropBoxLimited.top) / cropBoxLimited.height,
w: cropRect.w / cropBoxLimited.width,
h: cropRect.h / cropBoxLimited.height
};
}
onCropChange === null || onCropChange === void 0 || onCropChange(showCrop, normalizationRect);
}, [showCrop, cropRect]);
// ========================== 截帧 =========================
var downloadVideoFrame = useCallback(function (opt) {
var _videoInsRef$current6, _videoInsRef$current7;
videoInsRef === null || videoInsRef === void 0 || (_videoInsRef$current6 = videoInsRef.current) === null || _videoInsRef$current6 === void 0 || (_videoInsRef$current7 = _videoInsRef$current6.pause) === null || _videoInsRef$current7 === void 0 || _videoInsRef$current7.call(_videoInsRef$current6);
downloadFrame(videoRef.current, opt);
}, []);
// ============================== 暴露出去的方法 ===============================
var latestIsReady = useLatest(isReady);
var cropAble = !showStatus && isReady;
useImperativeHandle(ref, function () {
return {
cropAble: cropAble,
setShowCrop: function setShowCrop(dispatch) {
var isReady = latestIsReady.current;
if (!isReady) return;
_setShowCrop === null || _setShowCrop === void 0 || _setShowCrop(dispatch);
},
downloadVideoFrame: downloadVideoFrame,
pause: function pause() {
var _videoInsRef$current8, _videoInsRef$current9;
(_videoInsRef$current8 = videoInsRef.current) === null || _videoInsRef$current8 === void 0 || (_videoInsRef$current9 = _videoInsRef$current8.pause) === null || _videoInsRef$current9 === void 0 || _videoInsRef$current9.call(_videoInsRef$current8);
},
play: function play() {
var _videoInsRef$current10, _videoInsRef$current11;
(_videoInsRef$current10 = videoInsRef.current) === null || _videoInsRef$current10 === void 0 || (_videoInsRef$current11 = _videoInsRef$current10.play) === null || _videoInsRef$current11 === void 0 || _videoInsRef$current11.call(_videoInsRef$current10);
},
reload: _reload
};
});
return /*#__PURE__*/React.createElement("div", {
className: classNames("".concat(componentName)),
ref: containerRef,
style: {
width: width,
height: height,
backgroundColor: backgroundColor
}
}, url && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FlvPlayer, _extends({
playId: playSeq,
autoPlay: autoPlay,
className: classNames("".concat(componentName, "-flv")),
type: url.startsWith('http') ? 'mp4' : 'flv',
url: url,
config: {
enableStashBuffer: true,
stashInitialSize: 1024 * 700,
isLive: true,
hasAudio: false,
hasVideo: true
},
onCreate: initPlayer
}, playerProps)), /*#__PURE__*/React.createElement("div", {
className: classNames("".concat(componentName, "-crop-container")),
ref: corpContainerRef,
style: {
display: isFullscreen ? 'none' : 'block',
width: '100%',
height: '100%'
}
}), showCrop && cropRect && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
ref: alginContainerRef,
className: classNames("".concat(componentName, "-align")),
style: Object.assign({
width: cropRect.w,
height: cropRect.h
}, getTransforms({
translateX: cropRect.x,
translateY: cropRect.y
}))
}), /*#__PURE__*/React.createElement(Align, {
ref: alignRef,
monitorWindowResize: true,
align: screenshotButtonAlign,
target: function target() {
return alginContainerRef.current;
}
}, screenshotButtonRender({
model: 'IMAGE',
getCropInfo: getCropInfo,
setShowCrop: _setShowCrop,
cropType: CROP_TYPE['CUSTOM']
}))), !showCrop && /*#__PURE__*/React.createElement("div", {
className: "".concat(componentName, "-opt")
}, /*#__PURE__*/React.createElement(IconFont, {
styles: {
marginRight: '12px',
color: '#fff',
display: 'flex'
},
onIconClick: function onIconClick() {
if (!isPlay) {
var _videoInsRef$current12;
//播放中暂停
videoInsRef === null || videoInsRef === void 0 || (_videoInsRef$current12 = videoInsRef.current) === null || _videoInsRef$current12 === void 0 || _videoInsRef$current12.play();
_setShowCrop(false);
} else {
var _videoInsRef$current13;
videoInsRef === null || videoInsRef === void 0 || (_videoInsRef$current13 = videoInsRef.current) === null || _videoInsRef$current13 === void 0 || _videoInsRef$current13.pause();
}
},
color: "#1890ff",
icon: !isPlay ? 'icon-bofang3' : 'icon-zanting1'
}), /*#__PURE__*/React.createElement("div", {
className: "".concat(componentName, "-opt-range"),
onClick: function onClick(e) {
e.stopPropagation();
}
}, /*#__PURE__*/React.createElement(Range, {
value: playTime,
min: 0,
max: showMaxDuration,
showSlider: showSlider,
onChange: seek
}), /*#__PURE__*/React.createElement("div", null, formatDurationTime(playTime), "/", formatDurationTime(showMaxDuration))), /*#__PURE__*/React.createElement(IconFont, {
styles: {
display: 'flex',
marginLeft: '12px'
},
color: "#fff",
size: 18,
onIconClick: function onIconClick(e) {
e.stopPropagation();
toggleFullscreen();
},
icon: isFullscreen ? 'icon-suoxiao1' : 'icon-quanping1'
})), !!showStatus && /*#__PURE__*/React.createElement(Loading, {
status: showStatus,
reload: function reload() {
return _reload();
}
})));
});
export default VideoPlayer;