hzwl-easy-player
Version:
基于Vue 3的视频播放器组件,支持单屏和多屏播放模式
382 lines (381 loc) • 11.2 kB
JavaScript
import { ref as C, reactive as N, computed as z, onMounted as L, nextTick as R, onBeforeUnmount as D, watch as j, createElementBlock as y, openBlock as d, normalizeClass as f, createCommentVNode as p, createElementVNode as a, Fragment as w, renderList as P } from "vue";
const q = (l, g) => {
const E = l.__vccOpts || l;
for (const [r, n] of g)
E[r] = n;
return E;
}, H = {
key: 0,
class: "player-wrapper"
}, V = ["id"], _ = ["id", "onClick"], Z = ["id", "onClick"], G = ["id", "onClick"], J = ["id", "onClick"], K = ["id", "onClick"], Q = {
__name: "EasyPlayer",
props: {
playerId: {
type: String,
default: ""
},
videoUrl: {
type: String,
default: ""
},
videoBuffer: {
type: Number,
default: 0.2
},
videoBufferDelay: {
type: Number,
default: 1
},
showBandwidth: {
type: Boolean,
default: !0
},
showPerformance: {
type: Boolean,
default: !1
},
operateBtns: {
type: Object,
default: () => ({
fullscreen: !0,
screenshot: !1,
play: !0,
audio: !0,
ptz: !1,
quality: !1,
performance: !0
})
},
watermarkText: {
type: String,
default: ""
},
hasAudio: {
type: Boolean,
default: !0
},
isNotMute: {
type: Boolean,
default: !1
},
multiScreenOne: {
type: Boolean,
default: !1
},
multiScreenTwo: {
type: Boolean,
default: !1
},
multiScreenFour: {
type: Boolean,
default: !1
},
multiScreenSix: {
type: Boolean,
default: !1
},
multiScreenNine: {
type: Boolean,
default: !1
},
multiScreenSixteen: {
type: Boolean,
default: !1
}
},
emits: ["player-click"],
setup(l, { expose: g, emit: E }) {
const r = l;
C(!1);
const n = C(null);
N({
hasAudio: !0,
isLive: !0,
MSE: !1,
WCS: !1,
WASM: !0
});
const s = C(null), m = (t) => {
s.value = t;
}, F = () => {
if (!s.value && !r.multiScreenOne) {
console.warn("请先选择要全屏的播放器");
return;
}
const t = r.multiScreenOne ? n.value[1] : n.value[s.value];
if (!t) {
console.error("播放器实例不存在");
return;
}
t.setFullscreen(!0);
}, x = () => {
if (!s.value && !r.multiScreenOne) {
console.warn("请先选择要暂停的播放器");
return;
}
const t = r.multiScreenOne ? n.value[1] : n.value[s.value];
if (!t) {
console.error("播放器实例不存在");
return;
}
t.pause();
}, M = () => {
if (!s.value && !r.multiScreenOne) {
console.warn("请先选择要静音的播放器");
return;
}
const t = r.multiScreenOne ? n.value[1] : n.value[s.value];
if (!t) {
console.error("播放器实例不存在");
return;
}
t.setMute(!0);
}, b = () => {
if (!s.value && !r.multiScreenOne) {
console.warn("请先选择要播放的播放器");
return;
}
const t = r.multiScreenOne ? 1 : s.value, o = r.multiScreenOne ? n.value[1] : n.value[s.value];
if (!o) {
console.error("播放器实例不存在");
return;
}
S[t] && x(), setTimeout((e) => {
o.play(e).then(() => {
S[t] = !0;
}).catch((u) => {
console.error(u), S[t] = !1;
});
}, 1e3, r.videoUrl);
}, h = () => new Promise((t, o) => {
n.value && (Object.values(n.value).forEach((e, u) => {
e && (e.destroy(), S[u + 1] = !1);
}), n.value = null), setTimeout(() => {
t();
}, 100);
}), A = () => {
h().then(() => {
B(), b();
});
}, S = N({}), B = () => {
let t = 1;
r.multiScreenTwo ? t = 2 : r.multiScreenFour ? t = 4 : r.multiScreenSix ? t = 6 : r.multiScreenNine ? t = 9 : r.multiScreenSixteen && (t = 16);
for (let o = 1; o <= t; o++) {
S[o] = !1;
const e = r.multiScreenOne ? r.playerId : `${r.playerId}${o}`, u = document.getElementById(e);
if (!u) {
console.error("Container element not found:", e);
continue;
}
const c = new window.EasyPlayerPro({
container: u,
videoBuffer: r.videoBuffer,
videoBufferDelay: Number(r.videoBufferDelay),
decoder: "/js/EasyPlayer/decoder-pro.js",
isResize: !0,
loadingText: "加载中",
debug: !1,
debugLevel: "debug",
useMSE: !1,
useSIMD: !1,
useWCS: !1,
useWASM: !0,
hasAudio: r.hasAudio,
websocket1006ErrorReplay: !0,
networkDelayTimeoutReplay: !0,
useMThreading: !0,
showBandwidth: r.showBandwidth,
showPerformance: r.showPerformance,
gpuDecoder: !0,
operateBtns: r.operateBtns,
timeout: 10,
qualityConfig: ["普清", "高清", "超清"],
forceNoOffscreen: !0,
isNotMute: r.isNotMute,
heartTimeout: 5,
ptzClickType: "mouseDownAndUp",
ptzZoomShow: !0,
ptzMoreArrowShow: !0,
ptzApertureShow: !0,
ptzFocusShow: !0,
pauseAndNextPlayUseLastFrameShow: !0,
heartTimeoutReplayUseLastFrameShow: !0,
replayUseLastFrameShow: !0,
fullscreenWatermarkConfig: {
text: r.watermarkText
}
});
c.on("error", (i) => {
console.error("EasyPlayer error:", i);
}), c.on("fullscreen", function(i) {
console.log("is fullscreen", i);
}), c.on("playbackRate", (i) => {
c.setRate(i);
}), c.on("playbackSeek", (i) => {
console.log("playbackSeek", i);
}), n.value || (n.value = {}), n.value[o] = c;
}
}, O = () => new Promise((t, o) => {
if (window.EasyPlayerPro) {
console.log("EasyPlayerPro 已加载"), typeof Worker < "u" ? t(!0) : o(new Error("此浏览器不支持Web Workers"));
return;
}
let e = 0;
const u = 50, c = 100;
console.log("等待EasyPlayerPro加载..."), new Promise((k, W) => {
if (document.querySelector('script[src*="EasyPlayer-pro.js"]')) {
k();
return;
}
const v = document.createElement("script");
v.src = "/js/EasyPlayer/EasyPlayer-pro.js", v.async = !0, v.onload = () => {
k();
}, v.onerror = (T) => {
console.error("EasyPlayerPro脚本加载失败", T), W(T);
}, document.head.appendChild(v);
}).catch((k) => console.error("脚本加载错误:", k));
const I = () => {
if (e++, window.EasyPlayerPro) {
console.log(`EasyPlayerPro 已加载,尝试了 ${e} 次`), typeof Worker < "u" ? t(!0) : o(new Error("此浏览器不支持Web Workers"));
return;
}
if (e >= u) {
console.error("EasyPlayerPro加载失败,请检查脚本是否正确引入"), o(new Error("Failed to load EasyPlayerPro"));
return;
}
setTimeout(I, c);
};
I();
}), U = z(() => ({
multiScreenOne: r.multiScreenOne,
multiScreenTwo: r.multiScreenTwo,
multiScreenFour: r.multiScreenFour,
multiScreenSix: r.multiScreenSix,
multiScreenNine: r.multiScreenNine,
multiScreenSixteen: r.multiScreenSixteen
}));
return L(async () => {
try {
await R(), await O(), B();
} catch (t) {
console.error("初始化EasyPlayer失败:", t);
}
}), D(() => {
console.log("EasyPlayer组件卸载"), h().then(() => {
console.log("播放器资源已释放");
}).catch((t) => {
console.error("播放器资源释放失败:", t);
});
}), j(() => r.videoUrl, async (t, o) => {
if (console.log("视频URL变化:", o, "->", t), !t) {
console.log("URL为空,不进行操作");
return;
}
try {
await O(), await h(), B(), b();
} catch (e) {
console.error("URL变化后初始化播放器失败:", e);
}
}), g({
onPlayer: b,
onPause: x,
onDestroy: h,
onMute: M,
setFullscreen: F,
onReplay: A
}), (t, o) => (d(), y("div", {
class: f(["bigbox", U.value])
}, [
l.multiScreenOne ? (d(), y("div", H, [
a("div", {
class: f(["player-box", { "border-selected": s.value === 1 }])
}, [
a("div", {
id: l.playerId,
class: "player",
onClick: o[0] || (o[0] = (e) => m(1))
}, null, 8, V)
], 2)
])) : p("", !0),
l.multiScreenTwo ? (d(), y(w, { key: 1 }, P(2, (e) => a("div", {
key: e,
class: "player-wrapper"
}, [
a("div", {
class: f(["player-box", { "border-selected": s.value === e }])
}, [
a("div", {
id: `${l.playerId}${e}`,
class: "player",
onClick: (u) => m(e)
}, null, 8, _)
], 2)
])), 64)) : p("", !0),
l.multiScreenFour ? (d(), y(w, { key: 2 }, P(4, (e) => a("div", {
key: e,
class: "player-wrapper"
}, [
a("div", {
class: f(["player-box", { "border-selected": s.value === e }])
}, [
a("div", {
id: `${l.playerId}${e}`,
class: "player",
onClick: (u) => m(e)
}, null, 8, Z)
], 2)
])), 64)) : p("", !0),
l.multiScreenSix ? (d(), y(w, { key: 3 }, P(6, (e) => a("div", {
key: e,
class: "player-wrapper"
}, [
a("div", {
class: f(["player-box", { "border-selected": s.value === e }])
}, [
a("div", {
id: `${l.playerId}${e}`,
class: "player",
onClick: (u) => m(e)
}, null, 8, G)
], 2)
])), 64)) : p("", !0),
l.multiScreenNine ? (d(), y(w, { key: 4 }, P(9, (e) => a("div", {
key: e,
class: "player-wrapper"
}, [
a("div", {
class: f(["player-box", { "border-selected": s.value === e }])
}, [
a("div", {
id: `${l.playerId}${e}`,
class: "player",
onClick: (u) => m(e)
}, null, 8, J)
], 2)
])), 64)) : p("", !0),
l.multiScreenSixteen ? (d(), y(w, { key: 5 }, P(16, (e) => a("div", {
key: e,
class: "player-wrapper"
}, [
a("div", {
class: f(["player-box", { "border-selected": s.value === e }])
}, [
a("div", {
id: `${l.playerId}${e}`,
class: "player",
onClick: (u) => m(e)
}, null, 8, K)
], 2)
])), 64)) : p("", !0)
], 2));
}
}, $ = /* @__PURE__ */ q(Q, [["__scopeId", "data-v-c032e2ce"]]), ee = $, re = {
install(l) {
l.component("EasyPlayer", $), l.component("HzwlPlayer", $);
}
};
export {
$ as EasyPlayer,
ee as HzwlPlayer,
re as default
};