sldz-easyplayer 1.0.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.
@@ -0,0 +1,1463 @@
1
+ import { openBlock as k, createElementBlock as D, createElementVNode as h, normalizeStyle as me, createTextVNode as Xe, toDisplayString as W, renderSlot as Re, createCommentVNode as T, computed as U, normalizeClass as qe, nextTick as _e, ref as B, reactive as Z, onBeforeUnmount as Pe, watch as ue, unref as X, shallowRef as ie, onMounted as Ue, createBlock as $, resolveDynamicComponent as ee, withCtx as ke, Fragment as re, renderList as Qe, inject as $e, useTemplateRef as Se, onUnmounted as et, withModifiers as te, createVNode as ne } from "vue";
2
+ class tt {
3
+ constructor(e, t = {}) {
4
+ return this.container = e, this.options = t, this.instance = null, this.init(), new Proxy(this, {
5
+ get(n, o) {
6
+ if (o in n)
7
+ return n[o];
8
+ if (n.instance && o in n.instance) {
9
+ const a = n.instance[o];
10
+ return typeof a == "function" ? a.bind(n.instance) : a;
11
+ }
12
+ },
13
+ set(n, o, a) {
14
+ return o === "instance" || o === "container" ? (n[o] = a, !0) : n.instance ? (n.instance[o] = a, !0) : !1;
15
+ }
16
+ });
17
+ }
18
+ init() {
19
+ if (!this.container) return null;
20
+ if (typeof window.EasyPlayerPro > "u")
21
+ return console.error(
22
+ "[EasyPlayer] EasyPlayerPro SDK 未加载!请先在页面中引入 EasyPlayerPro SDK,确保 window.EasyPlayerPro 可用。"
23
+ ), null;
24
+ const t = {
25
+ ...{
26
+ audio: !0,
27
+ record: !0,
28
+ quality: !0,
29
+ screenshot: !0
30
+ },
31
+ ...this.options.btns,
32
+ fullscreen: !1,
33
+ zoom: !1,
34
+ ptz: !1,
35
+ stretch: !1,
36
+ play: !1
37
+ }, n = {
38
+ isLive: !0,
39
+ bufferTime: 0.2,
40
+ stretch: !1,
41
+ MSE: !0,
42
+ WCS: !0,
43
+ isBand: !0,
44
+ quality: ["超清", "高清", "标清"],
45
+ ptzConfig: { ptz: !1, ptzMore: !1 },
46
+ btns: t
47
+ };
48
+ this.instance = new window.EasyPlayerPro(this.container, n);
49
+ }
50
+ }
51
+ const nt = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAADwklEQVR4AexYzWsTWxT/nfCaBrpx8YQ+ePAe6EIRxKIuFIUimqR+btypqKigbqyfIH5sRMQv1J2gYAX/AaGLtFVw4UJQqagLFy5cCBZ04XKS2hx/Z2JCMncmualpEDGcM+fec8/Hb869c+dOUvjFf38A/uwE/b4V1MHBeZrN7tB87p7mspOUn8n6g9nOPtdc7o7ms7vNdraVbLuCOrRugRIUMr2fkZIHTLwHIsso/yZXiW1ZAcF+QEbQm/5EnzsEvARt/rwBsgoZzWevQnveMcce8l9kPxLJ0JBg9YXmsjcsFvte5AVQh4YWsGKTgJwA4A+Mxg1kQEWGWdFJ3bjuv4axhE4qQV9Tc50th5afUrGI3BkSWYRyz7MwdouITQGGd5mSUcboJ3ea+rmGR8PZaRI5EWC4Tso9BfrOBTiGDakf5ZnRMFfYdS+JALlOLtHcf1qPDAOXr1T42HG6epJNdyZ9Ick6FqDmcrYdHExycvR9fUA+DyxdWuENGwDTOYYJCsWw5gYXxo3GAuT+NQx74uI85kInwp2h90xcaAcg18M8qO6MM55bne4Mc0eSOACRSW/ravWqgKyK6fSmarcqXYCQNdXBrsuUrI/mjAGo9l6N2nWnr27uGIDyf3fQxGQR+TeqjQEInkSiZl3rO7njAHYNjU+iOIBffBwbbGZmAON6ZalU3/NtO7ldgKoffaPV7IIAOHsWuH69wqdOAdPTtWH/hn6I2roARV5Fjbz6r3hcfDQBGL957eXiGKmb2wWI8mPH0Udx6DBw7nyF9/Hw7OMTtRG1c2eD1gUYTNv571uDVatOHw8LW7cCq1dXePv29g4LFl81QFB6aM16dgDKkydfaWAfQxTdJHnwI3dDUgdgOKq4SOlfRXuCjelUo3aeYque6q2ab10jFqCMjb0H9GadXfNm9Ck+fbrNp1huy/j427gksQBDw6B0jtI+MSk8qP4ptraHS2iieIdikXcU9pxLIkCuhwCKLfSYIs8VTfFoNxTmSsiQCNDsw6ku62a2p8idpikwthQKzuZcn6gpQDPk2ngJyCqAU8FLR8imVbG2Ert5xJYAzT28y6A4wCm/yc8BvtdMOyvmzqDXuOYGwtnxCOEF0OLYOmHQowS5kv27bQIlMIzQd7EUxk9aLHj+vAFW43Fa3kph7ACKpX+4FdmfSHcpX3C8/iTyhTdg7/QRzJR3ISjOp89e3iC3L1q2QW0DrMZmFb6yGveZ+ADlSkoDIZTG82VsfIDtvTIxEfuGqMZpJWcNsFXgTo3/AfizlfwOAAD//5WbvAQAAAAGSURBVAMAXZoxYPRu590AAAAASUVORK5CYII=", ot = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAADOklEQVR4AezbjXETMRAF4JhGSAkpgXSQDkgJdBCnAzoAKmCoIHTAUAFQiXjvxvKMPB5bd2+l3UyW0fruTCQ9fVZ+5jx+d5P/JIEElPhubhIwAUUBsXvuwAQUBcTuuQMTUBQQu+cOTEBRQOyeOzABRQGx+1vcgSJZ2z0BW4/VVwm4mqztkICtx+orE8BSylMp5U8p5Usp5XZ1ikkdmA31HfUL9WQxrQx4CLJHGMI94viC53iO0zjtkOkFiR5Qd6g9nmNunG5vMiCmZiAcjo14oRABtWRCQh5xOLaPx7ONJxaA/87MzaAhEC/gMfZPPihlAfgJAf6iTps74hU8Zn4+Db32Wgbc7XYMco+JecShaW6IHXj3h+xN4LUXMiAnPAQJgzgLj2s3AeRAURBn4nHdZoAczBtxNh7XbArIAccgcuTL5YHHROaAHHQ2ohce1zoEkAPPQvTE4zqHAXLw0YjeeFzjUEBOMAoxAh7XNxyQk1gjRsHj2qYAciIrxEh4XNc0QE6mIkbD45qmAnLCrYgR8bie6YCcdC1iVDyuxQWQE/ciRsbjOtwAOXkPIr6Ot+F5WwynTePtM5NbUs2oKy9cAZm1AzEsHvOPA+TonXUF8XSUEDuvhgoByDCdiKHwmDsMIMO8xgoDeOW3bbXlz8MQ7/bVQCEAO/Fq5lCI7oBX8Pgzj1Xx6jEMoitgBx7f6WOFRXQD7MHjb2YWtl1YRBfAXjzALS0y4nTAtXiLIB6iIk4F3IoHv6VFRJwGqOItgniIhjgF0AoPfkuLhNgALumMH6zxarwoiEMBR+FFQhwGOBovCuIQwFl4ERDNAWfjeSOaAnrheSKaAXrjeSGaAEbB80CUAaPhzUaUARGYH5fiDU6cNo338Fzft+34Y/tzk3jDhQXghzPzuuPVTFcQ39ev23q0APx6MnkYvJrrAuKP+jVbjzIgwvFbmB+Z+o0QDOT6bYsMZxtyLi8s/vMbip/ve8Zze5xLTQbk7AyCukM9oBiUT4crZkM9om5RfOHljCaAcopXPEACii9eAiagKCB2zx2YgKKA2D13YAKKAmL33IEJKAqI3XMHvkFAccm23XMHip4JmICigNj9PwAAAP//PLIdGAAAAAZJREFUAwAArQK/DippwgAAAABJRU5ErkJggg==", de = (i, e) => {
52
+ const t = i.__vccOpts || i;
53
+ for (const [n, o] of e)
54
+ t[n] = o;
55
+ return t;
56
+ }, st = {
57
+ key: 0,
58
+ class: "player-header"
59
+ }, at = { class: "player-header-title" }, lt = { class: "player-header-content" }, it = { class: "player-header-right" }, rt = {
60
+ __name: "Header",
61
+ props: {
62
+ visible: {
63
+ type: Boolean,
64
+ default: !1
65
+ },
66
+ warning: {
67
+ type: Boolean,
68
+ default: !1
69
+ },
70
+ closeHeader: {
71
+ type: Boolean,
72
+ default: !0
73
+ },
74
+ dataInfo: {
75
+ type: Object,
76
+ default: () => ({})
77
+ }
78
+ },
79
+ emits: ["handle"],
80
+ setup(i, { emit: e }) {
81
+ const t = e, n = (o) => {
82
+ t("handle", o);
83
+ };
84
+ return (o, a) => i.visible ? (k(), D("div", st, [
85
+ h("div", at, [
86
+ h("span", {
87
+ style: me({ background: i.dataInfo.channelStatus == "Y" ? "#14CC70" : "#FF4847" })
88
+ }, null, 4),
89
+ Xe(W(i.dataInfo.channelName || i.dataInfo.deviceName), 1)
90
+ ]),
91
+ h("div", lt, [
92
+ Re(o.$slots, "default", {}, void 0, !0)
93
+ ]),
94
+ h("div", it, [
95
+ i.warning ? (k(), D("img", {
96
+ key: 0,
97
+ class: "close",
98
+ src: nt,
99
+ alt: "",
100
+ onClick: a[0] || (a[0] = (l) => n("warn"))
101
+ })) : T("", !0),
102
+ i.closeHeader ? (k(), D("img", {
103
+ key: 1,
104
+ class: "close",
105
+ src: ot,
106
+ alt: "",
107
+ onClick: a[1] || (a[1] = (l) => n("close"))
108
+ })) : T("", !0)
109
+ ])
110
+ ])) : T("", !0);
111
+ }
112
+ }, ct = /* @__PURE__ */ de(rt, [["__scopeId", "data-v-ec1dbde0"]]), ce = "data:image/png;base64,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", At = {
113
+ key: 0,
114
+ class: "loading-status-wrapper"
115
+ }, ut = { class: "loading-content" }, dt = { class: "status-icon" }, gt = ["src", "alt"], ft = { class: "status-title" }, pt = { class: "status-description" }, vt = {
116
+ __name: "LoadingStatus",
117
+ props: {
118
+ visible: {
119
+ type: Boolean,
120
+ default: !1
121
+ },
122
+ status: {
123
+ type: String,
124
+ default: "loading",
125
+ validator: (i) => ["loading", "offline", "error", "failed", "empty"].includes(i)
126
+ },
127
+ customConfig: {
128
+ type: Object,
129
+ default: () => ({})
130
+ }
131
+ },
132
+ setup(i) {
133
+ const e = i, t = U(() => ({
134
+ ...{
135
+ loading: {
136
+ title: "正在加载...",
137
+ description: "视频加载中,请稍候",
138
+ iconClass: "loading-icon"
139
+ },
140
+ offline: {
141
+ title: "设备已离线",
142
+ description: "设备处于离线状态,无法播放视频",
143
+ iconClass: "offline-icon",
144
+ icon: ce
145
+ },
146
+ error: {
147
+ title: "播放异常",
148
+ description: "视频播放出现异常,请稍后重试",
149
+ iconClass: "error-icon",
150
+ icon: ce
151
+ },
152
+ failed: {
153
+ title: "拉流失败",
154
+ description: "无法拉取视频流,请联系管理员",
155
+ iconClass: "failed-icon",
156
+ icon: ce
157
+ },
158
+ empty: {
159
+ title: "暂无视频",
160
+ description: "暂时没有可以播放的视频",
161
+ iconClass: "offline-icon",
162
+ icon: ce
163
+ }
164
+ }[e.status],
165
+ ...e.customConfig
166
+ }));
167
+ return (n, o) => i.visible ? (k(), D("div", At, [
168
+ h("div", ut, [
169
+ h("div", dt, [
170
+ t.value.icon ? (k(), D("img", {
171
+ key: 0,
172
+ src: t.value.icon,
173
+ alt: t.value.title
174
+ }, null, 8, gt)) : (k(), D("div", {
175
+ key: 1,
176
+ class: qe(["default-icon", t.value.iconClass])
177
+ }, null, 2))
178
+ ]),
179
+ h("h4", ft, W(t.value.title), 1),
180
+ h("p", pt, W(t.value.description), 1)
181
+ ])
182
+ ])) : T("", !0);
183
+ }
184
+ }, yt = /* @__PURE__ */ de(vt, [["__scopeId", "data-v-e1a38b30"]]);
185
+ class mt {
186
+ constructor(e = {}) {
187
+ this.options = {
188
+ icons: {
189
+ play: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAyklEQVR4AeyUsQrCMBCGG0Fw0M1NwcXFTVAfSxBcuzgIDoKLj+QoiJvg6qiTgotwfi027YW4hI4p9/Vyvf/+wA1tJDU/ylBEBiJyEpE37P7dRW8CV3jCsqpThjRSGEMLFoinZF9s+DiENmzR9cl5uIbd/Gv56pVHdXJ1tnYN1VRIEQ1DtqZn4g71PkKquMOQrekZd4d33U4eTl2Ut+Lwy3bONVwhOMIH9saYA9kX2X/zQuMFKTp7gTLMGjCDJswRe4PeGUbQgXVV9AUAAP//GmIRPQAAAAZJREFUAwCf2jQpKsdB4QAAAABJRU5ErkJggg==", import.meta.url),
190
+ pause: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABGUlEQVR4AayQsa4BQRiFd29uce8bKBRKiSg8gGglNDqNhE6joyNaCaVESSHxAiR0SgmJkkLpARQSCsn4RuzEbpad3bU5Z87sJP83J/NjfPmzAYUQbSHEBU9wJMhdNiCAJv7DRbwGmiN9yQn8fZmOsp8CHWJ5Cb/ecgLdJsoc7oBmSE/pACUkxrIEOsAf2+oC4T1UZf3Y1i8QnmG17bq1DQI0nl+d3AJNkEphgBISZ5ljpbBABbI2YYF7QAWsFBR4g9DDKdM0N6RSEOCB6TSgBr6yt8kvsM+0bLUiXaULPDKdpVENn9m/lQ5wxHQS0IL0lBMoH9sakq3ygCr4ZB16pRPYYUA+9JiUrWakL9mANGnhf1zC2q1eb7wDAAD//+lfkkQAAAAGSURBVAMALFpMKSPTSOsAAAAASUVORK5CYII=", import.meta.url),
191
+ fullscreen: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABRUlEQVR4AdSUMUpEMRCG3xMEi20FD6Dn0CPYLSJiKSIi3mSLLbYVVrD0CHoOPYCF5YKN8Pz+YSYkGxfzxMZl/kwy+f9/Ex6Zre6Pf2Y4DMMEXICbDKeb/gvOFOTcK9YT8c2QyTlYgFmGJaR91kV47YFizp2ztgOE4TYFxSPDreOk7/tX5kV47Yxi8KRh2e1oCEPNhScEM4dOoVoF9pfAeGw+gxTrhmnjt5MwfHODd89jUqE1Q46v6x2Q78c4iYum0Jqhb1QfQPUWYJq0ybBF2ML5R4b+AlpuVXFyrV2Zgp7NC3lasX8ooCm0ZohmFyj2NIxEoQ3DkR6b6euGR1wh2pKu8q0STmpfEA5BijD88MoxOdpSa/uSBln3qSEM9eSuKURLUm5tX+Jeor0DnRnydFZgDqwledYbFacC+6l9MZdmQV6J+AUAAP//g2nLXAAAAAZJREFUAwAzko4pTdl9FgAAAABJRU5ErkJggg==", import.meta.url),
192
+ exitFullscreen: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABdklEQVR4AdSTsUoDQRRFs2JhaWFhEVAJQgQFLYSAP6GgRBE/w9LO0s+IKCjoTwhpRMGAggFTWFhYWFoI47mzs+tsZjZBkibhHd7MfXfeZnZnpipj/kUbGmMWjDGHZc+i1oRarB5tiPEMWiyqkwuBtopwCacQRFnDaeeccdlPg2qVsoZ+g3+NbUO2UYMLuBF0aMCwaMjruCIvaoFtyGAT9mHbMU/+gS/oj08E1eTJ/LtoW5BuOUkSveQ1hA2PJfQe80KgvSMsg+9dQT9HSxtqgNCBRw8tVCkATw9870tmyraczUfOE9SQz16HdQ97DGLvAE8VfK9uj7XaLVPUvX1GefB4Ra8yLwSaHvSG6Huf0Jto+Ve+Y3INt44Psq7YHLk/ZhFUkyfz69jdo6cNOQI6BnvkHUGhDcOiLa/jgNzVArtlDcZFWcNv9wBdMTfM06BauuXc+jc4YahtdMiFYGu6FUeIxxBE9B+yqAt60cECCdRaENxz1X4BAAD//6yu9O4AAAAGSURBVAMAiPuSKSbbGX8AAAAASUVORK5CYII=", import.meta.url),
193
+ voiceIdle: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAwNJREFUaEPtmM+rTVEUxz/fKZIJGZBXjBSSkR/JhPT8Cr0nSUQUIvwD+Ac8hBCRgeRJBmRopCcDoSgDP5IBxcCPgaSWs7Wvzrvv3Hv2Ofvc7nl1d93JPWvvtT5rrb322luM86Fxbj89gG5HsBeBXgQiPdCRFDKz48B0YBbwFfgAnJT0JdLeMdMrBzCzh8CKDEO/A/2SHlUJEQRgZgPAgKTBdsq954/lGDhF0reqIHIBvPG3vMLhVhBmtga4F2DYkKSjAXJBIiEAzngXgcbIhDCzvcDFAK0jkpYEyAWJ5AK4VcwsFyIwff4ZJSlIbwhB8EKBEM2gmTZ0BaBAJHIhugZQFURXAaqA6DpALEQtAGIgagNQFqJWAGUgagdQFKKuAK6Fbm7kxrQd7kDMawpDTuCGTPBJ7L28HbjuJ1+QtK+xkJkdBM5kKG/ZAPo1FwJP/xtUsM0oCrAAeOaVPZa0OAWwEbjTwnvtutjdwGU/74Gk/k5GYBLwwyv4BfQlUfjsPTkBeAHMLgJhZmeBA37OqeSucKRjAN7Ql8Bcr8Rdcm6nojAqHULSyczc/M1edp2kkDvF/6ULpZAHOAfs9yv8BJZJep6CmAacB1Ym9+DJgRBPgE+S1hfxvpMtAzAReAdM9co+SpqZpdjMFgFvgMNNFSqrOq0t6v1SAD4KO5MXh6spo0eA5ZL+tPJgxoWnbXUKjUThCKRS5b57ZUgp+p1s4k2S3P+ZoxMQpQF8JA4Bp5usdZvwPfAWeA24lJuRlNj5/rmlr0k+KhJRAB5iNXAJyNwHgalQGiIawEPMA7b5cjgnx+gh90qXAF8BVqVkS0FUApA22MyWJk+Ju/yv8cmdHa7euz7oVWof3QU2xEBUDpAyzlKGnUhaHNfsjRlmdhPYUhai6wA+BV1JdqW5MYLTqRYAHsIVgj1FIWoD4CGuJaf8jhTEoKThdkWhVgAe4kZyfmwFco138p0EGLVpW23iFhvbdbltPd+Y1zGAwAMsWqwHEO3CyAV6EYh0YPT0XgSiXRi5wF8g6llAV+Km2QAAAABJRU5ErkJggg==", import.meta.url),
194
+ voicePending: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAwRJREFUaEPtWE2ITlEYfp6yshIbikJszEbYKGQsSKEoU8Ks/GxNUbORZKMos/WzMiZFUSixYELZGNmwMTFFsSErK/W479e5debM99177v3Olal76muae973Pc/z/pz7vpeY54vzHD8aISDpBIAtALY6B70E8IrktdQOS05A0hsAG3sAnSK5KSWJpAQk3QFwsATgXZJDqUgkIyDpKICbkcCGSY5HyhaKpSQQev88AHtmyzx+zkOSLAopCXwBsNwDOUhy0v6XtB3Ac2/vK8kV/1sE5AMiOcs5kgr365JJGYGWQJ0otBHIvVaW42X7dbxvOm0E2gjUzR2n16ZQm0JtCkV6ILjHx0iO+KqSPgNY6T0byPr+D66ZW5fNCe+9vRmSqwL9KwBO5c/CXqoXzOgilvQRwBpn6D7JAwEAmwVsJsiXtdOdbjT7a92o306PkxwO9O8B2O+eTZNcG+PbKgSsHTYgtt6SnDU2ujn4asyhAE6G87GkKQAbnP4kycEYW1UIHANw3TO6jOT3wItF83AuOmculrQ0I/XNs3Wc5I3UBCxnP3lGR0iOhYeUzMVdJzFJlvtWA/laTdJqqnRFR8AsSfLz/BcAm7redSFhtbAXwGa39zr7UvGw2xwsab2b1hY52Tn1UcSiKoGdGagnnkG7WYby26bUXYFAFi27nWxuHvC2dpF8GmurEgEXhVsADgckRrPvPY9iD3V29gC4GICfIHmkip3KBNzhPwAsDg4yMGdJ/ikCIGkBgAsARgO5nySXVAFvsrUIOBL+tZqf+wLABIBnmSenfTCS7B2yw0VvWwA0+toMCdYm0KWoQ9tW5DPuob2h8yIN5SoVbVICjsRpAJeqht7JnyF5uaZuR62vCOQHu/TYDSD/FWF6DKDzC9OsDpEkBIJcX5i1GvsA3A4AHcpahQckf9cB2ksnOQEvKo18iUteA70809RnlJZAbP62EYj0VFvEkY5qTKyxCDSGODDcEvhXnk7+Ji67Jvvdj3VM7RTqF2CZfkugzANlHux3v+z8fP8v3tB2QCJXKRMAAAAASUVORK5CYII=", import.meta.url),
195
+ voiceRecording: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAA0xJREFUaEPtmUuoTVEYgL+1pXtLKPdsj4GRgUfk0cVNklIKUQwMGGFArvKqO/C4e+1zRkIoxMCQkhJRBhQmuB5RiGRGuPZmSHKdn7P3uadz7sN+x6l96tSp9b++///3WvtfR9HkH9Xk8ZMD/OsKZlcBy2lH1EIPUEkPtvk4C9j0ASxnF7AVmDYg4NeIcYZi24k0QdID0O4ChHMgM/8eoHqBYgu68DANkPQALPd5cPD9If+BsAuz/h+A7i87UeXjEQPajW1G1RnkIp0KWM6rIXo+iOc1tjk9SChoPTlAZbeBR0GOhlmfn3R3Sg7Q7Xai5GQsAFE7KBZOxdKtKqUA0KtRhhUrCCnbFCfoWLo5QH/auvMK5C2U5BmCvIXyXShZBzVXC2l3O2UZRdE8XMNO8yS2nCMITyma58OmNfxJfKB3CiOMt57h+hM0rXeh+s1AMRVtvgkDER5gnzOJkXzwR0TVgy501Byk8Taq3QeI+CMoxmTstvfpAlSsWe59ED/w8q8OShN7vN/+GHksjMOajBi7auPlwU8LMUY8qK49wzbnhrUVvgIVi9o9gEhpUBv5cPEnssb2OYw2uzIC+LwEUXd945XZduRa9Fj/uYg7E5d6p9CnroDyZ2kxllNsu5kNgN8ut4BlvgO5h2pZjR77tebQHy+3DXkrAWcbxkj9bhzSehVYXNW/hm2uCRu8l8Yowp5syZnKTx6hGF3VvYFtrhxkJ8y9kHauI6zycyEOLWo2+82PUWKKDuC1i7MGoZK56kfdA45iFy6Hcm6564C9IItq8mXaKZlPQunXCcUD8CB6uxDj0ACHF1DGKcZ8e8qeyd8b1rS0wud5iNEJbGhYU6oTXTgdNfh4LVTvxWsT7qAY1eBc5AeGeuGdqqg+YA7IHKC1MXB+IOUN2BPCVW4IwvgV6Dd2yBnNN3UcZHPEDF5HtWxCj3Ej6g3IQRLtet1uZyOKFeB9xw1j9gOKi5TlPsXxl9JwnbwCQ0Whv8yg3Le+dlshVG4uzoV9PYgClg1AJYL60zWF65PhoHKAYcudVyDck5BOC1nObWBpOJf9h7d6iS4E/BkSbDE5QNNfq1SS1NQVCK5yphLJWyjT8IKN5wDBOcpWIq9AtvkNtv4bNaFMQA7/a3wAAAAASUVORK5CYII=", import.meta.url),
196
+ ptzControl: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAB7UlEQVR4AYyUsS5EQRSGZzdbKBQKhUKCN1Dq8AYKCQkJD0BCwlOQkPAACgUh4Q0old5gJbZQKBQKiU3W901m7t7dvVdWzn/PnHP++e9xZu42Q8Vfr9drgS1wB97Bb0Ib/wB2wETF1jAiCHEDYhtcg3UwC1oJ8/g1cAUUl8uyb4UgQnZ1QekGKIKL9sZzFehxhc2wumHfGfCFhGGgwxMye6Bsiqw2Go1nklWipMNBCOEMRIsd8gZbtxCT6ZHF9AFRfZ3oXtIITRYO9zyJlN0kwRN1ZxVhDKZAlZ3Cbdmh3TmPTLKTL4Jp4CEMQ8FPavJwhTn3DQU9tZyV5L+lYM5V+W+S8uSzLGxNwcUUWvQA9ClV72pmuqSgrbpzN5Fcj4XE3y2RZxTM8RVDncvBOD7xveQFXcGPFDn850RKqXqXeN5P92ViR8GXHOEtSvLKENaaJy1Pfpn0quBjOcNaklfGk/aAhuGVUVAe9AF7VPCWVAcMm4IrDH4hA8IK8MrgRszR3TYhdykdgWGzg2KmNTMr7zlA68cO/U7t8rJcTessukxcNTPS0c4RU2Pg1+aQUtU3HUWp6XEjZiPHORs7NOANXaDoJrHzwP1rzn2TPfvAsUVyIRgjHhRtfYGlX4A3wFN2g1Dknto28LDksuzbHwAAAP//IxdcMgAAAAZJREFUAwA7Yrnj1h+tswAAAABJRU5ErkJggg==", import.meta.url),
197
+ customAction: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAB8klEQVR4AbyUMSiEYRjHvxNFGQwM6gbiBmW4kUxC6JSBsiinrpCFUm4wKGQ53Q033EAMlIFMiqJuUDJZDAblBmUxUAaDOr//1/e97nPfdwvR8//+z/s8z/v/nu993lNl/fHf/wgWi8UoSPs1T7wanICwXz6ow3eKZ9k0D/+0TQJdQDWQ13wFQ6HQA2UrIINoH2wb/gzOEohT8wqXma+gqtiwBZ+BI4TagIQzrHPkzmFfCxR0qufgTyDhPbgAFkGgVRSkkyd2JkA70BAmiX3gB1pFQWeXBB3XGnedIK4oyLmtsXEE5ME9SBKbggMtUJCNY+zSpDXNafw40HnmyPXg+1qZIMVhoC72nR0Jzq0AbljrBbXwITWjoAHfYx5BCpbJPoIkUDe6j6f4rmnSGko9gRR4Zk8MNmYESUSJroIhuumAW8EL0Esg23QPL/CaqYnAGpjuqenUCJIcBHkKL2ELlpgENBSFhH4eKXLqUjUHrHU3delxLatUUL/NRjv6/dDd01DciGr0ufaar9J5qrs3O8CjVFBva6EoDTrBBHkdQQ52LYuTJRcDOqJd1nrJFWybEeQz1EkvUf0nuYXXwQLxY9g2fP2+t1loONewuhsgbh8Ba88n60zuSHaDGhABOyoqBbEN0ATqwDDQGZoS06GJ/NL5AgAA//8K+p9iAAAABklEQVQDAD0UoClDuWQ7AAAAAElFTkSuQmCC", import.meta.url),
198
+ mediaInfo: new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABl0lEQVR4AaSUPUvDUBSGk5DBwcGxg4PdHBwcOzj4B4QKQoUWdFRowW5uDi5uCgp2dFCwKNh/4ODSsYN7BTs4ODgKFuLzXmI0NrnppeU8uffmvOfN6elH4GW8oigKoQ538ApfMUPWB9iBuYxSb8IQYR3hEK5hCxYhjFlircIVyLzGmorEECN1dU5WRjJha40S2VvqLkEP5OilOpRZ09x1u+whPwUTpkOeoNaVMDf/Xd45n8V8sGZFEw+NygvYaLgqyBLq3rPv+20fOAwgL07wCtWhutM88oTT3tfcazLUpzZtUZGuKsPVIpVDviJDtepQY5WWZGhVuCZl+FZQtMyndwTH6FbAFiMZ9m0KcgugOYt59rYYyLBnU5Dr8x3chA3twRY9GXZRjGDW0Oi6AU8e43QIeVFhfo/whGAN8uIAr0916LG5QXUBWaGf5joJmSX/Kpz/RgcPvdPUv00bRQdcQ420fopMhzrwhDHss98GzYPFGpp7g5oWaGxGnBiaExeSar3Mdhf0DXhhVYGQyT3nBpTRalRsf+MbAAD//21UP8kAAAAGSURBVAMAqHSD40To4kIAAAAASUVORK5CYII=", import.meta.url)
199
+ },
200
+ ...e
201
+ };
202
+ }
203
+ getButtonConfigs() {
204
+ return [
205
+ {
206
+ type: "dynamic",
207
+ feature: "voiceIntercom",
208
+ getConfig: (e) => {
209
+ const t = {
210
+ idle: {
211
+ icon: this.options.icons.voiceIdle,
212
+ title: "开始语音对讲",
213
+ extraClass: "voice-idle"
214
+ },
215
+ pending: {
216
+ icon: this.options.icons.voicePending,
217
+ title: "语音对讲连接中",
218
+ extraClass: "voice-pending"
219
+ },
220
+ recording: {
221
+ icon: this.options.icons.voiceRecording,
222
+ title: "停止语音对讲",
223
+ extraClass: "voice-recording"
224
+ }
225
+ };
226
+ return {
227
+ ...t[e.voiceState] || t.idle,
228
+ clickEvent: "voiceStateChange",
229
+ disabled: e.voiceDisabled || !1
230
+ };
231
+ }
232
+ },
233
+ {
234
+ type: "simple",
235
+ feature: "ptzControl",
236
+ config: {
237
+ icon: this.options.icons.ptzControl,
238
+ title: "云台控制",
239
+ clickEvent: "ptzControlToggle"
240
+ }
241
+ },
242
+ {
243
+ type: "simple",
244
+ feature: "mediaInfo",
245
+ config: {
246
+ icon: this.options.icons.mediaInfo,
247
+ title: "信息面板",
248
+ clickEvent: "mediaInfoToggle"
249
+ }
250
+ },
251
+ {
252
+ type: "dynamic",
253
+ feature: "fullscreen",
254
+ getConfig: (e) => ({
255
+ icon: e.fullscreen ? this.options.icons.exitFullscreen : this.options.icons.fullscreen,
256
+ title: e.fullscreen ? "退出全屏" : "全屏",
257
+ clickEvent: "fullscreenToggle"
258
+ })
259
+ },
260
+ {
261
+ type: "dynamic",
262
+ feature: "playPause",
263
+ getConfig: (e) => ({
264
+ icon: e.playing ? this.options.icons.play : this.options.icons.pause,
265
+ title: e.playing ? "暂停" : "播放",
266
+ clickEvent: "playToggle"
267
+ })
268
+ }
269
+ ];
270
+ }
271
+ getButtonsToRender(e, t) {
272
+ const n = this.getButtonConfigs(), o = [];
273
+ return n.forEach((a) => {
274
+ e.includes(a.feature) && o.push({
275
+ ...a,
276
+ ...this.processButtonConfig(a, t)
277
+ });
278
+ }), o;
279
+ }
280
+ processButtonConfig(e, t) {
281
+ let n = {};
282
+ switch (e.type) {
283
+ case "simple":
284
+ n = { ...e.config };
285
+ break;
286
+ case "dynamic":
287
+ n = e.getConfig(t);
288
+ break;
289
+ }
290
+ return {
291
+ renderConfig: n,
292
+ buttonClass: `control-button ${e.feature}-btn ${n.extraClass || ""}`.trim()
293
+ };
294
+ }
295
+ }
296
+ class ht {
297
+ constructor(e, t = {}) {
298
+ this.container = e, this.options = t, this.buttons = /* @__PURE__ */ new Map(), this.eventHandlers = /* @__PURE__ */ new Map(), this.configManager = new mt(), this.states = {}, this.eventCallbacks = t.eventCallbacks || {};
299
+ }
300
+ async init(e = [], t = {}) {
301
+ this.states = { ...t }, await _e(), this.insertButtons(e);
302
+ }
303
+ insertButtons(e) {
304
+ var a;
305
+ const t = (a = this.container) == null ? void 0 : a.querySelector(".easyplayer-controls-right .easyplayer-controls-item-wrap");
306
+ if (!t) return;
307
+ const n = this.configManager.getButtonsToRender(e, this.states);
308
+ let o = t;
309
+ n.forEach((l) => {
310
+ var d, f;
311
+ const c = this.createButtonElement(l);
312
+ if (c) {
313
+ if (this.buttons.set(l.feature, {
314
+ element: c,
315
+ config: l,
316
+ state: this.getFeatureState(l.feature)
317
+ }), l.feature == "fullscreen") {
318
+ ((d = this.container) == null ? void 0 : d.querySelector(".easyplayer-controls-right")).appendChild(c);
319
+ return;
320
+ }
321
+ if (l.feature == "playPause") {
322
+ const r = (f = this.container) == null ? void 0 : f.querySelector(".easyplayer-controls-left");
323
+ r.insertBefore(c, r.firstChild);
324
+ return;
325
+ }
326
+ o.after(c), o = c;
327
+ }
328
+ });
329
+ }
330
+ createButtonElement(e) {
331
+ var f;
332
+ const { feature: t, renderConfig: n, buttonClass: o } = e, a = (f = this.container) == null ? void 0 : f.querySelector(`[data-feature="${t}"]`);
333
+ if (a) {
334
+ const r = this.eventHandlers.get(t);
335
+ if (r) {
336
+ const p = a.querySelector(".easyplayer-controls-item");
337
+ p == null || p.removeEventListener("click", r), this.eventHandlers.delete(t);
338
+ }
339
+ a.remove(), this.buttons.delete(t);
340
+ }
341
+ const l = document.createElement("div");
342
+ l.className = "easyplayer-controls-item-wrap", l.dataset.feature = t;
343
+ const c = document.createElement("div");
344
+ if (c.className = `easyplayer-controls-item ${o}`, c.title = n.title || "", n.disabled && c.classList.add("disabled"), n.icon) {
345
+ const r = document.createElement("img");
346
+ r.src = n.icon, r.alt = n.title || t, c.appendChild(r);
347
+ }
348
+ if (n.text) {
349
+ const r = document.createElement("span");
350
+ r.textContent = n.text, c.appendChild(r);
351
+ }
352
+ const d = (r) => {
353
+ if (r.stopPropagation(), n.disabled) return;
354
+ const p = n.clickEvent;
355
+ p && this.eventCallbacks[p] && this.eventCallbacks[p]({
356
+ feature: t,
357
+ event: r,
358
+ element: c,
359
+ states: this.states
360
+ });
361
+ };
362
+ return c.addEventListener("click", d), c.addEventListener("dblclick", (r) => {
363
+ r.stopPropagation();
364
+ }), this.eventHandlers.set(t, d), n.dropdownItems && this.createDropdown(l, n.dropdownItems, t), l.appendChild(c), l;
365
+ }
366
+ createDropdown(e, t, n) {
367
+ const o = document.createElement("div");
368
+ o.className = "easyplayer-dropdown", t.forEach((l) => {
369
+ const c = document.createElement("div");
370
+ if (c.className = `dropdown-item ${l.isActive ? "active" : ""}`, c.dataset.value = l.value, l.icon) {
371
+ const f = document.createElement("img");
372
+ f.src = l.icon, f.alt = l.label, c.appendChild(f);
373
+ }
374
+ const d = document.createElement("span");
375
+ d.textContent = l.label, c.appendChild(d), c.addEventListener("click", (f) => {
376
+ f.stopPropagation(), this.eventCallbacks.qualityChange && this.eventCallbacks.qualityChange({
377
+ feature: n,
378
+ value: l.value,
379
+ label: l.label
380
+ });
381
+ }), o.appendChild(c);
382
+ }), e.appendChild(o), e.querySelector(".easyplayer-controls-item").addEventListener("mouseenter", () => {
383
+ o.style.display = "block";
384
+ }), e.addEventListener("mouseleave", () => {
385
+ o.style.display = "none";
386
+ });
387
+ }
388
+ updateStates(e) {
389
+ this.states = { ...this.states, ...e }, this.refreshButtons();
390
+ }
391
+ refreshButtons() {
392
+ this.buttons.forEach((e, t) => {
393
+ e.config.type === "dynamic" && this.updateButton(t);
394
+ });
395
+ }
396
+ updateButton(e) {
397
+ const t = this.buttons.get(e);
398
+ if (!t) return;
399
+ const n = this.configManager.processButtonConfig(t.config, this.states), { renderConfig: o } = n, a = t.element.querySelector(".easyplayer-controls-item");
400
+ if (o.title && (a.title = o.title), o.icon) {
401
+ const l = a.querySelector("img");
402
+ l && (l.src = o.icon);
403
+ }
404
+ if (o.text) {
405
+ const l = a.querySelector("span");
406
+ l && (l.textContent = o.text);
407
+ }
408
+ a.className = `easyplayer-controls-item ${n.buttonClass}`, o.disabled ? a.classList.add("disabled") : a.classList.remove("disabled");
409
+ }
410
+ getFeatureState(e) {
411
+ return {
412
+ voiceIntercom: this.states.voiceState || "idle",
413
+ ptzControl: !1
414
+ }[e];
415
+ }
416
+ setButtonVisible(e, t) {
417
+ const n = this.buttons.get(e);
418
+ n && (n.element.style.display = t ? "" : "none");
419
+ }
420
+ removeButton(e) {
421
+ const t = this.buttons.get(e);
422
+ if (!t) return;
423
+ const n = this.eventHandlers.get(e);
424
+ n && (t.element.querySelector(".easyplayer-controls-item").removeEventListener("click", n), this.eventHandlers.delete(e)), t.element.remove(), this.buttons.delete(e);
425
+ }
426
+ removeAll() {
427
+ this.buttons.forEach((e, t) => {
428
+ this.removeButton(t);
429
+ });
430
+ }
431
+ destroy() {
432
+ this.removeAll(), this.buttons.clear(), this.eventHandlers.clear(), this.states = {};
433
+ }
434
+ }
435
+ const Ct = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAAtElEQVR4AZTQOwrCUBSEYRHEBxZWNm5AEKwtBF2Alb2lrb1YCW5AXIJiYSsIdta6GJcQvwgJxDwwYf7cm3NnJiHVSsEVBMEGb7TybLkFQjOhHTp4es4sySxgHgldEWlgczevWxNKFTD1OR741djg4LxmjZUocNhz8kLqTWahlm5bxIoLhLumN7RRpDXvKjJ8CwzCH3QxHOIf7WXmobFq07A5YoIyOslOwy9YSH3brGXUZD5/AAAA///42XjDAAAABklEQVQDAD9wPyApa+E9AAAAAElFTkSuQmCC", wt = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAw0lEQVR4AXyRMQoCMRBFkyAItoKNHsAjiGBnq4g3sBYrGwsvYG8n2FtqayUIdqLnsFYRi/gm7gZCNrv8x4Q/b9PEqJLPWluBSVJiWeP/HWwLJYQGyyOMQUUSQpPFCbrgEkgIbdo7yGT84yWEDtUN6hDESQgD2gtUIYpBmNMeIBm5aZncZguRWpyvkIzRWj/Z9uAMhZGbFOKLbR82EMVJ0iJ+mFNYQRAvSYv4hQXnGfgEUt4irjmP4A3x20kpIO6ZQ3j8AAAA//+0XKl6AAAABklEQVQDAANlMEk6jQKMAAAAAElFTkSuQmCC", Et = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAvUlEQVR4AYTOsQ7BUBTG8d4uRMyWvoDJKDaLSUw8g8liMPEAZiuz1SKxWCVWi8QbeAMihuv/3ahoe9vKOeeLfr80Da21Y7YaFPxCujW7BdZI7wipGHIOwAaZmRip6HKOwIhMzD9S0eLcgE3yN2mkos65ADukGx9SUeGcgQMyyEPqtHvgogwJzsrQFRUVoROgbYx55KENoCdAej98STEBvEg36TdNKefs27XfE6Mn/0eUKzIzQnee9gE70jsfAAAA//908sGmAAAABklEQVQDANhfMEHs/9RgAAAAAElFTkSuQmCC", bt = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAAtUlEQVR4AZyQPQrCQBCFd/dcIhaCndgqWHgAO1sPYG9naS+IraWglbUXsAkIVooY2HwvkIX8EJLA+5iX2ZnHZp33fgFdFTljzB4O0FZfFmbOWhtj5nCFNpqye9YNDObD5gQe0ERLdo4aTANkaETUIbygThtmt9lACFCDgye1Bz+o0o7mGoJyAeoSot8YyBe48K2r/6lBpQCdEHKjjiHTHTOiX7pZZQDDetgTdQVv6LOsh8bmlQAAAP//85JLtAAAAAZJREFUAwBQC1h3zTm47gAAAABJRU5ErkJggg==", Bt = "data:image/png;base64,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", kt = "data:image/png;base64,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";
436
+ function De(i, e = {}) {
437
+ const { initialPosition: t = { right: 2, bottom: 40 }, enabled: n = !0 } = e, o = B(!1), a = Z({ x: 0, y: 0 }), l = Z({
438
+ right: t.right,
439
+ bottom: t.bottom
440
+ }), c = U(() => ({
441
+ position: "absolute",
442
+ right: `${l.right}px`,
443
+ bottom: `${l.bottom}px`,
444
+ cursor: o.value ? "grabbing" : "grab",
445
+ zIndex: 1e3
446
+ })), d = (C) => {
447
+ if (!o.value || !n) return;
448
+ const Q = C.clientX - a.x, J = C.clientY - a.y;
449
+ a.x = C.clientX, a.y = C.clientY;
450
+ let x = l.right - Q, w = l.bottom - J;
451
+ if (i.value && i.value.parentElement) {
452
+ const H = i.value.parentElement.getBoundingClientRect(), m = i.value.getBoundingClientRect(), u = H.width - m.width, E = H.height - m.height;
453
+ x = Math.max(0, Math.min(x, u)), w = Math.max(0, Math.min(w, E));
454
+ }
455
+ l.right = x, l.bottom = w;
456
+ }, f = () => {
457
+ o.value = !1, document.removeEventListener("mousemove", d), document.removeEventListener("mouseup", f);
458
+ }, r = (C) => {
459
+ n && (o.value = !0, a.x = C.clientX, a.y = C.clientY, document.addEventListener("mousemove", d), document.addEventListener("mouseup", f), C.preventDefault());
460
+ }, p = () => {
461
+ l.right = t.right, l.bottom = t.bottom;
462
+ };
463
+ return Pe(() => {
464
+ document.removeEventListener("mousemove", d), document.removeEventListener("mouseup", f);
465
+ }), {
466
+ position: l,
467
+ isDragging: o,
468
+ controlStyle: c,
469
+ startDrag: r,
470
+ resetPosition: p
471
+ };
472
+ }
473
+ const Qt = { class: "box" }, St = { class: "icon-content" }, It = { class: "focal" }, Rt = {
474
+ __name: "PtzControlPanel",
475
+ props: {
476
+ visible: {
477
+ type: Boolean,
478
+ default: !1
479
+ }
480
+ },
481
+ emits: ["ptzControl"],
482
+ setup(i, { emit: e }) {
483
+ const t = i, n = B(null), { controlStyle: o, startDrag: a, resetPosition: l } = De(n, {
484
+ initialPosition: { right: 2, bottom: 40 },
485
+ enabled: !0
486
+ }), c = e, d = (f) => {
487
+ const p = {
488
+ up: 0,
489
+ down: 1,
490
+ left: 2,
491
+ right: 3,
492
+ zoomOut: 4,
493
+ zoomIn: 5
494
+ }[f];
495
+ c("ptzControl", {
496
+ direction: f,
497
+ command: p
498
+ });
499
+ };
500
+ return ue(
501
+ () => t.visible,
502
+ (f) => {
503
+ f && l();
504
+ }
505
+ ), (f, r) => i.visible ? (k(), D("div", {
506
+ key: 0,
507
+ ref_key: "refPtzControl",
508
+ ref: n,
509
+ class: "ptz-control",
510
+ style: me(X(o)),
511
+ onMousedown: r[6] || (r[6] = (...p) => X(a) && X(a)(...p))
512
+ }, [
513
+ h("div", Qt, [
514
+ h("div", St, [
515
+ h("img", {
516
+ class: "icon-t",
517
+ src: Ct,
518
+ alt: "上",
519
+ onClick: r[0] || (r[0] = (p) => d("up"))
520
+ }),
521
+ h("img", {
522
+ class: "icon-l",
523
+ src: wt,
524
+ alt: "左",
525
+ onClick: r[1] || (r[1] = (p) => d("left"))
526
+ }),
527
+ h("img", {
528
+ class: "icon-r",
529
+ src: Et,
530
+ alt: "右",
531
+ onClick: r[2] || (r[2] = (p) => d("right"))
532
+ }),
533
+ h("img", {
534
+ class: "icon-b",
535
+ src: bt,
536
+ alt: "下",
537
+ onClick: r[3] || (r[3] = (p) => d("down"))
538
+ })
539
+ ]),
540
+ h("div", It, [
541
+ h("img", {
542
+ src: Bt,
543
+ alt: "放大",
544
+ onClick: r[4] || (r[4] = (p) => d("zoomOut"))
545
+ }),
546
+ h("img", {
547
+ src: kt,
548
+ alt: "缩小",
549
+ onClick: r[5] || (r[5] = (p) => d("zoomIn"))
550
+ })
551
+ ])
552
+ ])
553
+ ], 36)) : T("", !0);
554
+ }
555
+ }, Pt = /* @__PURE__ */ de(Rt, [["__scopeId", "data-v-4376ba31"]]), Ut = { class: "media-info-content" }, Dt = { class: "video-info-item" }, xt = { class: "info-value" }, Ot = { class: "video-info-item" }, Mt = { class: "info-value" }, Tt = { class: "video-info-item" }, Ft = { class: "info-value" }, zt = {
556
+ __name: "MediaInfoPanel",
557
+ props: {
558
+ visible: {
559
+ type: Boolean,
560
+ default: !1
561
+ },
562
+ mediaInfo: {
563
+ type: Object,
564
+ default: () => ({})
565
+ }
566
+ },
567
+ setup(i) {
568
+ const e = i, t = B(null), { controlStyle: n, startDrag: o, resetPosition: a } = De(t, {
569
+ initialPosition: { right: 2, bottom: 40 },
570
+ enabled: !0
571
+ });
572
+ return ue(
573
+ () => e.visible,
574
+ (l) => {
575
+ l && a();
576
+ }
577
+ ), (l, c) => i.visible ? (k(), D("div", {
578
+ key: 0,
579
+ ref_key: "mediaInfoPanelRef",
580
+ ref: t,
581
+ class: "media-info-wrapper",
582
+ style: me(X(n)),
583
+ onMousedown: c[0] || (c[0] = (...d) => X(o) && X(o)(...d))
584
+ }, [
585
+ h("div", Ut, [
586
+ h("div", Dt, [
587
+ c[1] || (c[1] = h("span", { class: "info-label" }, "分辨率:", -1)),
588
+ h("span", xt, W(i.mediaInfo.width + "x" + i.mediaInfo.height), 1)
589
+ ]),
590
+ h("div", Ot, [
591
+ c[2] || (c[2] = h("span", { class: "info-label" }, "视频编码:", -1)),
592
+ h("span", Mt, W(i.mediaInfo.encType || "--"), 1)
593
+ ]),
594
+ h("div", Tt, [
595
+ c[3] || (c[3] = h("span", { class: "info-label" }, "码率:", -1)),
596
+ h("span", Ft, W(i.mediaInfo.kbps + " KB/S"), 1)
597
+ ])
598
+ ])
599
+ ], 36)) : T("", !0);
600
+ }
601
+ }, Vt = /* @__PURE__ */ de(zt, [["__scopeId", "data-v-825c2b68"]]), Kt = {
602
+ __name: "ContextMenu",
603
+ props: {
604
+ actualFeatures: {
605
+ type: Array,
606
+ default: () => []
607
+ }
608
+ },
609
+ emits: ["menuAction"],
610
+ setup(i, { expose: e, emit: t }) {
611
+ const n = i, o = t, a = B(!1), l = ie(null), c = ie(null), d = ie(null), f = ie(null);
612
+ Ue(async () => {
613
+ try {
614
+ const m = await Promise.resolve().then(() => Xt);
615
+ l.value = m.default, c.value = m.ContextMenuItem, d.value = m.ContextMenuGroup, f.value = m.ContextMenuSeparator, a.value = !0;
616
+ } catch {
617
+ console.warn("[EasyPlayer] @imengyu/vue3-context-menu 未安装,右键菜单功能不可用。如需使用请安装: npm install @imengyu/vue3-context-menu");
618
+ }
619
+ });
620
+ const r = B(!1), p = B(null), C = B({}), Q = Z({
621
+ zIndex: 9999,
622
+ minWidth: 160,
623
+ x: 500,
624
+ y: 200
625
+ }), J = [
626
+ {
627
+ type: "item",
628
+ label: "暂停播放",
629
+ action: "playPause"
630
+ },
631
+ {
632
+ type: "item",
633
+ label: "画面截图",
634
+ action: "screenshot"
635
+ },
636
+ {
637
+ type: "item",
638
+ label: "画面连续截图",
639
+ action: "continuousScreenshot"
640
+ },
641
+ {
642
+ type: "item",
643
+ label: "云台控制",
644
+ action: "ptzControl"
645
+ },
646
+ {
647
+ type: "group",
648
+ label: "清晰度切换",
649
+ action: "quality",
650
+ children: [
651
+ {
652
+ type: "item",
653
+ action: "quality",
654
+ params: { quality: "标清" }
655
+ },
656
+ { type: "separator" },
657
+ {
658
+ type: "item",
659
+ action: "quality",
660
+ params: { quality: "高清" }
661
+ },
662
+ { type: "separator" },
663
+ {
664
+ type: "item",
665
+ action: "quality",
666
+ params: { quality: "超清" }
667
+ }
668
+ ]
669
+ },
670
+ {
671
+ type: "item",
672
+ label: "关闭视频",
673
+ action: "stopPlay"
674
+ },
675
+ {
676
+ type: "item",
677
+ action: "fullscreen"
678
+ }
679
+ ], x = U(() => J.filter((u) => n.actualFeatures.includes(u.action)).map((u) => {
680
+ const E = { ...u };
681
+ switch (u.action) {
682
+ case "recordScreen":
683
+ E.label = C.value.recording ? "停止录屏" : "画面录屏";
684
+ break;
685
+ case "fullscreen":
686
+ E.label = C.value.fullscreen ? "退出全屏" : "全屏播放";
687
+ break;
688
+ default:
689
+ !E.label && u.action && (E.label = u.label);
690
+ }
691
+ return u.type === "group" && u.children && (E.children = u.children.map((F) => {
692
+ var S;
693
+ const I = { ...F };
694
+ if (F.action === "quality") {
695
+ const g = (S = F.params) == null ? void 0 : S.quality;
696
+ I.label = g + (C.value.currentQuality === g ? " ✓" : "");
697
+ }
698
+ return I;
699
+ })), E;
700
+ })), w = (m) => {
701
+ o("menuAction", {
702
+ action: m.action,
703
+ value: m.params
704
+ }), r.value = !1;
705
+ }, O = () => {
706
+ const m = document.querySelector("#mx-menu-default-container");
707
+ m && p.value && p.value.appendChild(m);
708
+ };
709
+ return e({
710
+ init: (m, u, E) => {
711
+ a.value && (p.value = E, O(), r.value = !0, Q.x = m.x, Q.y = m.y, C.value = {
712
+ ...u,
713
+ volume: Math.floor((u.volume || 0) * 100),
714
+ speakerVolume: 20
715
+ });
716
+ }
717
+ }), (m, u) => a.value ? (k(), $(ee(l.value), {
718
+ key: 0,
719
+ show: r.value,
720
+ "onUpdate:show": u[0] || (u[0] = (E) => r.value = E),
721
+ options: Q
722
+ }, {
723
+ default: ke(() => [
724
+ (k(!0), D(re, null, Qe(x.value, (E, F) => (k(), D(re, { key: F }, [
725
+ E.type === "item" ? (k(), $(ee(c.value), {
726
+ key: 0,
727
+ label: E.label,
728
+ onClick: (I) => w(E)
729
+ }, null, 8, ["label", "onClick"])) : E.type === "group" ? (k(), $(ee(d.value), {
730
+ key: 1,
731
+ label: E.label
732
+ }, {
733
+ default: ke(() => [
734
+ (k(!0), D(re, null, Qe(E.children, (I, S) => (k(), D(re, { key: S }, [
735
+ I.type === "separator" ? (k(), $(ee(f.value), { key: 0 })) : I.type === "item" ? (k(), $(ee(c.value), {
736
+ key: 1,
737
+ label: I.label,
738
+ onClick: (g) => w(I)
739
+ }, null, 8, ["label", "onClick"])) : T("", !0)
740
+ ], 64))), 128))
741
+ ]),
742
+ _: 2
743
+ }, 1032, ["label"])) : T("", !0)
744
+ ], 64))), 128))
745
+ ]),
746
+ _: 1
747
+ }, 40, ["show", "options"])) : T("", !0);
748
+ }
749
+ };
750
+ class Jt {
751
+ constructor(e) {
752
+ if (!e.url)
753
+ throw new Error("url不能为空");
754
+ if (e.max && typeof e.max != "number")
755
+ throw new Error("max必须是数字");
756
+ if (e.interval && typeof e.interval != "number")
757
+ throw new Error("interval必须是数字");
758
+ this.url = e.url, this.socket = null, this.reconnectAttempts = 0, this.maxReconnectAttempts = e.max || 3, this.reconnectInterval = e.interval || 5 * 1e3, this.reconnectTimeout = null, this.config = e;
759
+ }
760
+ connect() {
761
+ return new Promise((e, t) => {
762
+ this.reconnectTimeout && (clearTimeout(this.reconnectTimeout), this.reconnectTimeout = null), this.socket = new WebSocket(this.url), this.socket.onopen = () => {
763
+ console.log("[EasyPlayer] WebSocket 连接成功"), this.reconnectAttempts = 0, e();
764
+ }, this.socket.onerror = (n) => {
765
+ console.error("[EasyPlayer] WebSocket 连接失败:", n), t(n);
766
+ }, this.socket.onmessage = () => {
767
+ }, this.socket.onclose = () => {
768
+ this.config.onclosed && this.config.onclosed instanceof Function && this.config.onclosed(), console.log("[EasyPlayer] WebSocket 连接关闭");
769
+ };
770
+ });
771
+ }
772
+ reconnect(e) {
773
+ return new Promise((t, n) => {
774
+ this.reconnectAttempts < this.maxReconnectAttempts ? this.reconnectTimeout = setTimeout(() => {
775
+ this.reconnectAttempts++, console.log(`[EasyPlayer] 尝试第 ${this.reconnectAttempts} 次重新连接...`), t(this.connect());
776
+ }, this.reconnectInterval) : (console.log("[EasyPlayer] 达到最大重试次数,停止重新连接"), n(e), this.reconnectAttempts = 0);
777
+ });
778
+ }
779
+ sendMessage(e) {
780
+ var t;
781
+ this.socket && this.socket.readyState === WebSocket.OPEN ? this.socket.send(e) : console.error("[EasyPlayer] WebSocket 未连接,无法发送消息", (t = this.socket) == null ? void 0 : t.readyState);
782
+ }
783
+ close() {
784
+ this.socket && (this.reconnectTimeout && (clearTimeout(this.reconnectTimeout), this.reconnectTimeout = null), this.socket.close(), this.socket = null);
785
+ }
786
+ isConnected() {
787
+ return this.socket && this.socket.readyState === WebSocket.OPEN;
788
+ }
789
+ }
790
+ class oe {
791
+ constructor() {
792
+ if (oe.instance)
793
+ return oe.instance;
794
+ this.instances = /* @__PURE__ */ new Map(), this.mode = "single", oe.instance = this;
795
+ }
796
+ register(e, t, n) {
797
+ this.instances.set(e, {
798
+ voiceState: "idle",
799
+ deviceInfo: n,
800
+ updateStateFn: t
801
+ });
802
+ }
803
+ unregister(e) {
804
+ this.instances.delete(e);
805
+ }
806
+ updateInstanceState(e, t) {
807
+ const n = this.instances.get(e);
808
+ n && (n.voiceState = t);
809
+ }
810
+ checkConflict(e) {
811
+ if (this.mode === "multiple")
812
+ return { allowed: !0 };
813
+ const t = this.getActiveInstances(e);
814
+ return t.length === 0 ? { allowed: !0 } : {
815
+ allowed: !1,
816
+ conflictInstances: t[0]
817
+ };
818
+ }
819
+ getActiveInstances(e) {
820
+ const t = [];
821
+ return this.instances.forEach((n, o) => {
822
+ o !== e && (n.voiceState === "recording" || n.voiceState === "pending") && t.push({
823
+ instanceId: o,
824
+ deviceName: n.deviceInfo.deviceName,
825
+ deviceInfo: n.deviceInfo
826
+ });
827
+ }), t;
828
+ }
829
+ async stopConflictInstances(e) {
830
+ const t = this.instances.get(e.instanceId);
831
+ return t && t.updateStateFn ? Promise.resolve(t.updateStateFn("idle")) : Promise.resolve();
832
+ }
833
+ }
834
+ const L = new oe();
835
+ function Ht(i, e, t) {
836
+ const n = new Uint8Array([
837
+ 89,
838
+ 86,
839
+ 238,
840
+ 1,
841
+ 102,
842
+ 0,
843
+ 0,
844
+ 0,
845
+ 0,
846
+ 0,
847
+ 0,
848
+ 0,
849
+ 0,
850
+ 0,
851
+ 66,
852
+ 89,
853
+ 0,
854
+ 0,
855
+ 0,
856
+ 0,
857
+ 0,
858
+ 0
859
+ ]);
860
+ if (!i || i.length !== 36)
861
+ throw new Error("任务GUID必须是36字符长度的字符串");
862
+ if (e.length !== t)
863
+ throw new Error(`PCM数据必须是 ${t} 字节`);
864
+ const o = new Uint8Array(36);
865
+ for (let d = 0; d < i.length; d++)
866
+ o[d] = i.charCodeAt(d);
867
+ const a = n.length + o.length + e.length, l = new Uint8Array(a);
868
+ let c = 0;
869
+ return l.set(n, c), c += n.length, l.set(o, c), c += o.length, l.set(e, c), l.buffer;
870
+ }
871
+ let Ae = null;
872
+ const Yt = async () => {
873
+ if (Ae) return Ae;
874
+ try {
875
+ const i = await Promise.resolve().then(() => _t);
876
+ return await Promise.resolve().then(() => en), Ae = i.default || i, Ae;
877
+ } catch {
878
+ return console.warn("[EasyPlayer] recorder-core 未安装,语音对讲功能不可用。如需使用请安装: npm install recorder-core"), null;
879
+ }
880
+ }, Gt = (i) => {
881
+ const e = Date.now(), t = Math.random().toString(36).substr(2, 6);
882
+ return `voice_${i == null ? void 0 : i.deviceCode}_${i == null ? void 0 : i.channelCode}_${e}_${t}`;
883
+ }, Nt = (i, e, t, n, o) => {
884
+ const a = B(null), l = B(!1), c = B(!1), d = B(0), f = B(null), r = B(null), p = 440;
885
+ let C = new Uint8Array(0);
886
+ const Q = Gt(i.value), J = B(""), x = (v) => {
887
+ e.voiceState = v, L.updateInstanceState(Q, v);
888
+ };
889
+ L.register(Q, x, i.value);
890
+ const w = async () => {
891
+ const { allowed: v, conflictInstances: y } = L.checkConflict(Q);
892
+ return v ? Promise.resolve() : new Promise((b, P) => {
893
+ const z = o.value || o;
894
+ z && z.confirm ? z.confirm({
895
+ title: "语音对讲冲突",
896
+ content: `当前 ${y.deviceName} 正在进行语音对讲,是否停止并切换?`,
897
+ okText: "确认停止",
898
+ cancelText: "取消",
899
+ onOk: async () => {
900
+ await L.stopConflictInstances(y), b();
901
+ },
902
+ onCancel: () => {
903
+ P();
904
+ }
905
+ }) : L.stopConflictInstances(y).then(() => {
906
+ b();
907
+ });
908
+ });
909
+ }, O = async () => {
910
+ const v = await Yt();
911
+ if (!v)
912
+ throw new Error("recorder-core 未安装");
913
+ return new Promise((y, b) => {
914
+ a.value = v({
915
+ type: "pcm",
916
+ sampleRate: 22050,
917
+ bitRate: 16,
918
+ onProcess: function(P, z, G) {
919
+ const N = P[P.length - 1];
920
+ E(N), d.value = Date.now(), f.value && f.value.input(P[P.length - 1], z, G);
921
+ }
922
+ }), a.value.open(
923
+ function() {
924
+ l.value = !0, v.WaveView && (f.value = v.WaveView({ elem: ".recwave" })), y(!0);
925
+ },
926
+ function(P, z) {
927
+ l.value = !1;
928
+ const G = n.value || n, N = o.value || o;
929
+ z ? G && G.error && G.error("已拒绝麦克风权限,无法正常使用录音功能") : P.includes("https") ? N && N.confirm && N.confirm({
930
+ title: "麦克风权限受限",
931
+ content: "为保护您的隐私安全,浏览器出于安全限制无法访问麦克风。请使用HTTPS协议访问页面。",
932
+ okText: "知道了",
933
+ showCancel: !1
934
+ }) : console.error("[EasyPlayer] 录音初始化出错:", P), b(P);
935
+ }
936
+ );
937
+ });
938
+ }, H = () => {
939
+ c.value = !0, a.value.start();
940
+ const v = a.value.watchDogTimer = setInterval(function() {
941
+ if (!a.value || v != a.value.watchDogTimer) {
942
+ clearInterval(v);
943
+ return;
944
+ }
945
+ Date.now() < a.value.wdtPauseT || Date.now() - (d.value || y) > 1500 && (clearInterval(v), console.error(d.value ? "[EasyPlayer] 录音被中断" : "[EasyPlayer] 录音未能正常开始"), c.value = !1);
946
+ }, 1e3), y = Date.now();
947
+ a.value.wdtPauseT = 0, d.value = 0;
948
+ }, m = () => new Promise((v, y) => {
949
+ a.value.watchDogTimer = 0, a.value.stop(
950
+ function(b) {
951
+ c.value = !1;
952
+ const P = window.URL.createObjectURL(b);
953
+ a.value.close(), a.value = null, v({ blob: b, localUrl: P });
954
+ },
955
+ function(b) {
956
+ y(b), I(), a.value.close(), a.value = null;
957
+ }
958
+ );
959
+ }), u = (v) => {
960
+ const y = new Uint8Array(v.buffer, v.byteOffset, v.byteLength), b = new Uint8Array(C.length + y.length);
961
+ b.set(C, 0), b.set(y, C.length), C = b;
962
+ }, E = (v) => {
963
+ for (u(v); C.length >= p; ) {
964
+ const y = C.slice(0, p), b = Ht(J.value, y, p);
965
+ r.value.sendMessage(b), C = C.slice(p);
966
+ }
967
+ }, F = async () => {
968
+ const v = t.value || t;
969
+ if (!v || !v.start)
970
+ throw new Error("[EasyPlayer] 未配置语音对讲API (voiceIntercomApi.start)");
971
+ const { data: y } = await v.start({
972
+ channelCode: i.value.channelCode,
973
+ terminalType: "pc"
974
+ });
975
+ J.value = y.taskId;
976
+ let b;
977
+ if (v.wsUrlBuilder)
978
+ b = v.wsUrlBuilder(y);
979
+ else if (y.testDomain)
980
+ b = `wss://${y.testDomain}`;
981
+ else if (y.ip && y.port)
982
+ b = `wss://${y.ip}:${y.port}`;
983
+ else
984
+ throw new Error("[EasyPlayer] 无法构建WebSocket连接地址");
985
+ r.value = new Jt({
986
+ url: b,
987
+ onclosed: g
988
+ }), await r.value.connect(), H();
989
+ }, I = async () => {
990
+ C = new Uint8Array(0), r.value && r.value.close(), r.value = null;
991
+ const v = t.value || t;
992
+ if (v && v.stop)
993
+ try {
994
+ await v.stop({
995
+ channelCode: i.value.channelCode,
996
+ terminalType: "pc"
997
+ });
998
+ } catch (y) {
999
+ console.warn("[EasyPlayer] 停止语音对讲服务失败:", y);
1000
+ }
1001
+ }, S = async () => {
1002
+ if (e.voiceState === "idle")
1003
+ try {
1004
+ await w(), x("pending"), await O(), await F(), x("recording");
1005
+ } catch {
1006
+ g();
1007
+ }
1008
+ }, g = async () => {
1009
+ if (e.voiceState !== "idle")
1010
+ try {
1011
+ await m(), await I(), x("idle");
1012
+ } catch {
1013
+ x("idle");
1014
+ }
1015
+ }, ge = async () => {
1016
+ e.voiceState === "idle" ? S() : g();
1017
+ };
1018
+ return Pe(() => {
1019
+ L.unregister(Q), e.voiceState !== "idle" && g();
1020
+ }), {
1021
+ instanceId: Q,
1022
+ startIntercom: S,
1023
+ stopIntercom: g,
1024
+ toggleIntercom: ge
1025
+ };
1026
+ }, jt = {
1027
+ ref: "PlayerContainer",
1028
+ class: "player-box"
1029
+ }, Lt = { class: "loading" }, Ie = 3, Wt = {
1030
+ __name: "EasyPlayer",
1031
+ props: {
1032
+ // 设备参数
1033
+ data: {
1034
+ type: Object,
1035
+ required: !0,
1036
+ default: () => ({
1037
+ deviceCode: "",
1038
+ channelCode: "",
1039
+ channelStatus: "N"
1040
+ })
1041
+ },
1042
+ // 加载状态配置
1043
+ loadingConfig: {
1044
+ type: Object,
1045
+ default: () => ({})
1046
+ },
1047
+ // 需要隐藏的按钮
1048
+ excludeFeatures: {
1049
+ type: Array,
1050
+ default: () => []
1051
+ },
1052
+ // 是否显示头部标题
1053
+ visibleHeader: {
1054
+ type: Boolean,
1055
+ default: !0
1056
+ },
1057
+ // 是否显示预警按钮
1058
+ warning: {
1059
+ type: Boolean,
1060
+ default: !1
1061
+ },
1062
+ // 是否显示关闭按钮
1063
+ closeHeader: {
1064
+ type: Boolean,
1065
+ default: !0
1066
+ },
1067
+ // 自定义获取视频流地址,需返回 Promise<{ url: string }>
1068
+ // 优先级:customerGetVideoUrl > plugin配置 > 直接使用videoUrl
1069
+ customerGetVideoUrl: {
1070
+ type: Function,
1071
+ default: null
1072
+ },
1073
+ // 是否启用右键菜单
1074
+ visibleContextMenu: {
1075
+ type: Boolean,
1076
+ default: !1
1077
+ },
1078
+ // 云台控制回调 (command, data) => void
1079
+ onPtzControl: {
1080
+ type: Function,
1081
+ default: null
1082
+ },
1083
+ // 语音对讲API配置
1084
+ voiceIntercomApi: {
1085
+ type: Object,
1086
+ default: null
1087
+ // { start: (data) => Promise<{taskId, ip, port, testDomain}>,
1088
+ // stop: (data) => Promise<any>,
1089
+ // wsUrlBuilder: (data) => string }
1090
+ },
1091
+ // 消息提示服务,默认使用 console
1092
+ messageService: {
1093
+ type: Object,
1094
+ default: null
1095
+ // { error: (msg) => void, success: (msg) => void, warning: (msg) => void, info: (msg) => void }
1096
+ },
1097
+ // 模态框服务,用于确认对话框
1098
+ modalService: {
1099
+ type: Object,
1100
+ default: null
1101
+ // { confirm: (options) => void }
1102
+ }
1103
+ },
1104
+ emits: ["close", "play", "clickHandle", "warn"],
1105
+ setup(i, { expose: e, emit: t }) {
1106
+ const n = t, o = i, a = $e("sldzEasyPlayerConfig", {}), l = (s, A) => s || (a[A] ? a[A] : null), c = U(() => l(o.messageService, "messageService") || {
1107
+ error: (s) => console.error("[EasyPlayer]", s),
1108
+ success: (s) => console.log("[EasyPlayer]", s),
1109
+ warning: (s) => console.warn("[EasyPlayer]", s),
1110
+ info: (s) => console.info("[EasyPlayer]", s)
1111
+ }), d = U(() => l(o.modalService, "modalService") || {
1112
+ confirm: ({ title: s, content: A, onOk: R, onCancel: K }) => {
1113
+ confirm(`${s}
1114
+ ${typeof A == "string" ? A : "请确认"}`) ? R && R() : K && K();
1115
+ }
1116
+ }), f = U(() => l(o.voiceIntercomApi, "voiceIntercomApi")), r = U(() => o.customerGetVideoUrl ? o.customerGetVideoUrl : a.getVideoUrl ? a.getVideoUrl : null), p = U(() => o.onPtzControl ? o.onPtzControl : a.onPtzControl ? a.onPtzControl : null), C = [
1117
+ "audio",
1118
+ "record",
1119
+ "quality",
1120
+ "screenshot",
1121
+ "mediaInfo",
1122
+ "fullscreen",
1123
+ "continuousScreenshot",
1124
+ "playPause",
1125
+ "stopPlay"
1126
+ ], Q = U(() => {
1127
+ const { ptzFlag: s = 0, voiceFlag: A = 0 } = o.data || {}, R = [...C];
1128
+ s == 1 && R.push("ptzControl"), A == 1 && f.value && R.push("voiceIntercom");
1129
+ const K = new Set(o.excludeFeatures);
1130
+ return R.filter((ye) => !K.has(ye));
1131
+ }), J = ["audio", "record", "quality", "screenshot"], x = U(
1132
+ () => Object.fromEntries(J.filter((s) => !Q.value.includes(s)).map((s) => [s, !1]))
1133
+ );
1134
+ ue(
1135
+ () => o.data,
1136
+ () => {
1137
+ Ke(), j();
1138
+ }
1139
+ );
1140
+ const w = B(null), O = Se("PlayerContainer"), H = Se("easyPlayerProRef"), m = B(null), u = Z({
1141
+ quieting: !0,
1142
+ recording: !1,
1143
+ kbps: 0,
1144
+ width: 0,
1145
+ height: 0,
1146
+ encType: "",
1147
+ encTypeAudio: "",
1148
+ sampleRate: "",
1149
+ channels: "",
1150
+ currentQuality: "超清",
1151
+ userPaused: !1
1152
+ }), E = U(() => o.visibleHeader && !u.recording), F = U(() => o.warning && g.playing), I = B(""), S = Z({
1153
+ visible: !1,
1154
+ status: "loading",
1155
+ config: {}
1156
+ }), g = Z({
1157
+ voiceState: "idle",
1158
+ voiceDisabled: !1,
1159
+ ptzControl: !1,
1160
+ mediaInfo: !1,
1161
+ fullscreen: !1,
1162
+ playing: !1
1163
+ }), { toggleIntercom: ge, stopIntercom: v } = Nt(
1164
+ U(() => o.data),
1165
+ g,
1166
+ U(() => f.value),
1167
+ c,
1168
+ d
1169
+ ), y = (s, A = {}) => {
1170
+ S.visible = !0, S.status = s, S.config = {
1171
+ ...o.loadingConfig[s],
1172
+ ...A
1173
+ };
1174
+ }, b = () => {
1175
+ S.visible = !1;
1176
+ }, P = async (s) => {
1177
+ switch (s) {
1178
+ case "close":
1179
+ se(), n("close");
1180
+ break;
1181
+ case "warn":
1182
+ if (!w.value) return;
1183
+ {
1184
+ const A = w.value.screenshot("warn", "png", 0.5, "blob");
1185
+ n("warn", { file: new File([A], "warn.png", { type: A.type }) });
1186
+ }
1187
+ break;
1188
+ }
1189
+ }, z = async () => {
1190
+ w.value = new tt(O.value, {
1191
+ btns: x.value
1192
+ }), Ne(), await j();
1193
+ }, G = async () => {
1194
+ Ce(), m.value = new ht(O.value, {
1195
+ eventCallbacks: {
1196
+ voiceStateChange: N,
1197
+ ptzControlToggle: he,
1198
+ mediaInfoToggle: xe,
1199
+ fullscreenToggle: fe,
1200
+ playToggle: we
1201
+ }
1202
+ }), await m.value.init(Q.value, g), ae();
1203
+ }, N = ({ states: s }) => {
1204
+ s.voiceState === "idle" ? ge() : s.voiceState === "recording" && v();
1205
+ };
1206
+ ue(
1207
+ () => g.voiceState,
1208
+ () => {
1209
+ m.value && m.value.updateStates(g);
1210
+ }
1211
+ );
1212
+ const he = () => {
1213
+ g.ptzControl = !g.ptzControl;
1214
+ }, xe = () => {
1215
+ g.mediaInfo = !g.mediaInfo;
1216
+ }, Oe = ({ command: s }) => {
1217
+ p.value ? p.value(s, o.data) : console.warn("[EasyPlayer] 未配置 onPtzControl 回调,无法执行云台控制");
1218
+ }, Y = B(null), Me = () => {
1219
+ Y.value && clearTimeout(Y.value), Y.value = setTimeout(() => {
1220
+ n("clickHandle", { ...o.data });
1221
+ }, 300);
1222
+ }, fe = () => {
1223
+ var s;
1224
+ Y.value && (clearTimeout(Y.value), Y.value = null), g.fullscreen = !g.fullscreen, (s = m.value) == null || s.updateStates(g), Te();
1225
+ }, j = async () => {
1226
+ if (o.data.channelStatus != "Y") {
1227
+ y("offline");
1228
+ return;
1229
+ }
1230
+ try {
1231
+ g.playing = !1, y("loading");
1232
+ const s = {
1233
+ 超清: "orig",
1234
+ 高清: "hd",
1235
+ 标清: "sd"
1236
+ }, A = { ...o.data, quality: s[u.currentQuality] }, R = r.value;
1237
+ if (!R)
1238
+ return console.error("[EasyPlayer] 未配置获取视频流地址的方法,请通过 customerGetVideoUrl prop 或插件配置 getVideoUrl 提供"), y("failed"), g.playing = !1, Promise.reject(new Error("未配置视频流获取方法"));
1239
+ const { url: K } = await R(A);
1240
+ return I.value = K, pe(K), Promise.resolve();
1241
+ } catch (s) {
1242
+ return y("failed"), g.playing = !1, Promise.reject(s);
1243
+ }
1244
+ }, pe = (s) => {
1245
+ w.value && w.value.play(s);
1246
+ }, q = B(0), ve = (s) => {
1247
+ g.playing = !1, q.value < Ie ? (q.value++, console.log(`[EasyPlayer] ${s},当前重试次数: ${q.value}/${Ie}`), j()) : se();
1248
+ }, se = () => {
1249
+ y("failed"), w.value && (w.value.destroy(), w.value = null), clearInterval(_.value), Ce(), b(), n("close");
1250
+ }, Ce = () => {
1251
+ g.voiceState = "idle", g.ptzControl = !1, g.mediaInfo = !1, g.fullscreen = !1, m.value && (m.value.destroy(), m.value = null);
1252
+ }, Te = async () => {
1253
+ const s = H.value;
1254
+ s && (document.fullscreenElement === s ? await document.exitFullscreen() : (document.fullscreenElement && await document.exitFullscreen(), await s.requestFullscreen()), ae());
1255
+ }, ae = () => {
1256
+ if (!O.value) return;
1257
+ const s = O.value.querySelector(".easyplayer-controls"), A = O.value.querySelector(".easyplayer-controls-right");
1258
+ if (!s || !A) return;
1259
+ const R = s.getBoundingClientRect().left, K = s.offsetWidth, ye = R + K, le = Array.from(A.children);
1260
+ le.forEach((M) => {
1261
+ M.style.display = "";
1262
+ });
1263
+ const je = () => {
1264
+ const M = le.filter((Ze) => Ze.style.display !== "none"), be = M[0], Be = M[M.length - 1];
1265
+ if (!be || !Be) return !1;
1266
+ const Le = be.getBoundingClientRect(), We = Be.getBoundingClientRect();
1267
+ return Le.left < R || We.right > ye;
1268
+ };
1269
+ for (let M = le.length - 1; M >= 0 && je(); M--) {
1270
+ if (M === 0) return;
1271
+ le[M].style.display = "none";
1272
+ }
1273
+ }, Fe = () => {
1274
+ y("loading"), pe(I.value);
1275
+ }, V = B(null), ze = () => {
1276
+ V.value && (clearTimeout(V.value), V.value = null);
1277
+ const s = O.value.querySelector(".easyplayer-controls");
1278
+ s && (s.style.opacity = "1");
1279
+ }, Ve = () => {
1280
+ V.value && clearTimeout(V.value), V.value = setTimeout(() => {
1281
+ var A;
1282
+ const s = (A = O.value) == null ? void 0 : A.querySelector(".easyplayer-controls");
1283
+ s && (s.style.opacity = "0", V.value = null);
1284
+ }, 5e3);
1285
+ }, we = () => {
1286
+ g.playing = !g.playing, m.value.updateStates(g), g.playing ? (y("loading"), pe(I.value)) : (w.value.pause(), u.userPaused = !0);
1287
+ }, Ke = () => {
1288
+ q.value = 0, u.currentQuality = "超清";
1289
+ }, Ee = B(null), Je = (s) => {
1290
+ s.preventDefault(), w.value && o.visibleContextMenu && g.playing && Ee.value.init(s, { ...u, ...g }, H.value);
1291
+ }, _ = B(null), He = (s = 5, A = 2e3) => {
1292
+ let R = 0;
1293
+ _.value = setInterval(() => {
1294
+ w.value.screenshot(), R++, R >= s && (clearInterval(_.value), console.log(`[EasyPlayer] 截图完成,共截取了${s}张图片`));
1295
+ }, A);
1296
+ }, Ye = (s) => {
1297
+ w.value && w.value.setMute(s);
1298
+ }, Ge = ({ action: s, value: A }) => {
1299
+ switch (s) {
1300
+ case "playPause":
1301
+ we();
1302
+ break;
1303
+ case "screenshot":
1304
+ w.value.screenshot();
1305
+ break;
1306
+ case "continuousScreenshot":
1307
+ He(5, 2e3);
1308
+ break;
1309
+ case "quality":
1310
+ u.currentQuality = A.quality, w.value.setQuality(A.quality), j();
1311
+ break;
1312
+ case "setVideoVolume":
1313
+ break;
1314
+ case "recordScreen":
1315
+ break;
1316
+ case "ptzControl":
1317
+ he();
1318
+ break;
1319
+ case "stopPlay":
1320
+ se();
1321
+ break;
1322
+ case "fullscreen":
1323
+ fe();
1324
+ break;
1325
+ }
1326
+ }, Ne = () => {
1327
+ if (!w.value) return;
1328
+ const s = w.value;
1329
+ s.on("videoInfo", (A) => {
1330
+ u.width = A.width, u.height = A.height, u.encType = A.encType;
1331
+ }), s.on("audioInfo", (A) => {
1332
+ u.encTypeAudio = A.encType === "ALAW" ? "ALAW(g711a)" : A.encType, u.sampleRate = A.sampleRate, u.channels = A.channels;
1333
+ }), s.on("error", () => {
1334
+ ve("出错了");
1335
+ }), s.on("timeout", () => {
1336
+ ve("加载超时");
1337
+ }), s.on("qualityChange", (A) => {
1338
+ u.currentQuality != A && (u.currentQuality = A, j());
1339
+ }), s.on("kBps", (A) => {
1340
+ u.kbps = A;
1341
+ }), s.on("play", () => {
1342
+ s.setQuality(u.currentQuality), u.userPaused = !1, G(), q.value = 0, g.playing = !0, b(), n("play");
1343
+ }), s.on("liveEnd", () => {
1344
+ u.userPaused || ve("实时流中断");
1345
+ }), s.on("mute", (A) => {
1346
+ u.quieting = A;
1347
+ }), s.on("pause", () => {
1348
+ g.playing = !1;
1349
+ }), s.on("recordStart", () => {
1350
+ u.recording = !0;
1351
+ }), s.on("recordEnd", () => {
1352
+ u.recording = !1;
1353
+ });
1354
+ };
1355
+ return Ue(() => {
1356
+ z(), window.addEventListener("resize", ae);
1357
+ }), et(() => {
1358
+ se(), window.removeEventListener("resize", ae), Y.value && clearTimeout(Y.value), V.value && clearTimeout(V.value), _.value && clearInterval(_.value);
1359
+ }), e({
1360
+ getPlayUrl: j,
1361
+ handleSetMute: Ye,
1362
+ state: u,
1363
+ buttonStates: g,
1364
+ easyPlayer: w
1365
+ }), (s, A) => (k(), D("div", {
1366
+ ref: "easyPlayerProRef",
1367
+ class: "easy-player-pro",
1368
+ onClick: te(Me, ["stop"]),
1369
+ onDblclick: te(fe, ["stop"]),
1370
+ onContextmenu: Je
1371
+ }, [
1372
+ h("div", jt, null, 512),
1373
+ u.userPaused ? (k(), D("div", {
1374
+ key: 0,
1375
+ class: "player-pause-box",
1376
+ onClick: te(Fe, ["stop"]),
1377
+ onMousemove: ze,
1378
+ onMouseleave: Ve
1379
+ }, null, 32)) : T("", !0),
1380
+ ne(ct, {
1381
+ visible: E.value,
1382
+ warning: F.value,
1383
+ closeHeader: i.closeHeader,
1384
+ "data-info": i.data,
1385
+ onHandle: P
1386
+ }, null, 8, ["visible", "warning", "closeHeader", "data-info"]),
1387
+ h("div", Lt, [
1388
+ Re(s.$slots, "loading", { loadingState: S }, () => [
1389
+ ne(yt, {
1390
+ visible: S.visible,
1391
+ status: S.status,
1392
+ "custom-config": S.config
1393
+ }, null, 8, ["visible", "status", "custom-config"])
1394
+ ])
1395
+ ]),
1396
+ ne(Pt, {
1397
+ visible: g.ptzControl,
1398
+ onPtzControl: Oe,
1399
+ onDblclick: A[0] || (A[0] = te(() => {
1400
+ }, ["stop"]))
1401
+ }, null, 8, ["visible"]),
1402
+ ne(Vt, {
1403
+ visible: g.mediaInfo,
1404
+ mediaInfo: u,
1405
+ onDblclick: A[1] || (A[1] = te(() => {
1406
+ }, ["stop"]))
1407
+ }, null, 8, ["visible", "mediaInfo"]),
1408
+ ne(Kt, {
1409
+ ref_key: "contextMenuRef",
1410
+ ref: Ee,
1411
+ actualFeatures: Q.value,
1412
+ onMenuAction: Ge
1413
+ }, null, 8, ["actualFeatures"])
1414
+ ], 544));
1415
+ }
1416
+ };
1417
+ function nn(i, { maxWidth: e = 2560, maxHeight: t = 1440, quality: n = 0.92 } = {}) {
1418
+ return i ? new Promise((o) => {
1419
+ const a = URL.createObjectURL(i), l = new Image();
1420
+ l.onload = () => {
1421
+ const c = Math.min(e / l.width, t / l.height, 1), d = Math.floor(l.width * c), f = Math.floor(l.height * c), r = document.createElement("canvas");
1422
+ r.width = d, r.height = f;
1423
+ const p = r.getContext("2d");
1424
+ p.fillStyle = "#ffffff", p.fillRect(0, 0, d, f), p.drawImage(l, 0, 0, d, f), URL.revokeObjectURL(a);
1425
+ const C = r.toDataURL("image/jpeg", n);
1426
+ r.toBlob(
1427
+ (Q) => {
1428
+ o({
1429
+ blob: Q,
1430
+ dataUrl: C,
1431
+ format: "jpeg",
1432
+ quality: n,
1433
+ timestamp: Date.now(),
1434
+ width: d,
1435
+ height: f,
1436
+ size: Q.size
1437
+ });
1438
+ },
1439
+ "image/jpeg",
1440
+ n
1441
+ );
1442
+ }, l.onerror = () => {
1443
+ URL.revokeObjectURL(a), o(null);
1444
+ }, l.src = a;
1445
+ }) : Promise.resolve(null);
1446
+ }
1447
+ const on = (i, e = {}) => {
1448
+ i.provide("sldzEasyPlayerConfig", e), i.component("EasyPlayer", Wt);
1449
+ }, Zt = {}, Xt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1450
+ __proto__: null,
1451
+ default: Zt
1452
+ }, Symbol.toStringTag, { value: "Module" })), qt = {}, _t = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1453
+ __proto__: null,
1454
+ default: qt
1455
+ }, Symbol.toStringTag, { value: "Module" })), $t = {}, en = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1456
+ __proto__: null,
1457
+ default: $t
1458
+ }, Symbol.toStringTag, { value: "Module" }));
1459
+ export {
1460
+ Wt as EasyPlayer,
1461
+ on as install,
1462
+ nn as resizeBlobToJpeg
1463
+ };