@vanwei-wcs/video-player-v3 0.1.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.
- package/README.md +261 -0
- package/dist/README.md +261 -0
- package/dist/package.json +20 -0
- package/dist/style.css +1 -0
- package/dist/types/index.d.ts +151 -0
- package/dist/video-player-v3.js +1103 -0
- package/dist/video-player-v3.js.map +1 -0
- package/dist/video-player-v3.umd.cjs +3 -0
- package/dist/video-player-v3.umd.cjs.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video-player-v3.js","names":["$emit"],"sources":["../src/package/ww-video-player/utils/helper.ts","../src/package/ww-video-player/controller.vue","../src/package/ww-video-player/controller.vue","../src/package/ww-video-player/PTZ/direction.vue","../src/package/ww-video-player/PTZ/direction.vue","../src/package/ww-video-player/PTZ/components/popper.vue","../src/package/ww-video-player/PTZ/components/popper.vue","../src/package/ww-video-player/PTZ/components/operationButton.vue","../src/package/ww-video-player/PTZ/components/operationButton.vue","../src/package/ww-video-player/PTZ/components/lockButton.vue","../src/package/ww-video-player/PTZ/components/lockButton.vue","../src/package/ww-video-player/PTZ/operations.vue","../src/package/ww-video-player/PTZ/operations.vue","../src/package/ww-video-player/PTZ/components/message.vue","../src/package/ww-video-player/PTZ/components/message.vue","../src/package/ww-video-player/PTZ/composables/useLock.ts","../src/package/ww-video-player/PTZ/index.vue","../src/package/ww-video-player/PTZ/index.vue","../src/package/ww-video-player/composables/usePlayer.ts","../src/package/ww-video-player/composables/useStream.ts","../src/package/ww-video-player/composables/useVideo.ts","../src/package/ww-video-player/composables/useDom.ts","../src/package/ww-video-player/index.vue","../src/package/ww-video-player/index.vue","../src/types/index.ts","../src/package/index.ts"],"sourcesContent":["import type { SpeedItem } from '../../../types'\n\n/**\n * 视频状态常量\n */\nexport const VideoStatus = {\n vConnect: 0,\n vStart: 1,\n vPlay: 2,\n vPause: 3,\n vStop: 4\n} as const\n\n/**\n * 格式化网速\n */\nexport function formatNetSpeed(byteNum: number): string {\n byteNum = parseInt(String(byteNum))\n let num = 0\n let per = 'B/s'\n if (byteNum >= (1024 * 1024 * 1024)) {\n num = parseFloat((byteNum / (1024 * 1024 * 1024)).toFixed(2))\n per = 'GB/s'\n } else if (byteNum >= (1024 * 1024)) {\n num = parseFloat((byteNum / (1024 * 1024)).toFixed(2))\n if (num >= 10) {\n num = parseFloat(num.toFixed(1))\n }\n per = 'MB/s'\n } else if (byteNum >= 1024) {\n num = Math.floor(byteNum / 1024)\n per = 'KB/s'\n } else if (byteNum >= 0) {\n num = byteNum\n per = 'B/s'\n }\n return num + per\n}\n\n/**\n * 深拷贝\n */\nexport function deepClone<T>(source: T): T {\n if (!source || typeof source !== 'object') {\n return source\n }\n const targetObj = Array.isArray(source) ? [] : {} as T\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const value = source[key]\n if (value && typeof value === 'object') {\n (targetObj as Record<string, unknown>)[key] = deepClone(value)\n } else {\n (targetObj as Record<string, unknown>)[key] = value\n }\n }\n }\n return targetObj as T\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number = 200,\n immediate: boolean = false\n): (...args: Parameters<T>) => ReturnType<T> | undefined {\n let timeout: ReturnType<typeof setTimeout> | null = null\n let args: Parameters<T> | null = null\n let context: unknown = null\n let timestamp: number = 0\n let result: ReturnType<T> | undefined\n\n const later = function () {\n const last = +new Date() - timestamp\n\n if (last < wait && last > 0) {\n timeout = setTimeout(later, wait - last)\n } else {\n timeout = null\n if (!immediate) {\n result = func.apply(context, args as Parameters<T>) as ReturnType<T>\n if (!timeout) context = args = null\n }\n }\n }\n\n return function (this: unknown, ...innerArgs: Parameters<T>) {\n context = this\n args = innerArgs\n timestamp = +new Date()\n const callNow = immediate && !timeout\n if (!timeout) timeout = setTimeout(later, wait)\n if (callNow) {\n result = func.apply(context, args as Parameters<T>) as ReturnType<T>\n context = args = null\n }\n return result\n }\n}\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number = 200,\n duration: number = 800\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout> | null = null\n let begin = new Date()\n return function (this: unknown, ...args: Parameters<T>) {\n const context = this\n const current = new Date()\n if (timer) clearTimeout(timer)\n if (current.getTime() - begin.getTime() >= duration) {\n fn.apply(context, args)\n begin = current\n } else {\n timer = setTimeout(function () {\n fn.apply(context, args)\n }, delay)\n }\n }\n}\n\n/**\n * 创建唯一字符串\n */\nexport function createUniqueString(): string {\n const timestamp = String(+new Date())\n const randomNum = String(Math.floor((1 + Math.random()) * 65536))\n return (Number(randomNum + timestamp)).toString(32)\n}\n\n/**\n * 下载文件\n */\nexport function downloadFile(obj: Blob, name: string = 'file', suffix: string = ''): void {\n const url = window.URL.createObjectURL(new Blob([obj]))\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = url\n const fileName = name + '_' + createUniqueString() + suffix\n link.setAttribute('download', fileName)\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n}\n\n/**\n * Base64 转 Blob\n */\nexport function base64ToBlob(code: string): Promise<Blob> {\n const parts = code.split(';base64,')\n const contentType = parts[0].split(':')[1]\n const raw = window.atob(parts[1])\n const rawLength = raw.length\n\n const uInt8Array = new Uint8Array(rawLength)\n\n for (let i = 0; i < rawLength; ++i) {\n uInt8Array[i] = raw.charCodeAt(i)\n }\n return Promise.resolve(new Blob([uInt8Array], { type: contentType }))\n}\n\n/**\n * 播放速度列表\n */\nexport const speedList: SpeedItem[] = [\n { label: '16X', value: 16 },\n { label: '8X', value: 8 },\n { label: '4X', value: 4 },\n { label: '2X', value: 2 },\n { label: '1X', value: 1 },\n { label: '1/2X', value: 0.5 },\n { label: '1/4X', value: 0.25 },\n { label: '1/8X', value: 0.125 },\n { label: '1/16X', value: 0.0625 }\n]","<template>\n <div class=\"wwav-player__footer\">\n <span class=\"wwav-player__common-icon wwav-player__footer--stop\" title=\"关闭\" @click.stop=\"stopVideo\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M788.842733 146.596542a485.068578 485.068578 0 0 1 86.347229 78.14224 510.614455 510.614455 0 0 1 64.763128 94.31408 465.389593 465.389593 0 0 1 41.014123 107.249385 475.088367 475.088367 0 0 1 14.071881 114.794079q0 100.245919-38.318816 188.097757t-103.62317 153.058773Q787.76028 947.470614 699.789372 985.735307t-188.346721 38.264693q-99.304185 0-187.264269-38.264693t-153.816489-103.471627Q104.516313 817.045922 66.738723 729.204908T28.961134 541.107151a468.701898 468.701898 0 0 1 13.487357-112.098773 497.495132 497.495132 0 0 1 38.318816-104.554079 461.005661 461.005661 0 0 1 61.526595-92.701225 524.231707 524.231707 0 0 1 82.039069-77.611839c15.825454-11.495645 32.841606-15.305877 51.264947-12.989429 11.906977 1.537082 24.192812 12.480676 25.253615 25.71907 1.786046 22.168626-13.963636 39.726004-31.726681 53.256659Q189.164092 278.525843 146.634536 363.487533T104.12663 546.086432q0 83.684397 31.72668 157.864861t86.942579 129.34224q55.205073 55.205073 129.461309 87.494629t158.038053 32.332854q83.770993 0 158.038054-32.332854t129.461309-87.494629q55.205073-55.205073 87.570401-129.34224T917.654571 546.086432a400.669763 400.669763 0 0 0-45.668668-187.036954q-45.690317-88.133276-128.184016-145.200167c-18.618182-12.675518-32.278731-30.655053-30.02723-52.845327 1.60203-15.749683 11.008541-23.911374 23.251078-25.71907 18.780549-2.781903 35.980718 0.541226 51.806173 11.311628z\" />\n <path d=\"M501.245949 0.000011A42.930063 42.930063 0 0 1 544.208486 42.930074v429.354752a42.935475 42.935475 0 0 1-85.870951 0V42.930074A42.930063 42.930063 0 0 1 501.245949 0.000011z\" />\n </svg>\n </span>\n\n <div class=\"wwav-player__footer--left\">\n <span class=\"wwav-player__common-span wwav-player__footer--net-speed\">\n <span>{{ formatNetSpeed(netSpeed) }}</span>\n </span>\n\n <div v-show=\"streamWorking\" class=\"wwav-player__common-span wwav-player__footer--info\">\n <span title=\"视频信息\" @click=\"showInfoPop = !showInfoPop\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M512 2q139 1 255 68.5T953 257q69 121 69 255t-69 255q-70 119-186 186.5T512 1022q-217-6-360.5-149.5T2 512q6-217 149.5-360.5T512 2z m76 313q30 0 49-17.5t19-47.5-19-47.5-48.5-17.5-48.5 17.5-19 47.5 19 47.5 48 17.5z m14 410q0-7 1-18.5t0-21.5l-60 69q-10 10-19.5 16t-15.5 4q-11-5-9-17l99-315q6-31-10-54t-52-27q-39 1-86 33.5T368 476l-1 18q0 12 1 21l59-69q10-10 19.5-15.5t15-3.5 8 7 0.5 11l-99 313q-8 29 8 51.5t55 29.5q57-1 96-32.5t72-81.5z\" />\n </svg>\n </span>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--info-pop\" :class=\"{ 'show': showInfoPop }\">\n <li class=\"wwav-player__footer--info-pop--item\" :title=\"mediaInfo.format\">\n 流类型: {{ mediaInfo.format }}\n </li>\n <li class=\"wwav-player__footer--info-pop--item\" :title=\"mediaInfo.format\">\n 解码方式: {{ isH265 ? mediaInfo.mode || '软解码' : '硬解码' }}\n </li>\n <li class=\"wwav-player__footer--info-pop--item\">\n 分辨率: {{ `${mediaInfo.width}x${mediaInfo.height}` }}\n </li>\n <li class=\"wwav-player__footer--info-pop--item\">\n 实时帧率: {{ `${streamInfo.fps}` }}\n </li>\n </ul>\n </div>\n\n <!-- 声音 -->\n <div v-show=\"streamWorking\" class=\"wwav-player__common-span wwav-player__footer--info\">\n <span v-if=\"muted\" title=\"静音\" @click=\"controlSound(false)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M553.948279 55.153116a48.580465 48.580465 0 0 0-30.684279 11.121117L258.714791 294.816744H73.013581c-40.20986 0-72.489674 32.279814-72.489674 71.953861L0 679.995535c0 39.685953 32.803721 72.477767 73.013581 72.477767H261.35814l260.834232 205.288186a46.734884 46.734884 0 0 0 30.684279 11.097303c25.373767 0 48.663814-19.57507 48.663814-48.128l1.047814-817.413954c0.559628-28.600558-23.242419-48.163721-48.64-48.163721z m-24.349767 816.354233L305.806884 695.331721a71.930047 71.930047 0 0 0-44.436837-15.336186H71.95386l1.059721-312.689116 185.70121-0.512c17.467535 0 33.863442-6.370233 47.092093-17.467535l224.851349-194.16707-1.059721 716.347535z m0 0\" fill=\"#a6b0b3\" />\n <path d=\"M1012.950326 624.568558c14.57414 14.57414 14.764651 38.018977 0.416744 52.366884-14.347907 14.347907-37.792744 14.169302-52.366884-0.404837L683.901023 399.431442c-14.57414-14.57414-14.764651-38.018977-0.416744-52.366884 14.347907-14.347907 37.792744-14.157395 52.366884 0.416744l277.099163 277.087256z m0 0\" fill=\"#a6b0b3\" />\n <path d=\"M960.988279 347.481302c14.57414-14.57414 38.018977-14.764651 52.366884-0.416744 14.347907 14.347907 14.157395 37.792744-0.416744 52.366884L735.851163 676.518698c-14.57414 14.57414-38.018977 14.764651-52.366884 0.404837-14.347907-14.347907-14.169302-37.792744 0.404837-52.366884l277.099163-277.075349z m0 0\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n <span v-else title=\"播放\" @click=\"controlSound(true)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M536.873674 69.227163c-10.251907 0-21.039628 3.584-29.743627 10.775814L250.749023 301.520372H70.763163c-38.971535 0-70.251163 31.279628-70.251163 69.739163L0 674.816c0 38.459535 31.791628 70.239256 70.763163 70.239256h182.54586l252.797024 198.953674a45.353674 45.353674 0 0 0 29.743627 10.763907c24.587907 0 47.163535-18.967814 47.163535-46.651535l1.024-792.21879c0.523907-27.707535-22.551814-46.675349-47.163535-46.675349z m-23.599627 791.19479l-216.885582-170.746046a69.774884 69.774884 0 0 0-43.067535-14.859907H69.739163l1.035907-303.056372 179.973953-0.500093c16.931721 0 32.815628-6.167814 45.639442-16.931721l217.921488-188.189767-1.035906 694.283906z m207.169488-578.393302c-15.907721-10.752-37.959442-6.144-48.211349 9.751814-10.752 15.883907-6.144 37.935628 9.751814 48.199442 54.343442 36.411535 87.170977 96.398884 87.170977 160.49414 0 62.035349-30.767628 120.498605-82.03907 156.898232a34.685023 34.685023 0 0 0-8.215814 48.711442c6.667907 9.751814 17.419907 14.883721 28.719628 14.883721 7.168 0 14.336-2.059907 19.991814-6.667907 69.75107-49.735442 111.270698-129.738419 111.270698-214.349395 0-87.170977-44.091535-168.68614-118.438698-217.921489z m0 0\" fill=\"#a6b0b3\" />\n <path d=\"M868.62586 154.362047c-14.359814-12.823814-36.411535-11.799814-49.235348 2.56-12.811907 14.359814-11.776 36.399628 2.56 49.211534 84.110884 75.394977 132.298419 182.557767 132.298418 294.340466 0 109.222698-44.079628 210.741581-124.082604 286.124651-13.835907 13.323907-14.859907 35.375628-1.536 49.211535 6.667907 7.191814 15.895814 10.775814 25.635721 10.775814a33.696744 33.696744 0 0 0 24.09972-9.751814C972.204651 747.615256 1024 628.140651 1024 499.95014c0.500093-130.750512-55.903256-256.881116-155.37414-345.588093z m0 0\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n </div>\n\n <!-- 对讲 -->\n <div v-show=\"isLive && streamWorking\" class=\"wwav-player__common-span wwav-player__footer--info\">\n <span v-if=\"!talk\" title=\"关闭\" @click=\"controlTalk(true)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M62.72 62.72a32 32 0 0 1 45.248 0l212.864 212.8 0.96 1.024 340.224 340.224a35.84 35.84 0 0 1 1.216 1.216l89.92 89.92a35.712 35.712 0 0 1 1.088 1.088l207.04 207.04a32 32 0 1 1-45.248 45.248l-187.648-187.648a371.456 371.456 0 0 1-184.32 67.648v65.408H640a32 32 0 1 1 0 64H384a32 32 0 0 1 0-64h96v-65.344a373.376 373.376 0 0 1-341.376-372.032 32 32 0 0 1 64 0 309.312 309.312 0 0 0 479.68 258.304l-46.464-46.464a245.312 245.312 0 0 1-369.216-211.84v-157.44L62.72 108.032a32 32 0 0 1 0-45.248z m267.968 406.592a181.312 181.312 0 0 0 257.856 164.48l-257.92-257.92v93.44zM512 117.312c-66.944 0-125.44 36.288-156.928 90.432a32 32 0 1 1-55.296-32.192 245.312 245.312 0 0 1 457.6 123.072v170.688c0 40.128-9.664 78.08-26.816 111.552a32 32 0 0 1-56.96-29.12 180.48 180.48 0 0 0 19.712-82.432V298.688A181.312 181.312 0 0 0 512 117.312zM885.312 469.312a32 32 0 1 0-64 0c0 63.936-19.328 123.2-52.48 172.48a32 32 0 1 0 53.12 35.712c40-59.52 63.36-131.2 63.36-208.192z\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n <span v-else title=\"打开\" @click=\"controlTalk(false)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M512 53.312a245.312 245.312 0 0 0-245.312 245.376v170.624a245.312 245.312 0 1 0 490.624 0V298.688A245.312 245.312 0 0 0 512 53.312zM330.688 298.688a181.312 181.312 0 1 1 362.624 0v170.624a181.312 181.312 0 1 1-362.624 0V298.688z\" fill=\"#a6b0b3\" />\n <path d=\"M202.688 469.312a32 32 0 0 0-64 0A373.376 373.376 0 0 0 480 841.344v65.28H384a32 32 0 1 0 0 64h256a32 32 0 0 0 0-64H544v-65.28a373.376 373.376 0 0 0 341.312-372.032 32 32 0 1 0-64 0 309.312 309.312 0 1 1-618.624 0z\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n </div>\n </div>\n\n <div class=\"wwav-player__footer--right\">\n <span v-if=\"!isLive && streamWorking\" class=\"wwav-player__common-icon wwav-player__footer--play\">\n <span v-show=\"isPausing\" title=\"播放\" @click=\"changePlayStatus(2)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M701.44 539.648L440.32 711.475a32.973 32.973 0 0 1-45.67-9.42 31.949 31.949 0 0 1-5.53-18.228V340.173a32.973 32.973 0 0 1 32.973-32.973 33.792 33.792 0 0 1 18.227 5.325l261.12 171.827a33.178 33.178 0 0 1 9.42 45.875 37.478 37.478 0 0 1-9.42 9.421z\" />\n <path d=\"M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512z m0-57.958A454.042 454.042 0 1 0 57.958 512 454.246 454.246 0 0 0 512 966.042z\" />\n </svg>\n </span>\n <span v-show=\"isPlaying\" title=\"暂停\" @click=\"changePlayStatus(3)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M512 8.858C234.496 8.858 8.858 234.496 8.858 512S234.548 1015.142 512 1015.142c277.504 0 503.142-225.69 503.142-503.142C1015.142 234.496 789.504 8.858 512 8.858z m0 937.984A434.79 434.79 0 0 1 77.158 512 434.79 434.79 0 0 1 512 77.158 434.79 434.79 0 0 1 946.842 512 434.79 434.79 0 0 1 512 946.842zM408.474 304.947a45.978 45.978 0 0 0-45.568 45.568v320.922c0 24.832 20.736 45.568 45.568 45.568s45.568-20.736 45.568-45.568V350.515a45.978 45.978 0 0 0-45.568-45.568z m207.052 0a45.978 45.978 0 0 0-45.568 45.568v320.922c0 24.832 20.736 45.568 45.568 45.568s45.568-20.736 45.568-45.568V350.515a45.978 45.978 0 0 0-45.568-45.568z\" />\n </svg>\n </span>\n </span>\n\n <div v-show=\"!isLive && streamWorking && (isH265 && ableH265capture || !isH265)\" class=\"wwav-player__common-span wwav-player__footer--speed\">\n <div title=\"播放速度\" @click=\"showSpeedPop = !showSpeedPop\">\n <span>{{ playSpeed === 1 ? '倍速' : playSpeedText }}</span>\n </div>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--speed-pop\" :class=\"{ 'show': showSpeedPop }\">\n <li class=\"wwav-player__footer--speed-pop--item\">\n <i class=\"wwav-player__common-icon\" @click=\"speedChange('minus')\">-</i>\n <span class=\"speed-text\">{{ playSpeedText }}</span>\n <i class=\"wwav-player__common-icon\" @click=\"speedChange('plus')\">+</i>\n </li>\n </ul>\n </div>\n\n <span v-show=\"(isPlaying || isPausing) && (isH265 && ableH265capture || !isH265)\" class=\"wwav-player__common-icon wwav-player__footer--capture\" title=\"截屏\" @click.stop=\"captureVideo\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1132 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M987.332085 0H146.998468C66.647149 0 1.437957 64.27234 1.437957 143.468936v678.410894a42.550468 42.550468 0 0 0 0 21.830808v36.820426C1.41617 959.72766 66.625362 1024 147.020255 1024h840.333617C1067.726979 1024 1132.93617 959.72766 1132.93617 880.531064V143.468936C1132.93617 64.27234 1067.726979 0 987.332085 0zM146.998468 87.345021h840.333617c31.35183 0 56.973617 25.273191 56.973617 56.123915v544.898724c-32.898723-43.966638-72.769362-92.007489-114.252255-130.069788-24.684936-22.745872-55.383149-32.114383-88.93549-27.430127-52.85583 7.494809-110.788085 50.851404-176.91234 132.24851a1004.456851 1004.456851 0 0 0-41.787915 55.208851c-58.237277-79.218383-172.81634-225.497872-269.987404-292.885787-28.802723-19.957106-61.091404-24.619574-94.011915-14.030979-35.752851 11.547234-70.590638 41.482894-106.016681 91.397447-20.567149 28.693787-41.461106 64.250553-62.681872 106.038468V143.468936a56.799319 56.799319 0 0 1 57.300425-56.123915z\" />\n <path d=\"M697.191489 337.702128a76.255319 76.255319 0 1 0 152.510639 0 76.255319 76.255319 0 1 0-152.510639 0z\" />\n </svg>\n </span>\n\n <div v-if=\"isLive && !isClosed\" class=\"wwav-player__common-span wwav-player__footer--quality\">\n <span @click=\"showQualityPop = !showQualityPop\">{{ videoQualityText }}</span>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--quality-select\" :class=\"{ 'show': showQualityPop }\">\n <li v-for=\"(i, index) in ['高清', '标清', '流畅']\" :key=\"i\" class=\"wwav-player__footer--quality-select--item\" :class=\"{ 'active': index === videoQuality }\" @click=\"changeQuality(index as VideoQuality)\">\n {{ i }}\n </li>\n </ul>\n </div>\n\n <div v-if=\"features.length !== 0\" class=\"wwav-player__common-span wwav-player__footer--setting\">\n <span title=\"其他设置\" @click=\"showSettingPop = !showSettingPop\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n <path d=\"M962.496 448.96c-3.584-19.84-22.656-39.808-42.304-44.288l-14.72-3.392c-34.624-10.432-65.536-33.536-84.992-67.328-19.648-33.984-24.128-72.576-15.616-107.968 0 0 0 0 0 0l4.288-13.824c5.952-19.264-1.792-45.76-17.216-58.816 0 0-13.824-11.712-52.992-34.304-39.168-22.592-56.128-28.736-56.128-28.736-19.008-6.848-45.76-0.32-59.52 14.464L612.928 115.84C586.56 140.672 551.104 155.904 512 155.904c-39.232 0-74.88-15.36-101.248-40.384L400.832 104.832C387.136 90.048 360.32 83.52 341.312 90.368c0 0-17.024 6.144-56.256 28.736C245.952 141.696 232.128 153.344 232.128 153.344 216.768 166.4 209.024 192.832 214.976 212.16l4.288 14.016c8.448 35.328 3.904 73.856-15.68 107.776C184 367.872 152.896 391.04 118.08 401.408L103.808 404.672c-19.648 4.48-38.72 24.448-42.304 44.288 0 0-3.2 17.792-3.2 63.04 0 45.248 3.2 62.976 3.2 62.976 3.584 19.84 22.656 39.808 42.304 44.288l13.952 3.2c0 0 0 0 0 0 34.944 10.304 66.112 33.536 85.824 67.584 19.648 33.984 24.128 72.576 15.616 107.968 0 0 0 0 0 0l-4.224 13.76c-5.952 19.264 1.792 45.76 17.216 58.816 0 0 13.824 11.712 52.992 34.304 39.168 22.592 56.128 28.736 56.128 28.736 19.008 6.848 45.76 0.32 59.52-14.464l9.792-10.56c26.432-25.024 62.08-40.448 101.376-40.448 39.296 0 75.008 15.424 101.44 40.512 0 0 0 0 0.064 0l9.728 10.496c13.76 14.784 40.512 21.312 59.52 14.464 0 0 17.024-6.144 56.256-28.736 39.168-22.592 52.928-34.304 52.928-34.304 15.424-13.056 23.168-39.488 17.216-58.816l-4.352-14.208c-8.32-35.264-3.84-73.664 15.744-107.52 19.648-34.048 50.88-57.216 85.824-67.584 0 0 0-0.064 0-0.064l13.952-3.2c19.648-4.48 38.72-24.448 42.304-44.288 0 0 3.2-17.792 3.2-63.04C965.696 466.752 962.496 448.96 962.496 448.96zM512 692.928c-99.904 0-180.928-81.024-180.928-180.928S412.096 331.136 512 331.136s180.928 81.024 180.928 180.928S611.904 692.928 512 692.928z\" />\n </svg>\n </span>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--setting-pop\" :class=\"{ 'show': showSettingPop }\">\n <li v-if=\"features.indexOf('PTZ') !== -1\" class=\"wwav-player__footer--setting-pop--item\">\n <input v-model=\"PTZSwitch\" class=\"styled-checkbox\" type=\"checkbox\" @change=\"changePTZSwitch\">\n <label>云台(需全屏)</label>\n </li>\n </ul>\n </div>\n </div>\n\n <span class=\"wwav-player__common-icon wwav-player__footer--fullscreen\" title=\"全屏\" @click.stop=\"fullScreen\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1097 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M51.2 658.285714c29.257143 0 43.885714 21.942857 51.2 43.885715v219.428571h241.371429c29.257143 0 51.2 21.942857 51.2 51.2 0 29.257143-21.942857 43.885714-43.885715 51.2H0V709.485714c0-29.257143 21.942857-51.2 51.2-51.2z m950.857143 0c29.257143 0 51.2 21.942857 51.2 51.2V1024H709.485714c-29.257143 0-51.2-21.942857-51.2-51.2s21.942857-51.2 51.2-51.2H950.857143V709.485714c0-29.257143 21.942857-51.2 51.2-51.2z m-658.285714-658.285714c29.257143 0 51.2 21.942857 51.2 51.2s-21.942857 51.2-51.2 51.2H102.4v212.114286c0 29.257143-21.942857 51.2-51.2 51.2S0 343.771429 0 314.514286V0h343.771429z m709.485714 0v314.514286c0 29.257143-21.942857 51.2-51.2 51.2-29.257143 0-43.885714-21.942857-51.2-43.885715v-219.428571H709.485714c-29.257143 0-51.2-21.942857-51.2-51.2 0-29.257143 21.942857-43.885714 43.885715-51.2h351.085714z\" />\n </svg>\n </span>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\nimport { formatNetSpeed, throttle, speedList } from './utils/helper'\nimport type { MediaInfo, StreamInfo, VideoQuality } from '../../types'\n\n// Props\ninterface Props {\n isLive: boolean\n streamWorking: boolean\n isClosed: boolean\n videoStatus: number\n mediaInfo?: MediaInfo\n streamInfo?: StreamInfo\n features?: string[]\n enableAI?: boolean\n devicePath?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mediaInfo: () => ({ format: 'H264' as const, width: 0, height: 0 }),\n streamInfo: () => ({ speed: 0, fps: 0 }),\n features: () => [],\n enableAI: false,\n devicePath: '',\n})\n\n// v-model 绑定\nconst videoQuality = defineModel<VideoQuality>('videoQuality', { default: 1 })\n\n// Emits\nconst emit = defineEmits<{\n (e: 'fullscreen'): void\n (e: 'stop-video'): void\n (e: 'capture-video'): void\n (e: 'change-play-status', status: number): void\n (e: 'change-play-speed', speed: number): void\n (e: 'control-talk', status: boolean): void\n (e: 'control-sound', muted: boolean): void\n (e: 'change-ptz-switch', status: boolean): void\n (e: 'change-ai-status', status: boolean): void\n (e: 'change-quality', quality: VideoQuality): void\n}>()\n\n// 响应式状态\nconst showQualityPop = ref(false)\nconst showInfoPop = ref(false)\nconst showSettingPop = ref(false)\nconst showSpeedPop = ref(false)\nconst muted = ref(true)\nconst talk = ref(false)\nconst PTZSwitch = ref(false)\nconst playSpeed = ref(1)\n\n// 计算属性\nconst isPlaying = computed(() => props.videoStatus === 2)\nconst isPausing = computed(() => props.videoStatus === 3)\nconst isH265 = computed(() => props.mediaInfo.format === 'H265')\nconst ableH265capture = computed(\n () => props.mediaInfo.format === 'H265' && props.mediaInfo.mode === '硬解码'\n)\n\nconst videoQualityText = computed(() => {\n const quality = videoQuality.value\n if (quality === 0) return '高清'\n if (quality === 1) return '标清'\n if (quality === 2) return '流畅'\n return '标清'\n})\n\nconst playSpeedText = computed(() => {\n const index = speedList.findIndex((item) => item.value === playSpeed.value)\n if (index !== -1) {\n return speedList[index].label\n }\n return '1'\n})\n\nconst netSpeed = computed(() => props.streamInfo?.speed || 0)\n\n// 方法\nconst fullScreen = () => emit('fullscreen')\nconst stopVideo = () => {\n muted.value = true\n talk.value = false\n emit('stop-video')\n}\nconst captureVideo = () => emit('capture-video')\n\nconst changeQuality = (num: VideoQuality) => {\n videoQuality.value = num\n showQualityPop.value = false\n\n emit('change-quality', num)\n}\n\nconst changePlayStatus = (status: number) => emit('change-play-status', status)\n\nconst speedChange = throttle((_type: unknown) => {\n const type = String(_type)\n let speed = playSpeed.value\n if (type === 'plus') {\n speed = speed * 2\n if (speed > speedList[0].value) {\n speed = speedList[0].value\n }\n } else {\n speed = speed / 2\n if (speed < speedList[speedList.length - 1].value) {\n speed = speedList[speedList.length - 1].value\n }\n }\n playSpeed.value = speed\n emit('change-play-speed', speed)\n}, 1000)\n\nconst controlSound = (e: boolean) => {\n muted.value = e\n emit('control-sound', muted.value)\n}\n\nconst controlTalk = (e: boolean) => {\n talk.value = e\n emit('control-talk', talk.value)\n}\n\nconst changePTZSwitch = () => emit('change-ptz-switch', PTZSwitch.value)\n</script>\n\n<style lang=\"scss\" scoped>\n.styled-checkbox {\n height: 100%;\n vertical-align: top;\n cursor: pointer;\n}\n</style>\n","<template>\n <div class=\"wwav-player__footer\">\n <span class=\"wwav-player__common-icon wwav-player__footer--stop\" title=\"关闭\" @click.stop=\"stopVideo\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M788.842733 146.596542a485.068578 485.068578 0 0 1 86.347229 78.14224 510.614455 510.614455 0 0 1 64.763128 94.31408 465.389593 465.389593 0 0 1 41.014123 107.249385 475.088367 475.088367 0 0 1 14.071881 114.794079q0 100.245919-38.318816 188.097757t-103.62317 153.058773Q787.76028 947.470614 699.789372 985.735307t-188.346721 38.264693q-99.304185 0-187.264269-38.264693t-153.816489-103.471627Q104.516313 817.045922 66.738723 729.204908T28.961134 541.107151a468.701898 468.701898 0 0 1 13.487357-112.098773 497.495132 497.495132 0 0 1 38.318816-104.554079 461.005661 461.005661 0 0 1 61.526595-92.701225 524.231707 524.231707 0 0 1 82.039069-77.611839c15.825454-11.495645 32.841606-15.305877 51.264947-12.989429 11.906977 1.537082 24.192812 12.480676 25.253615 25.71907 1.786046 22.168626-13.963636 39.726004-31.726681 53.256659Q189.164092 278.525843 146.634536 363.487533T104.12663 546.086432q0 83.684397 31.72668 157.864861t86.942579 129.34224q55.205073 55.205073 129.461309 87.494629t158.038053 32.332854q83.770993 0 158.038054-32.332854t129.461309-87.494629q55.205073-55.205073 87.570401-129.34224T917.654571 546.086432a400.669763 400.669763 0 0 0-45.668668-187.036954q-45.690317-88.133276-128.184016-145.200167c-18.618182-12.675518-32.278731-30.655053-30.02723-52.845327 1.60203-15.749683 11.008541-23.911374 23.251078-25.71907 18.780549-2.781903 35.980718 0.541226 51.806173 11.311628z\" />\n <path d=\"M501.245949 0.000011A42.930063 42.930063 0 0 1 544.208486 42.930074v429.354752a42.935475 42.935475 0 0 1-85.870951 0V42.930074A42.930063 42.930063 0 0 1 501.245949 0.000011z\" />\n </svg>\n </span>\n\n <div class=\"wwav-player__footer--left\">\n <span class=\"wwav-player__common-span wwav-player__footer--net-speed\">\n <span>{{ formatNetSpeed(netSpeed) }}</span>\n </span>\n\n <div v-show=\"streamWorking\" class=\"wwav-player__common-span wwav-player__footer--info\">\n <span title=\"视频信息\" @click=\"showInfoPop = !showInfoPop\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M512 2q139 1 255 68.5T953 257q69 121 69 255t-69 255q-70 119-186 186.5T512 1022q-217-6-360.5-149.5T2 512q6-217 149.5-360.5T512 2z m76 313q30 0 49-17.5t19-47.5-19-47.5-48.5-17.5-48.5 17.5-19 47.5 19 47.5 48 17.5z m14 410q0-7 1-18.5t0-21.5l-60 69q-10 10-19.5 16t-15.5 4q-11-5-9-17l99-315q6-31-10-54t-52-27q-39 1-86 33.5T368 476l-1 18q0 12 1 21l59-69q10-10 19.5-15.5t15-3.5 8 7 0.5 11l-99 313q-8 29 8 51.5t55 29.5q57-1 96-32.5t72-81.5z\" />\n </svg>\n </span>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--info-pop\" :class=\"{ 'show': showInfoPop }\">\n <li class=\"wwav-player__footer--info-pop--item\" :title=\"mediaInfo.format\">\n 流类型: {{ mediaInfo.format }}\n </li>\n <li class=\"wwav-player__footer--info-pop--item\" :title=\"mediaInfo.format\">\n 解码方式: {{ isH265 ? mediaInfo.mode || '软解码' : '硬解码' }}\n </li>\n <li class=\"wwav-player__footer--info-pop--item\">\n 分辨率: {{ `${mediaInfo.width}x${mediaInfo.height}` }}\n </li>\n <li class=\"wwav-player__footer--info-pop--item\">\n 实时帧率: {{ `${streamInfo.fps}` }}\n </li>\n </ul>\n </div>\n\n <!-- 声音 -->\n <div v-show=\"streamWorking\" class=\"wwav-player__common-span wwav-player__footer--info\">\n <span v-if=\"muted\" title=\"静音\" @click=\"controlSound(false)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M553.948279 55.153116a48.580465 48.580465 0 0 0-30.684279 11.121117L258.714791 294.816744H73.013581c-40.20986 0-72.489674 32.279814-72.489674 71.953861L0 679.995535c0 39.685953 32.803721 72.477767 73.013581 72.477767H261.35814l260.834232 205.288186a46.734884 46.734884 0 0 0 30.684279 11.097303c25.373767 0 48.663814-19.57507 48.663814-48.128l1.047814-817.413954c0.559628-28.600558-23.242419-48.163721-48.64-48.163721z m-24.349767 816.354233L305.806884 695.331721a71.930047 71.930047 0 0 0-44.436837-15.336186H71.95386l1.059721-312.689116 185.70121-0.512c17.467535 0 33.863442-6.370233 47.092093-17.467535l224.851349-194.16707-1.059721 716.347535z m0 0\" fill=\"#a6b0b3\" />\n <path d=\"M1012.950326 624.568558c14.57414 14.57414 14.764651 38.018977 0.416744 52.366884-14.347907 14.347907-37.792744 14.169302-52.366884-0.404837L683.901023 399.431442c-14.57414-14.57414-14.764651-38.018977-0.416744-52.366884 14.347907-14.347907 37.792744-14.157395 52.366884 0.416744l277.099163 277.087256z m0 0\" fill=\"#a6b0b3\" />\n <path d=\"M960.988279 347.481302c14.57414-14.57414 38.018977-14.764651 52.366884-0.416744 14.347907 14.347907 14.157395 37.792744-0.416744 52.366884L735.851163 676.518698c-14.57414 14.57414-38.018977 14.764651-52.366884 0.404837-14.347907-14.347907-14.169302-37.792744 0.404837-52.366884l277.099163-277.075349z m0 0\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n <span v-else title=\"播放\" @click=\"controlSound(true)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M536.873674 69.227163c-10.251907 0-21.039628 3.584-29.743627 10.775814L250.749023 301.520372H70.763163c-38.971535 0-70.251163 31.279628-70.251163 69.739163L0 674.816c0 38.459535 31.791628 70.239256 70.763163 70.239256h182.54586l252.797024 198.953674a45.353674 45.353674 0 0 0 29.743627 10.763907c24.587907 0 47.163535-18.967814 47.163535-46.651535l1.024-792.21879c0.523907-27.707535-22.551814-46.675349-47.163535-46.675349z m-23.599627 791.19479l-216.885582-170.746046a69.774884 69.774884 0 0 0-43.067535-14.859907H69.739163l1.035907-303.056372 179.973953-0.500093c16.931721 0 32.815628-6.167814 45.639442-16.931721l217.921488-188.189767-1.035906 694.283906z m207.169488-578.393302c-15.907721-10.752-37.959442-6.144-48.211349 9.751814-10.752 15.883907-6.144 37.935628 9.751814 48.199442 54.343442 36.411535 87.170977 96.398884 87.170977 160.49414 0 62.035349-30.767628 120.498605-82.03907 156.898232a34.685023 34.685023 0 0 0-8.215814 48.711442c6.667907 9.751814 17.419907 14.883721 28.719628 14.883721 7.168 0 14.336-2.059907 19.991814-6.667907 69.75107-49.735442 111.270698-129.738419 111.270698-214.349395 0-87.170977-44.091535-168.68614-118.438698-217.921489z m0 0\" fill=\"#a6b0b3\" />\n <path d=\"M868.62586 154.362047c-14.359814-12.823814-36.411535-11.799814-49.235348 2.56-12.811907 14.359814-11.776 36.399628 2.56 49.211534 84.110884 75.394977 132.298419 182.557767 132.298418 294.340466 0 109.222698-44.079628 210.741581-124.082604 286.124651-13.835907 13.323907-14.859907 35.375628-1.536 49.211535 6.667907 7.191814 15.895814 10.775814 25.635721 10.775814a33.696744 33.696744 0 0 0 24.09972-9.751814C972.204651 747.615256 1024 628.140651 1024 499.95014c0.500093-130.750512-55.903256-256.881116-155.37414-345.588093z m0 0\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n </div>\n\n <!-- 对讲 -->\n <div v-show=\"isLive && streamWorking\" class=\"wwav-player__common-span wwav-player__footer--info\">\n <span v-if=\"!talk\" title=\"关闭\" @click=\"controlTalk(true)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M62.72 62.72a32 32 0 0 1 45.248 0l212.864 212.8 0.96 1.024 340.224 340.224a35.84 35.84 0 0 1 1.216 1.216l89.92 89.92a35.712 35.712 0 0 1 1.088 1.088l207.04 207.04a32 32 0 1 1-45.248 45.248l-187.648-187.648a371.456 371.456 0 0 1-184.32 67.648v65.408H640a32 32 0 1 1 0 64H384a32 32 0 0 1 0-64h96v-65.344a373.376 373.376 0 0 1-341.376-372.032 32 32 0 0 1 64 0 309.312 309.312 0 0 0 479.68 258.304l-46.464-46.464a245.312 245.312 0 0 1-369.216-211.84v-157.44L62.72 108.032a32 32 0 0 1 0-45.248z m267.968 406.592a181.312 181.312 0 0 0 257.856 164.48l-257.92-257.92v93.44zM512 117.312c-66.944 0-125.44 36.288-156.928 90.432a32 32 0 1 1-55.296-32.192 245.312 245.312 0 0 1 457.6 123.072v170.688c0 40.128-9.664 78.08-26.816 111.552a32 32 0 0 1-56.96-29.12 180.48 180.48 0 0 0 19.712-82.432V298.688A181.312 181.312 0 0 0 512 117.312zM885.312 469.312a32 32 0 1 0-64 0c0 63.936-19.328 123.2-52.48 172.48a32 32 0 1 0 53.12 35.712c40-59.52 63.36-131.2 63.36-208.192z\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n <span v-else title=\"打开\" @click=\"controlTalk(false)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"200\">\n <path d=\"M512 53.312a245.312 245.312 0 0 0-245.312 245.376v170.624a245.312 245.312 0 1 0 490.624 0V298.688A245.312 245.312 0 0 0 512 53.312zM330.688 298.688a181.312 181.312 0 1 1 362.624 0v170.624a181.312 181.312 0 1 1-362.624 0V298.688z\" fill=\"#a6b0b3\" />\n <path d=\"M202.688 469.312a32 32 0 0 0-64 0A373.376 373.376 0 0 0 480 841.344v65.28H384a32 32 0 1 0 0 64h256a32 32 0 0 0 0-64H544v-65.28a373.376 373.376 0 0 0 341.312-372.032 32 32 0 1 0-64 0 309.312 309.312 0 1 1-618.624 0z\" fill=\"#a6b0b3\" />\n </svg>\n </span>\n </div>\n </div>\n\n <div class=\"wwav-player__footer--right\">\n <span v-if=\"!isLive && streamWorking\" class=\"wwav-player__common-icon wwav-player__footer--play\">\n <span v-show=\"isPausing\" title=\"播放\" @click=\"changePlayStatus(2)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M701.44 539.648L440.32 711.475a32.973 32.973 0 0 1-45.67-9.42 31.949 31.949 0 0 1-5.53-18.228V340.173a32.973 32.973 0 0 1 32.973-32.973 33.792 33.792 0 0 1 18.227 5.325l261.12 171.827a33.178 33.178 0 0 1 9.42 45.875 37.478 37.478 0 0 1-9.42 9.421z\" />\n <path d=\"M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512z m0-57.958A454.042 454.042 0 1 0 57.958 512 454.246 454.246 0 0 0 512 966.042z\" />\n </svg>\n </span>\n <span v-show=\"isPlaying\" title=\"暂停\" @click=\"changePlayStatus(3)\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M512 8.858C234.496 8.858 8.858 234.496 8.858 512S234.548 1015.142 512 1015.142c277.504 0 503.142-225.69 503.142-503.142C1015.142 234.496 789.504 8.858 512 8.858z m0 937.984A434.79 434.79 0 0 1 77.158 512 434.79 434.79 0 0 1 512 77.158 434.79 434.79 0 0 1 946.842 512 434.79 434.79 0 0 1 512 946.842zM408.474 304.947a45.978 45.978 0 0 0-45.568 45.568v320.922c0 24.832 20.736 45.568 45.568 45.568s45.568-20.736 45.568-45.568V350.515a45.978 45.978 0 0 0-45.568-45.568z m207.052 0a45.978 45.978 0 0 0-45.568 45.568v320.922c0 24.832 20.736 45.568 45.568 45.568s45.568-20.736 45.568-45.568V350.515a45.978 45.978 0 0 0-45.568-45.568z\" />\n </svg>\n </span>\n </span>\n\n <div v-show=\"!isLive && streamWorking && (isH265 && ableH265capture || !isH265)\" class=\"wwav-player__common-span wwav-player__footer--speed\">\n <div title=\"播放速度\" @click=\"showSpeedPop = !showSpeedPop\">\n <span>{{ playSpeed === 1 ? '倍速' : playSpeedText }}</span>\n </div>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--speed-pop\" :class=\"{ 'show': showSpeedPop }\">\n <li class=\"wwav-player__footer--speed-pop--item\">\n <i class=\"wwav-player__common-icon\" @click=\"speedChange('minus')\">-</i>\n <span class=\"speed-text\">{{ playSpeedText }}</span>\n <i class=\"wwav-player__common-icon\" @click=\"speedChange('plus')\">+</i>\n </li>\n </ul>\n </div>\n\n <span v-show=\"(isPlaying || isPausing) && (isH265 && ableH265capture || !isH265)\" class=\"wwav-player__common-icon wwav-player__footer--capture\" title=\"截屏\" @click.stop=\"captureVideo\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1132 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M987.332085 0H146.998468C66.647149 0 1.437957 64.27234 1.437957 143.468936v678.410894a42.550468 42.550468 0 0 0 0 21.830808v36.820426C1.41617 959.72766 66.625362 1024 147.020255 1024h840.333617C1067.726979 1024 1132.93617 959.72766 1132.93617 880.531064V143.468936C1132.93617 64.27234 1067.726979 0 987.332085 0zM146.998468 87.345021h840.333617c31.35183 0 56.973617 25.273191 56.973617 56.123915v544.898724c-32.898723-43.966638-72.769362-92.007489-114.252255-130.069788-24.684936-22.745872-55.383149-32.114383-88.93549-27.430127-52.85583 7.494809-110.788085 50.851404-176.91234 132.24851a1004.456851 1004.456851 0 0 0-41.787915 55.208851c-58.237277-79.218383-172.81634-225.497872-269.987404-292.885787-28.802723-19.957106-61.091404-24.619574-94.011915-14.030979-35.752851 11.547234-70.590638 41.482894-106.016681 91.397447-20.567149 28.693787-41.461106 64.250553-62.681872 106.038468V143.468936a56.799319 56.799319 0 0 1 57.300425-56.123915z\" />\n <path d=\"M697.191489 337.702128a76.255319 76.255319 0 1 0 152.510639 0 76.255319 76.255319 0 1 0-152.510639 0z\" />\n </svg>\n </span>\n\n <div v-if=\"isLive && !isClosed\" class=\"wwav-player__common-span wwav-player__footer--quality\">\n <span @click=\"showQualityPop = !showQualityPop\">{{ videoQualityText }}</span>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--quality-select\" :class=\"{ 'show': showQualityPop }\">\n <li v-for=\"(i, index) in ['高清', '标清', '流畅']\" :key=\"i\" class=\"wwav-player__footer--quality-select--item\" :class=\"{ 'active': index === videoQuality }\" @click=\"changeQuality(index as VideoQuality)\">\n {{ i }}\n </li>\n </ul>\n </div>\n\n <div v-if=\"features.length !== 0\" class=\"wwav-player__common-span wwav-player__footer--setting\">\n <span title=\"其他设置\" @click=\"showSettingPop = !showSettingPop\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n <path d=\"M962.496 448.96c-3.584-19.84-22.656-39.808-42.304-44.288l-14.72-3.392c-34.624-10.432-65.536-33.536-84.992-67.328-19.648-33.984-24.128-72.576-15.616-107.968 0 0 0 0 0 0l4.288-13.824c5.952-19.264-1.792-45.76-17.216-58.816 0 0-13.824-11.712-52.992-34.304-39.168-22.592-56.128-28.736-56.128-28.736-19.008-6.848-45.76-0.32-59.52 14.464L612.928 115.84C586.56 140.672 551.104 155.904 512 155.904c-39.232 0-74.88-15.36-101.248-40.384L400.832 104.832C387.136 90.048 360.32 83.52 341.312 90.368c0 0-17.024 6.144-56.256 28.736C245.952 141.696 232.128 153.344 232.128 153.344 216.768 166.4 209.024 192.832 214.976 212.16l4.288 14.016c8.448 35.328 3.904 73.856-15.68 107.776C184 367.872 152.896 391.04 118.08 401.408L103.808 404.672c-19.648 4.48-38.72 24.448-42.304 44.288 0 0-3.2 17.792-3.2 63.04 0 45.248 3.2 62.976 3.2 62.976 3.584 19.84 22.656 39.808 42.304 44.288l13.952 3.2c0 0 0 0 0 0 34.944 10.304 66.112 33.536 85.824 67.584 19.648 33.984 24.128 72.576 15.616 107.968 0 0 0 0 0 0l-4.224 13.76c-5.952 19.264 1.792 45.76 17.216 58.816 0 0 13.824 11.712 52.992 34.304 39.168 22.592 56.128 28.736 56.128 28.736 19.008 6.848 45.76 0.32 59.52-14.464l9.792-10.56c26.432-25.024 62.08-40.448 101.376-40.448 39.296 0 75.008 15.424 101.44 40.512 0 0 0 0 0.064 0l9.728 10.496c13.76 14.784 40.512 21.312 59.52 14.464 0 0 17.024-6.144 56.256-28.736 39.168-22.592 52.928-34.304 52.928-34.304 15.424-13.056 23.168-39.488 17.216-58.816l-4.352-14.208c-8.32-35.264-3.84-73.664 15.744-107.52 19.648-34.048 50.88-57.216 85.824-67.584 0 0 0-0.064 0-0.064l13.952-3.2c19.648-4.48 38.72-24.448 42.304-44.288 0 0 3.2-17.792 3.2-63.04C965.696 466.752 962.496 448.96 962.496 448.96zM512 692.928c-99.904 0-180.928-81.024-180.928-180.928S412.096 331.136 512 331.136s180.928 81.024 180.928 180.928S611.904 692.928 512 692.928z\" />\n </svg>\n </span>\n <ul class=\"wwav-player__footer__pop wwav-player__footer--setting-pop\" :class=\"{ 'show': showSettingPop }\">\n <li v-if=\"features.indexOf('PTZ') !== -1\" class=\"wwav-player__footer--setting-pop--item\">\n <input v-model=\"PTZSwitch\" class=\"styled-checkbox\" type=\"checkbox\" @change=\"changePTZSwitch\">\n <label>云台(需全屏)</label>\n </li>\n </ul>\n </div>\n </div>\n\n <span class=\"wwav-player__common-icon wwav-player__footer--fullscreen\" title=\"全屏\" @click.stop=\"fullScreen\">\n <svg class=\"wwav-player__svg-icon\" viewBox=\"0 0 1097 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\">\n <path d=\"M51.2 658.285714c29.257143 0 43.885714 21.942857 51.2 43.885715v219.428571h241.371429c29.257143 0 51.2 21.942857 51.2 51.2 0 29.257143-21.942857 43.885714-43.885715 51.2H0V709.485714c0-29.257143 21.942857-51.2 51.2-51.2z m950.857143 0c29.257143 0 51.2 21.942857 51.2 51.2V1024H709.485714c-29.257143 0-51.2-21.942857-51.2-51.2s21.942857-51.2 51.2-51.2H950.857143V709.485714c0-29.257143 21.942857-51.2 51.2-51.2z m-658.285714-658.285714c29.257143 0 51.2 21.942857 51.2 51.2s-21.942857 51.2-51.2 51.2H102.4v212.114286c0 29.257143-21.942857 51.2-51.2 51.2S0 343.771429 0 314.514286V0h343.771429z m709.485714 0v314.514286c0 29.257143-21.942857 51.2-51.2 51.2-29.257143 0-43.885714-21.942857-51.2-43.885715v-219.428571H709.485714c-29.257143 0-51.2-21.942857-51.2-51.2 0-29.257143 21.942857-43.885714 43.885715-51.2h351.085714z\" />\n </svg>\n </span>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue'\nimport { formatNetSpeed, throttle, speedList } from './utils/helper'\nimport type { MediaInfo, StreamInfo, VideoQuality } from '../../types'\n\n// Props\ninterface Props {\n isLive: boolean\n streamWorking: boolean\n isClosed: boolean\n videoStatus: number\n mediaInfo?: MediaInfo\n streamInfo?: StreamInfo\n features?: string[]\n enableAI?: boolean\n devicePath?: string\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mediaInfo: () => ({ format: 'H264' as const, width: 0, height: 0 }),\n streamInfo: () => ({ speed: 0, fps: 0 }),\n features: () => [],\n enableAI: false,\n devicePath: '',\n})\n\n// v-model 绑定\nconst videoQuality = defineModel<VideoQuality>('videoQuality', { default: 1 })\n\n// Emits\nconst emit = defineEmits<{\n (e: 'fullscreen'): void\n (e: 'stop-video'): void\n (e: 'capture-video'): void\n (e: 'change-play-status', status: number): void\n (e: 'change-play-speed', speed: number): void\n (e: 'control-talk', status: boolean): void\n (e: 'control-sound', muted: boolean): void\n (e: 'change-ptz-switch', status: boolean): void\n (e: 'change-ai-status', status: boolean): void\n (e: 'change-quality', quality: VideoQuality): void\n}>()\n\n// 响应式状态\nconst showQualityPop = ref(false)\nconst showInfoPop = ref(false)\nconst showSettingPop = ref(false)\nconst showSpeedPop = ref(false)\nconst muted = ref(true)\nconst talk = ref(false)\nconst PTZSwitch = ref(false)\nconst playSpeed = ref(1)\n\n// 计算属性\nconst isPlaying = computed(() => props.videoStatus === 2)\nconst isPausing = computed(() => props.videoStatus === 3)\nconst isH265 = computed(() => props.mediaInfo.format === 'H265')\nconst ableH265capture = computed(\n () => props.mediaInfo.format === 'H265' && props.mediaInfo.mode === '硬解码'\n)\n\nconst videoQualityText = computed(() => {\n const quality = videoQuality.value\n if (quality === 0) return '高清'\n if (quality === 1) return '标清'\n if (quality === 2) return '流畅'\n return '标清'\n})\n\nconst playSpeedText = computed(() => {\n const index = speedList.findIndex((item) => item.value === playSpeed.value)\n if (index !== -1) {\n return speedList[index].label\n }\n return '1'\n})\n\nconst netSpeed = computed(() => props.streamInfo?.speed || 0)\n\n// 方法\nconst fullScreen = () => emit('fullscreen')\nconst stopVideo = () => {\n muted.value = true\n talk.value = false\n emit('stop-video')\n}\nconst captureVideo = () => emit('capture-video')\n\nconst changeQuality = (num: VideoQuality) => {\n videoQuality.value = num\n showQualityPop.value = false\n\n emit('change-quality', num)\n}\n\nconst changePlayStatus = (status: number) => emit('change-play-status', status)\n\nconst speedChange = throttle((_type: unknown) => {\n const type = String(_type)\n let speed = playSpeed.value\n if (type === 'plus') {\n speed = speed * 2\n if (speed > speedList[0].value) {\n speed = speedList[0].value\n }\n } else {\n speed = speed / 2\n if (speed < speedList[speedList.length - 1].value) {\n speed = speedList[speedList.length - 1].value\n }\n }\n playSpeed.value = speed\n emit('change-play-speed', speed)\n}, 1000)\n\nconst controlSound = (e: boolean) => {\n muted.value = e\n emit('control-sound', muted.value)\n}\n\nconst controlTalk = (e: boolean) => {\n talk.value = e\n emit('control-talk', talk.value)\n}\n\nconst changePTZSwitch = () => emit('change-ptz-switch', PTZSwitch.value)\n</script>\n\n<style lang=\"scss\" scoped>\n.styled-checkbox {\n height: 100%;\n vertical-align: top;\n cursor: pointer;\n}\n</style>\n","<template>\n <div\n class=\"wwav-player__ptz__direction\"\n @mouseup=\"stopCommand\"\n @mouseleave.stop=\"stopCommand\"\n >\n <div class=\"wwav-player-center-middle wwav-player__ptz__direction-content\">\n <div\n v-for=\"command in commands\"\n :key=\"command\"\n :class=\"{ 'wwav-player__ptz__direction-triangle': true, 'active': command === currentDirection }\"\n @mousedown.stop=\"moveToDirection(command)\"\n />\n </div>\n <div class=\"wwav-player-center-middle wwav-player__ptz__direction-circle-border\" />\n <div class=\"wwav-player-center-middle wwav-player__ptz__direction-circle\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onBeforeUnmount } from 'vue'\nimport type { PTZDirection, PTZZoomCommand } from '../../../types'\n\ninterface Props {\n currentDirection?: string\n isInside?: boolean\n isFullscreen?: boolean\n stopAllCommand: () => void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n currentDirection: '',\n isInside: false,\n isFullscreen: false\n})\n\nconst emit = defineEmits<{\n (e: 'move-to-direction', direction: PTZDirection): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n}>()\n\nconst isKeydowning = ref(false)\nconst isBinding = ref(false)\n\nconst commands: PTZDirection[] = [\n 'tilt_up', 'up_right', 'pan_right', 'down_right',\n 'tilt_down', 'down_left', 'pan_left', 'up_left'\n]\n\nconst keyCodeMap = new Map<number, PTZDirection | PTZZoomCommand>([\n [45, 'zoom_in'], // Insert\n [46, 'zoom_out'], // Delete\n [36, 'focus_out'], // Home\n [35, 'focus_in'], // End\n [33, 'iris_down'], // PageUP\n [34, 'iris_up'], // PageDown\n [37, 'pan_left'], // 左方向键\n [38, 'tilt_up'], // 上方向键\n [39, 'pan_right'], // 右方向键\n [40, 'tilt_down'] // 下方向键\n])\n\nconst bindKeyboard = () => {\n document.addEventListener('keydown', keyDown, false)\n document.addEventListener('keyup', keyUp, false)\n isBinding.value = true\n}\n\nconst unbindKeyboard = () => {\n try {\n document.removeEventListener('keydown', keyDown, false)\n document.removeEventListener('keyup', keyUp, false)\n props.stopAllCommand()\n isBinding.value = false\n } catch (error) {\n console.error(error)\n }\n}\n\nconst keyDown = (event: KeyboardEvent) => {\n if (!props.isFullscreen || isKeydowning.value || !props.isInside) return\n isKeydowning.value = true\n const command = keyCodeMap.get(event.keyCode)\n if (command) {\n if ([37, 38, 39, 40].includes(event.keyCode)) {\n emit('move-to-direction', command as PTZDirection)\n } else {\n emit('do-zoom', command as PTZZoomCommand)\n }\n }\n}\n\nconst keyUp = (event: KeyboardEvent) => {\n if (!props.isFullscreen || !props.isInside) return\n const command = keyCodeMap.get(event.keyCode)\n if (command) {\n isKeydowning.value = false\n props.stopAllCommand()\n }\n}\n\nconst moveToDirection = (command: PTZDirection) => {\n emit('move-to-direction', command)\n}\n\nconst stopCommand = () => {\n props.stopAllCommand()\n}\n\nonMounted(() => {\n bindKeyboard()\n})\n\nonBeforeUnmount(() => {\n unbindKeyboard()\n})\n</script>\n","<template>\n <div\n class=\"wwav-player__ptz__direction\"\n @mouseup=\"stopCommand\"\n @mouseleave.stop=\"stopCommand\"\n >\n <div class=\"wwav-player-center-middle wwav-player__ptz__direction-content\">\n <div\n v-for=\"command in commands\"\n :key=\"command\"\n :class=\"{ 'wwav-player__ptz__direction-triangle': true, 'active': command === currentDirection }\"\n @mousedown.stop=\"moveToDirection(command)\"\n />\n </div>\n <div class=\"wwav-player-center-middle wwav-player__ptz__direction-circle-border\" />\n <div class=\"wwav-player-center-middle wwav-player__ptz__direction-circle\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onBeforeUnmount } from 'vue'\nimport type { PTZDirection, PTZZoomCommand } from '../../../types'\n\ninterface Props {\n currentDirection?: string\n isInside?: boolean\n isFullscreen?: boolean\n stopAllCommand: () => void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n currentDirection: '',\n isInside: false,\n isFullscreen: false\n})\n\nconst emit = defineEmits<{\n (e: 'move-to-direction', direction: PTZDirection): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n}>()\n\nconst isKeydowning = ref(false)\nconst isBinding = ref(false)\n\nconst commands: PTZDirection[] = [\n 'tilt_up', 'up_right', 'pan_right', 'down_right',\n 'tilt_down', 'down_left', 'pan_left', 'up_left'\n]\n\nconst keyCodeMap = new Map<number, PTZDirection | PTZZoomCommand>([\n [45, 'zoom_in'], // Insert\n [46, 'zoom_out'], // Delete\n [36, 'focus_out'], // Home\n [35, 'focus_in'], // End\n [33, 'iris_down'], // PageUP\n [34, 'iris_up'], // PageDown\n [37, 'pan_left'], // 左方向键\n [38, 'tilt_up'], // 上方向键\n [39, 'pan_right'], // 右方向键\n [40, 'tilt_down'] // 下方向键\n])\n\nconst bindKeyboard = () => {\n document.addEventListener('keydown', keyDown, false)\n document.addEventListener('keyup', keyUp, false)\n isBinding.value = true\n}\n\nconst unbindKeyboard = () => {\n try {\n document.removeEventListener('keydown', keyDown, false)\n document.removeEventListener('keyup', keyUp, false)\n props.stopAllCommand()\n isBinding.value = false\n } catch (error) {\n console.error(error)\n }\n}\n\nconst keyDown = (event: KeyboardEvent) => {\n if (!props.isFullscreen || isKeydowning.value || !props.isInside) return\n isKeydowning.value = true\n const command = keyCodeMap.get(event.keyCode)\n if (command) {\n if ([37, 38, 39, 40].includes(event.keyCode)) {\n emit('move-to-direction', command as PTZDirection)\n } else {\n emit('do-zoom', command as PTZZoomCommand)\n }\n }\n}\n\nconst keyUp = (event: KeyboardEvent) => {\n if (!props.isFullscreen || !props.isInside) return\n const command = keyCodeMap.get(event.keyCode)\n if (command) {\n isKeydowning.value = false\n props.stopAllCommand()\n }\n}\n\nconst moveToDirection = (command: PTZDirection) => {\n emit('move-to-direction', command)\n}\n\nconst stopCommand = () => {\n props.stopAllCommand()\n}\n\nonMounted(() => {\n bindKeyboard()\n})\n\nonBeforeUnmount(() => {\n unbindKeyboard()\n})\n</script>\n","<template>\n <div class=\"wwav-player__ptz__operation-popper\" :class=\"{ 'wwav-player__ptz__operation-popper-show': show }\">\n <div class=\"wwav-player__ptz__operation-popper-icon\" @mousedown.stop=\"$emit('plus')\">\n <svg viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n <path d=\"M832 464H560V192a48 48 0 1 0-96 0v272H192a48 48 0 1 0 0 96h272v272a48 48 0 1 0 96 0V560h272a48 48 0 1 0 0-96z\" />\n </svg>\n </div>\n <slot name=\"center\" />\n <div class=\"wwav-player__ptz__operation-popper-icon\" @mousedown.stop=\"$emit('minus')\">\n <svg viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n <path d=\"M853.333333 554.666667H170.666667c-23.466667 0-42.666667-19.2-42.666667-42.666667s19.2-42.666667 42.666667-42.666667h682.666666c23.466667 0 42.666667 19.2 42.666667 42.666667s-19.2 42.666667-42.666667 42.666667z\" />\n </svg>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n show?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n show: false\n})\n\ndefineEmits<{\n (e: 'plus'): void\n (e: 'minus'): void\n}>()\n</script>","<template>\n <div class=\"wwav-player__ptz__operation-popper\" :class=\"{ 'wwav-player__ptz__operation-popper-show': show }\">\n <div class=\"wwav-player__ptz__operation-popper-icon\" @mousedown.stop=\"$emit('plus')\">\n <svg viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n <path d=\"M832 464H560V192a48 48 0 1 0-96 0v272H192a48 48 0 1 0 0 96h272v272a48 48 0 1 0 96 0V560h272a48 48 0 1 0 0-96z\" />\n </svg>\n </div>\n <slot name=\"center\" />\n <div class=\"wwav-player__ptz__operation-popper-icon\" @mousedown.stop=\"$emit('minus')\">\n <svg viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\">\n <path d=\"M853.333333 554.666667H170.666667c-23.466667 0-42.666667-19.2-42.666667-42.666667s19.2-42.666667 42.666667-42.666667h682.666666c23.466667 0 42.666667 19.2 42.666667 42.666667s-19.2 42.666667-42.666667 42.666667z\" />\n </svg>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n show?: boolean\n}\n\nwithDefaults(defineProps<Props>(), {\n show: false\n})\n\ndefineEmits<{\n (e: 'plus'): void\n (e: 'minus'): void\n}>()\n</script>","<template>\n <div class=\"wwav-player__ptz__operation-button\" :title=\"title\">\n <div class=\"image\" @click.stop=\"show = !show\">\n <img v-if=\"type === 'Multiple'\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADQElEQVRIS8WWWehVVRSHv08oCINsehC1KKHZ0hKMZrWHKKRBc8IgCIPooR580kKorAhKoh6Kwop6aICSKKKSkApBRWyejCbFSqEHSbRxxYp95Xo9+57zF8r9eM5e69t77bV+a8khWh4iLp3AEXEqsAC4BDgNOA74E/gZ+Ah4G3hR3dH1IkPBBfgAMAv+PeR3wIfATmAUMB44txxkL/AksFz9pe0AVXBE3AI8VBw8ATymfjboMCLyABcDtwNXlygsUNcOgzeCI+IeYBmwAVikbmm7Qf6PiJnAMyUC89XVNbsDwBFxK/Ao8CowT80Qdl4RMQ5YA5wEXKqubzLeDxwRpwObgQ+K0W+diX0bI+IEYBOwCzhL3TPoZxD8GpDhmqR+fTDQnk1EzAVeyCdT762Cy20/BR5RbxsGjYiJwG71p5Z9G4G8/Xj1j/69+24cEXcBdwJnqJ/XHBboV8AOdWwL+KZSYleob9bA75aTndzibCqQN9mrHtGyNw+2HbhPXVoDp+qsU69pchYRZwJjinKlUPwOzCh7f1C3VuzS7/vqdTVwSuBT6uIGkTgR+KaoVZP/beqECjjzZqd6WQ2c9fq8emMD+CjgPeBY4DDg+NQL4Meyd/3gjfqy+0tgq3p5DZzl872a5VRdETGSN87k/RV4Wb2hBn4FmJ5yp2bYG9cIwecUMVqiPlgD3ww8DlypvjEEfDTwVnYq9fqW6NwN3FEE6ZMaODM2M3NDW7iHwbre9siSkN+q0wZtBiVzBZD1Nld9qQtgSGRWllY5S00p3m8NgkeXN8nsvaip/3Y5TETMKTq9Wp3dZNPUFs8upbMbuErNbtV5RcR84GngcOB8NXv6Aas2CFxY+nFK4nLgYTWValiZZZSyC6UA9fymXE5XU9vroe7/ExGp2c8CFwDbUtWA13Pm6g0HEZHCkomTMrsIyIR6DliVtQtkBSR8hppCsm+1DXv5fyGwBJhcrP4uopCzVoJy/VVK7H41m02OQeeVb8cUhUv4Fz1yp/G2OMrppDfeprOE5Xj7MfBOU2+OiJxAc/TtwWf2Wm5ncOfsGtgYEVPKDJbwLeopueU/B5do5TPl8LhJvfZ/A3cup4MN60js/gFMSkEuKKvOXwAAAABJRU5ErkJggg==\" alt=\"\">\n <img v-else-if=\"type === 'Focus'\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADJUlEQVRIS8WX2cuNaxjGf5chJ4QynMk8lESGkE04QDhQlF3YMjuhRPwHiH0gDsyKzQEnFE6UTGWToWwZM6SkbcyhxK3r87x61/rW8K4vH3etVu9az3Nf93xfr/hNoiK4EeFzk4CZwDhgANAV8O8fgMfAVeAMcFHS13p6awJHRDtgCbAR6At8Af4D7gFTgLbAOWAIMCw9PwW2Agck+XxFqQocEYOBY8CIBLQDOCHJHhIRl4EOksakZ0dgLrAGGArcBhZIspHNpCJwREw3SPJwQ7K+JHzlwJnmlBZHaRvQHpgvySkokWbAETEDOAk4ZLMkPalkcTXgnAG9U85dD3PKwUuAI2IQcAN4CUyQ9LZajuoBp/B3Ay4ANmJMPuw/gCOiDXAtVezIap7mPDroUEpaWKuCI6IPcAt4BozOCi4PvBTYD6yUtLdeOzTyf0Q45weA1ZJ2+24TcCqIR8BnV2SRPmwQ2Dh3gI5AP+vPgCe68VvD21xqlgH7gKmSzmfAfwNrgR6S3jfiTdGzEdEFeA3skrQuA74EdJLkYdFqEhE3nU5JYzPgVy57SX+2Gur3WvoHmCapewbsovIofFEG/LilxiQQj9289PJykdQ+D/wGKJ9STyQtbkkUIsJ97qmVl35AT0ltf3Woj6ZQd8uA3UqdJQ1viXdF70SEJ9gnSeMy4C3A+hSGd0UVNXIuIrw23U47JK3PgCcA3q8/RlojSoucjYgVwB5gsqQL+ZH5IO3f1hqZd00cXHCSmrhUk0SEq/cQsEqSLstpEhHLAS+e5ZK8iL4viQTstfgv4N4bJclLo6pExOG0FmsOnYjon3a8CeHYZmsxgbvvTAT+B/6Q5O+KUpAIdE9EwIPDzjzMlFWiPuZbp4DnwOxqntcDTp6eBkwETH3O5j2oRvamAcdTKja5Gsupag2y55SZVGxP9032SkBLclwez4gYCBwxVwKc7502RpJ7sRK9dVjnJXpr7nYd+EuSu6WZ1CP0tn4RYK+tLBLHvm8ymAi8p54JvT8+byM3A4drMZlCrzDJw/Gmu7lXGC92y8cE5o44I+lKkT4sDFxEWSNnvgEeKk4uGlQWRgAAAABJRU5ErkJggg==\" alt=\"\">\n <img v-else src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAEV0lEQVRIS8WXe8jecxjGP5fDiJrkMGxamM00lENGXo0Jmy2iWBabkjHJaWYlc2gx5qyktTlMi5xCDkMZw6hJ/DGHHOcwTZtohDlcuh7f39vvefY+7+Hxh7vef37v9/u97vu6D9f9iP/J1B9c21sA44CTgCOA4cDOwB/AT8CXwFvAc8Brkv7u691egW1vCZwLXA58DDwJvA3MBA4BTge+A/YGuoDTgBHArcBiSX+1c6AtsO0xwBLgPWCepM9tDwaeKBHOlJSIm8z2PsA1wP7ANEmrewLvEdh2KL0bOF/SS7loewjwArBUUiLq1WyfCNwTdiQtaz28GbDtk4H5yWeiLKBDgThwc6H8MGA0sHt8An4AvgI+AFZKWlvuhfbk/RJJcbrbmoBth54cHCdpTbm8A/BmKaY/C/XJcygMQN7YCTgauAL4Hvi2sPM4sBF4GZgo6aMKuRu4FNI7wGxJOdgw208DqdIHgWWSfmvHse2pwNVJEXAgcCawXWFjN+DwquDqwDOAexOZpA0FNN8mSDqlr5zWHJ0I3AYcG8pt7wucB5wDzJG0KGcbwKVPQ8OvaR9Jq2ynT1cVL0Nfv832FOCy0F8xZLvK9+j0eQU8HrgY+AR4X9IS22kJSbq234i1g7ZvAgZJurTGxvPAAknLK+A7StFkQqXAUiSfFo9TKAM224MSBHCqpA8LsxlGIyXNroBXAmcD25f8XAVcJ+mEASM2R30WMF7S9AK8H7BI0lEV8Ddl/qYnM3cfADZIuvM/Am8NfA2MkbTe9lbAGklDK+C1kvYoXj0DZEBMlpT26thsp5UiIhdJSsekkNdJGtITcATgdmCwpN87Rv0XJEqWIfKupMkFuBFkE9Vpbtu7lKIY3pMIDMQR27PKAMk82LO0b6geVgFnJE6XlHaKp1GlFyUtHQhQ61nbr5QOuSV0F/1OcXVVwFGb1ZLuK8ARgGjvQZI2dQJuOzWzXNIo2xGXCEiKbYSkKyvgYyL2kibVmj153pRDHQLPA36RdKPttOoB5W++pFfrIzNNHgX5rES9LbAihSbp4YGAl2jfAA6W9KPtscDCTLLIqSTXRSKDPDocFVqYaVMeSJ5mSXq2P+B2482Mxkck5a3UzK7AuqIDi/OtVRYjChH0CH+099GiuxkkN0h6qB247Uy9pCq0bpQUoWiY7XyfC4ytFsF2i8DxQBa9M8pmmT1qx9LfoT8bR+6mgDLbQ2UKMlRmOeiS9HMBHZkOKfK6+SJQ8y56msKaVGuvUHVoRh+wV3EiV0JfqrUhn8AFwHGSGjJqO6DZaLJ3dS8XTVTXKbQdcciIu1BS8tWr2Z4TFSrFub5G713AjFbQtsA1bzNAIo9zq+hbHNymOJhpNyX02h4FXF+YmdrTvV6BC3jyPK1Mny+Ap0qLxZlhwGPA68D9wJFAVqT8yliQnbyjhb4lshRStsgJBSB5zvaZxSGFljU4m2dW2BXp077S06/fTn090sn//wGEVdYusNmj3QAAAABJRU5ErkJggg==\" alt=\"\">\n </div>\n <ButtonPopper\n v-if=\"!isLockedByOther\"\n :show=\"show\"\n @plus=\"handleZoom(command1)\"\n @minus=\"handleZoom(command2)\"\n />\n <div v-else class=\"wwav-player__ptz__operation-button-disable\" :class=\"{ 'wwav-player__ptz__operation-popper-show': show }\">\n 不可操作\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport ButtonPopper from './popper.vue'\nimport type { PTZZoomCommand } from '../../../../types'\n\ninterface Props {\n isLockedByOther?: boolean\n type: string\n title: string\n command1: PTZZoomCommand\n command2: PTZZoomCommand\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isLockedByOther: false\n})\n\nconst emit = defineEmits<{\n (e: 'do-zoom', command: PTZZoomCommand): void\n}>()\n\nconst show = ref(false)\n\nconst handleZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n</script>","<template>\n <div class=\"wwav-player__ptz__operation-button\" :title=\"title\">\n <div class=\"image\" @click.stop=\"show = !show\">\n <img v-if=\"type === 'Multiple'\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADQElEQVRIS8WWWehVVRSHv08oCINsehC1KKHZ0hKMZrWHKKRBc8IgCIPooR580kKorAhKoh6Kwop6aICSKKKSkApBRWyejCbFSqEHSbRxxYp95Xo9+57zF8r9eM5e69t77bV+a8khWh4iLp3AEXEqsAC4BDgNOA74E/gZ+Ah4G3hR3dH1IkPBBfgAMAv+PeR3wIfATmAUMB44txxkL/AksFz9pe0AVXBE3AI8VBw8ATymfjboMCLyABcDtwNXlygsUNcOgzeCI+IeYBmwAVikbmm7Qf6PiJnAMyUC89XVNbsDwBFxK/Ao8CowT80Qdl4RMQ5YA5wEXKqubzLeDxwRpwObgQ+K0W+diX0bI+IEYBOwCzhL3TPoZxD8GpDhmqR+fTDQnk1EzAVeyCdT762Cy20/BR5RbxsGjYiJwG71p5Z9G4G8/Xj1j/69+24cEXcBdwJnqJ/XHBboV8AOdWwL+KZSYleob9bA75aTndzibCqQN9mrHtGyNw+2HbhPXVoDp+qsU69pchYRZwJjinKlUPwOzCh7f1C3VuzS7/vqdTVwSuBT6uIGkTgR+KaoVZP/beqECjjzZqd6WQ2c9fq8emMD+CjgPeBY4DDg+NQL4Meyd/3gjfqy+0tgq3p5DZzl872a5VRdETGSN87k/RV4Wb2hBn4FmJ5yp2bYG9cIwecUMVqiPlgD3ww8DlypvjEEfDTwVnYq9fqW6NwN3FEE6ZMaODM2M3NDW7iHwbre9siSkN+q0wZtBiVzBZD1Nld9qQtgSGRWllY5S00p3m8NgkeXN8nsvaip/3Y5TETMKTq9Wp3dZNPUFs8upbMbuErNbtV5RcR84GngcOB8NXv6Aas2CFxY+nFK4nLgYTWValiZZZSyC6UA9fymXE5XU9vroe7/ExGp2c8CFwDbUtWA13Pm6g0HEZHCkomTMrsIyIR6DliVtQtkBSR8hppCsm+1DXv5fyGwBJhcrP4uopCzVoJy/VVK7H41m02OQeeVb8cUhUv4Fz1yp/G2OMrppDfeprOE5Xj7MfBOU2+OiJxAc/TtwWf2Wm5ncOfsGtgYEVPKDJbwLeopueU/B5do5TPl8LhJvfZ/A3cup4MN60js/gFMSkEuKKvOXwAAAABJRU5ErkJggg==\" alt=\"\">\n <img v-else-if=\"type === 'Focus'\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADJUlEQVRIS8WX2cuNaxjGf5chJ4QynMk8lESGkE04QDhQlF3YMjuhRPwHiH0gDsyKzQEnFE6UTGWToWwZM6SkbcyhxK3r87x61/rW8K4vH3etVu9az3Nf93xfr/hNoiK4EeFzk4CZwDhgANAV8O8fgMfAVeAMcFHS13p6awJHRDtgCbAR6At8Af4D7gFTgLbAOWAIMCw9PwW2Agck+XxFqQocEYOBY8CIBLQDOCHJHhIRl4EOksakZ0dgLrAGGArcBhZIspHNpCJwREw3SPJwQ7K+JHzlwJnmlBZHaRvQHpgvySkokWbAETEDOAk4ZLMkPalkcTXgnAG9U85dD3PKwUuAI2IQcAN4CUyQ9LZajuoBp/B3Ay4ANmJMPuw/gCOiDXAtVezIap7mPDroUEpaWKuCI6IPcAt4BozOCi4PvBTYD6yUtLdeOzTyf0Q45weA1ZJ2+24TcCqIR8BnV2SRPmwQ2Dh3gI5AP+vPgCe68VvD21xqlgH7gKmSzmfAfwNrgR6S3jfiTdGzEdEFeA3skrQuA74EdJLkYdFqEhE3nU5JYzPgVy57SX+2Gur3WvoHmCapewbsovIofFEG/LilxiQQj9289PJykdQ+D/wGKJ9STyQtbkkUIsJ97qmVl35AT0ltf3Woj6ZQd8uA3UqdJQ1viXdF70SEJ9gnSeMy4C3A+hSGd0UVNXIuIrw23U47JK3PgCcA3q8/RlojSoucjYgVwB5gsqQL+ZH5IO3f1hqZd00cXHCSmrhUk0SEq/cQsEqSLstpEhHLAS+e5ZK8iL4viQTstfgv4N4bJclLo6pExOG0FmsOnYjon3a8CeHYZmsxgbvvTAT+B/6Q5O+KUpAIdE9EwIPDzjzMlFWiPuZbp4DnwOxqntcDTp6eBkwETH3O5j2oRvamAcdTKja5Gsupag2y55SZVGxP9032SkBLclwez4gYCBwxVwKc7502RpJ7sRK9dVjnJXpr7nYd+EuSu6WZ1CP0tn4RYK+tLBLHvm8ymAi8p54JvT8+byM3A4drMZlCrzDJw/Gmu7lXGC92y8cE5o44I+lKkT4sDFxEWSNnvgEeKk4uGlQWRgAAAABJRU5ErkJggg==\" alt=\"\">\n <img v-else src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAEV0lEQVRIS8WXe8jecxjGP5fDiJrkMGxamM00lENGXo0Jmy2iWBabkjHJaWYlc2gx5qyktTlMi5xCDkMZw6hJ/DGHHOcwTZtohDlcuh7f39vvefY+7+Hxh7vef37v9/u97vu6D9f9iP/J1B9c21sA44CTgCOA4cDOwB/AT8CXwFvAc8Brkv7u691egW1vCZwLXA58DDwJvA3MBA4BTge+A/YGuoDTgBHArcBiSX+1c6AtsO0xwBLgPWCepM9tDwaeKBHOlJSIm8z2PsA1wP7ANEmrewLvEdh2KL0bOF/SS7loewjwArBUUiLq1WyfCNwTdiQtaz28GbDtk4H5yWeiLKBDgThwc6H8MGA0sHt8An4AvgI+AFZKWlvuhfbk/RJJcbrbmoBth54cHCdpTbm8A/BmKaY/C/XJcygMQN7YCTgauAL4Hvi2sPM4sBF4GZgo6aMKuRu4FNI7wGxJOdgw208DqdIHgWWSfmvHse2pwNVJEXAgcCawXWFjN+DwquDqwDOAexOZpA0FNN8mSDqlr5zWHJ0I3AYcG8pt7wucB5wDzJG0KGcbwKVPQ8OvaR9Jq2ynT1cVL0Nfv832FOCy0F8xZLvK9+j0eQU8HrgY+AR4X9IS22kJSbq234i1g7ZvAgZJurTGxvPAAknLK+A7StFkQqXAUiSfFo9TKAM224MSBHCqpA8LsxlGIyXNroBXAmcD25f8XAVcJ+mEASM2R30WMF7S9AK8H7BI0lEV8Ddl/qYnM3cfADZIuvM/Am8NfA2MkbTe9lbAGklDK+C1kvYoXj0DZEBMlpT26thsp5UiIhdJSsekkNdJGtITcATgdmCwpN87Rv0XJEqWIfKupMkFuBFkE9Vpbtu7lKIY3pMIDMQR27PKAMk82LO0b6geVgFnJE6XlHaKp1GlFyUtHQhQ61nbr5QOuSV0F/1OcXVVwFGb1ZLuK8ARgGjvQZI2dQJuOzWzXNIo2xGXCEiKbYSkKyvgYyL2kibVmj153pRDHQLPA36RdKPttOoB5W++pFfrIzNNHgX5rES9LbAihSbp4YGAl2jfAA6W9KPtscDCTLLIqSTXRSKDPDocFVqYaVMeSJ5mSXq2P+B2482Mxkck5a3UzK7AuqIDi/OtVRYjChH0CH+099GiuxkkN0h6qB247Uy9pCq0bpQUoWiY7XyfC4ytFsF2i8DxQBa9M8pmmT1qx9LfoT8bR+6mgDLbQ2UKMlRmOeiS9HMBHZkOKfK6+SJQ8y56msKaVGuvUHVoRh+wV3EiV0JfqrUhn8AFwHGSGjJqO6DZaLJ3dS8XTVTXKbQdcciIu1BS8tWr2Z4TFSrFub5G713AjFbQtsA1bzNAIo9zq+hbHNymOJhpNyX02h4FXF+YmdrTvV6BC3jyPK1Mny+Ap0qLxZlhwGPA68D9wJFAVqT8yliQnbyjhb4lshRStsgJBSB5zvaZxSGFljU4m2dW2BXp077S06/fTn090sn//wGEVdYusNmj3QAAAABJRU5ErkJggg==\" alt=\"\">\n </div>\n <ButtonPopper\n v-if=\"!isLockedByOther\"\n :show=\"show\"\n @plus=\"handleZoom(command1)\"\n @minus=\"handleZoom(command2)\"\n />\n <div v-else class=\"wwav-player__ptz__operation-button-disable\" :class=\"{ 'wwav-player__ptz__operation-popper-show': show }\">\n 不可操作\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport ButtonPopper from './popper.vue'\nimport type { PTZZoomCommand } from '../../../../types'\n\ninterface Props {\n isLockedByOther?: boolean\n type: string\n title: string\n command1: PTZZoomCommand\n command2: PTZZoomCommand\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isLockedByOther: false\n})\n\nconst emit = defineEmits<{\n (e: 'do-zoom', command: PTZZoomCommand): void\n}>()\n\nconst show = ref(false)\n\nconst handleZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n</script>","<template>\n <div\n :class=\"{ 'wwav-player__ptz__operation-button': true, isLocked: isLocked }\"\n title=\"锁定\"\n @mousedown.stop=\"() => {}\"\n @mousemove.stop=\"() => {}\"\n @mouseup.stop=\"() => {}\"\n >\n <div class=\"image\" @click=\"handleClick\">\n <img\n v-if=\"isLocked\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACAklEQVRIS+2WMUiWURSGn7eIEhqiCArcTAzNhiAIGwMxijBsSmgMsgZxaonAySVqscC1oCUSQiGquXQKK7MiR0OQoqEhIX3jwBf82u9/r34/idBZ7vCde5573vvd916xSaFN4rIusO09wDXgPNBWLPodMAoMS/qe20g22HYH8Ag4CCwBn4uxBdgOfAF6JE3kwLPAtg8Dk8Bu4A4wJGkhALb3A9eBfuAHcFzSpxQ8F/wCOAUMSLpdrajtAeAW8FxSZ2mw7UNAdDAFHJPkNcDRxGvgKNAsabYWPNmx7V7gATAo6WatYrYHgRvARUkPy4KvAHeBq5JiXDNs98XfDfRJulcvcLKY7T+LTObmSJ1dbOuCbYchxNndBVwozulQYSC1tm517k/gg6QwnBXxl9S2W4EnQFPqLGZ+D4c7J2mmMr8a+BVwAvgKjAGLmYDVaaHWWWAv8FLSyRT4V+HBbZJitRuOwnymgW2SdqTA4UzTko5smFgx0XaAWyWtULea1AF+Kymsr3TYfgO0b32w7ftxK0q6lLDR+nZsez6Akg78B1cqUPefy/ZcsceN/1rqrmKPn9YT/FFSXBKlw3Y8m+IplDSQuFHC3k5LelaGbDsefaHIoqSGlGXG47wbWAbel7gkdoZVhk8DjyX1pMD7gBHgDBCTy0SoNw5clvStJrgMZT1zfwNkdRIu4LPeUgAAAABJRU5ErkJggg==\"\n alt=\"\"\n />\n <img\n v-else\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACAklEQVRIS+2WMUiWURSGn7eIEhqiCArcTAzNhiAIGwMxijBsSmgMsgZxaonAySVqscC1oCUSQiGquXQKK7MiR0OQoqEhIX3jwBf82u9/r34/idBZ7vCde5573vvd916xSaFN4rIusO09wDXgPNBWLPodMAoMS/qe20g22HYH8Ag4CCwBn4uxBdgOfAF6JE3kwLPAtg8Dk8Bu4A4wJGkhALb3A9eBfuAHcFzSpxQ8F/wCOAUMSLpdrajtAeAW8FxSZ2mw7UNAdDAFHJPkNcDRxGvgKNAsabYWPNmx7V7gATAo6WatYrYHgRvARUkPy4KvAHeBq5JiXDNs98XfDfRJulcvcLKY7T+LTObmSJ1dbOuCbYchxNndBVwozulQYSC1tm517k/gg6QwnBXxl9S2W4EnQFPqLGZ+D4c7J2mmMr8a+BVwAvgKjAGLmYDVaaHWWWAv8FLSyRT4V+HBbZJitRuOwnymgW2SdqTA4UzTko5smFgx0XaAWyWtULea1AF+Kymsr3TYfgO0b32w7ftxK0q6lLDR+nZsez6Akg78B1cqUPefy/ZcsceN/1rqrmKPn9YT/FFSXBKlw3Y8m+IplDSQuFHC3k5LelaGbDsefaHIoqSGlGXG47wbWAbel7gkdoZVhk8DjyX1pMD7gBHgDBCTy0SoNw5clvStJrgMZT1zfwNkdRIu4LPeUgAAAABJRU5ErkJggg==\"\n alt=\"\"\n />\n </div>\n <div\n v-if=\"isLockedByOther\"\n class=\"wwav-player__ptz__operation-button-disable\"\n :class=\"{ 'wwav-player__ptz__operation-popper-show': show }\"\n >\n 不可操作\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onBeforeUnmount } from 'vue'\n\ninterface Props {\n isLocked?: boolean\n isLockedByOther?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isLocked: false,\n isLockedByOther: false\n})\n\nconst emit = defineEmits<{\n (e: 'lock-ptz'): void\n (e: 'unlock-ptz'): void\n}>()\n\nconst show = ref(false)\nconst processing = ref(false)\nconst localLocked = ref(props.isLocked)\n\nconst handleClick = () => {\n if (processing.value) return\n if (props.isLockedByOther) {\n show.value = true\n return\n }\n processing.value = true\n if (!localLocked.value) {\n emit('lock-ptz')\n } else {\n emit('unlock-ptz')\n }\n setTimeout(() => {\n processing.value = false\n localLocked.value = !localLocked.value\n }, 1000)\n}\n\nonBeforeUnmount(() => {\n emit('unlock-ptz')\n})\n</script>\n","<template>\n <div\n :class=\"{ 'wwav-player__ptz__operation-button': true, isLocked: isLocked }\"\n title=\"锁定\"\n @mousedown.stop=\"() => {}\"\n @mousemove.stop=\"() => {}\"\n @mouseup.stop=\"() => {}\"\n >\n <div class=\"image\" @click=\"handleClick\">\n <img\n v-if=\"isLocked\"\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACAklEQVRIS+2WMUiWURSGn7eIEhqiCArcTAzNhiAIGwMxijBsSmgMsgZxaonAySVqscC1oCUSQiGquXQKK7MiR0OQoqEhIX3jwBf82u9/r34/idBZ7vCde5573vvd916xSaFN4rIusO09wDXgPNBWLPodMAoMS/qe20g22HYH8Ag4CCwBn4uxBdgOfAF6JE3kwLPAtg8Dk8Bu4A4wJGkhALb3A9eBfuAHcFzSpxQ8F/wCOAUMSLpdrajtAeAW8FxSZ2mw7UNAdDAFHJPkNcDRxGvgKNAsabYWPNmx7V7gATAo6WatYrYHgRvARUkPy4KvAHeBq5JiXDNs98XfDfRJulcvcLKY7T+LTObmSJ1dbOuCbYchxNndBVwozulQYSC1tm517k/gg6QwnBXxl9S2W4EnQFPqLGZ+D4c7J2mmMr8a+BVwAvgKjAGLmYDVaaHWWWAv8FLSyRT4V+HBbZJitRuOwnymgW2SdqTA4UzTko5smFgx0XaAWyWtULea1AF+Kymsr3TYfgO0b32w7ftxK0q6lLDR+nZsez6Akg78B1cqUPefy/ZcsceN/1rqrmKPn9YT/FFSXBKlw3Y8m+IplDSQuFHC3k5LelaGbDsefaHIoqSGlGXG47wbWAbel7gkdoZVhk8DjyX1pMD7gBHgDBCTy0SoNw5clvStJrgMZT1zfwNkdRIu4LPeUgAAAABJRU5ErkJggg==\"\n alt=\"\"\n />\n <img\n v-else\n src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACAklEQVRIS+2WMUiWURSGn7eIEhqiCArcTAzNhiAIGwMxijBsSmgMsgZxaonAySVqscC1oCUSQiGquXQKK7MiR0OQoqEhIX3jwBf82u9/r34/idBZ7vCde5573vvd916xSaFN4rIusO09wDXgPNBWLPodMAoMS/qe20g22HYH8Ag4CCwBn4uxBdgOfAF6JE3kwLPAtg8Dk8Bu4A4wJGkhALb3A9eBfuAHcFzSpxQ8F/wCOAUMSLpdrajtAeAW8FxSZ2mw7UNAdDAFHJPkNcDRxGvgKNAsabYWPNmx7V7gATAo6WatYrYHgRvARUkPy4KvAHeBq5JiXDNs98XfDfRJulcvcLKY7T+LTObmSJ1dbOuCbYchxNndBVwozulQYSC1tm517k/gg6QwnBXxl9S2W4EnQFPqLGZ+D4c7J2mmMr8a+BVwAvgKjAGLmYDVaaHWWWAv8FLSyRT4V+HBbZJitRuOwnymgW2SdqTA4UzTko5smFgx0XaAWyWtULea1AF+Kymsr3TYfgO0b32w7ftxK0q6lLDR+nZsez6Akg78B1cqUPefy/ZcsceN/1rqrmKPn9YT/FFSXBKlw3Y8m+IplDSQuFHC3k5LelaGbDsefaHIoqSGlGXG47wbWAbel7gkdoZVhk8DjyX1pMD7gBHgDBCTy0SoNw5clvStJrgMZT1zfwNkdRIu4LPeUgAAAABJRU5ErkJggg==\"\n alt=\"\"\n />\n </div>\n <div\n v-if=\"isLockedByOther\"\n class=\"wwav-player__ptz__operation-button-disable\"\n :class=\"{ 'wwav-player__ptz__operation-popper-show': show }\"\n >\n 不可操作\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onBeforeUnmount } from 'vue'\n\ninterface Props {\n isLocked?: boolean\n isLockedByOther?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n isLocked: false,\n isLockedByOther: false\n})\n\nconst emit = defineEmits<{\n (e: 'lock-ptz'): void\n (e: 'unlock-ptz'): void\n}>()\n\nconst show = ref(false)\nconst processing = ref(false)\nconst localLocked = ref(props.isLocked)\n\nconst handleClick = () => {\n if (processing.value) return\n if (props.isLockedByOther) {\n show.value = true\n return\n }\n processing.value = true\n if (!localLocked.value) {\n emit('lock-ptz')\n } else {\n emit('unlock-ptz')\n }\n setTimeout(() => {\n processing.value = false\n localLocked.value = !localLocked.value\n }, 1000)\n}\n\nonBeforeUnmount(() => {\n emit('unlock-ptz')\n})\n</script>\n","<template>\n <div class=\"wwav-player__ptz__operation\" @mouseup=\"stopCommand\" @mouseleave.stop=\"stopCommand\">\n <OperationButton\n :is-locked-by-other=\"isLockedByOther\"\n type=\"Multiple\"\n title=\"变倍\"\n command1=\"zoom_in\"\n command2=\"zoom_out\"\n @do-zoom=\"doZoom\"\n />\n <OperationButton\n :is-locked-by-other=\"isLockedByOther\"\n type=\"Focus\"\n title=\"聚焦\"\n command1=\"focus_in\"\n command2=\"focus_out\"\n @do-zoom=\"doZoom\"\n />\n <OperationButton\n :is-locked-by-other=\"isLockedByOther\"\n type=\"Aperature\"\n title=\"光圈\"\n command1=\"iris_down\"\n command2=\"iris_up\"\n @do-zoom=\"doZoom\"\n />\n\n <div class=\"wwav-player__ptz__operation-button\" title=\"速度\" @mouseup=\"() => {}\">\n <div class=\"image\" @click=\"isShowSpeed = !isShowSpeed\">\n <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADAUlEQVRIS+2WXcifcxjHPx89lBUrMwdbMtrBkHaA1oZGZLUozjgQQmPZMEeKnVhKqWENIaWkOJKXxCiUl81L0xoRaSnJyxJlXsZX17P7XvezPc//vp95tBPXyfPU/ftdn+v6Xi+/vxwm87/kJlmofjEZY1rgJCcAS4GFwHFAgN3Al8BW9dsWkuQ84Bd1+yGBk8wCrgWuAc4Epgr2Z+B49c8kc4D71aumUnRkxkluADYAlelvwCvAm8CnwA/A38Bc4FRgTL2vQEleAB5Tn58WOMmxwFPApcBPwL3AI2r9P9KS3ArcWMGoVYpJ7aCMG5leBxYDLwLXqd/1AZtMqxRvA7epDyc5uiQH7lS/7/qYAG4OlpRnAxuB20dF3XWU5BjgI2A2cJK6J8n1JXk1HnC+WuUatwPBDwE3AY+rVd/BluRp4ErgbnV9p7sLXAFsVm8+CJykxqRk+hhYov4xlNrJbA+woFuaJEcB24AzgHPU9yZknGQLcCGwrP04BJzk9MZxjd2j6qoD7yVZArwLvKZevB+cZBHwCbBFXTEE2DRTwSqbgv9Vf9XPJruf5FXgImCR+vl4jZPcAdwDXKE+Mw1wW7+68px6+VR3k1T9qw/uUje04FoMFc1ctVZgr3UctWerRCXnpJakVmwtnXG5W/DXJZW6oJe4T6Ha1R8CtWjK3lAv6LubZBdwhHpiC/61ulmtzh5pSY4E3gHO6hxcoVYN++6WIovVWS14b42SunzA5VqJtVxa+0CthdNrSd5qpmasBf8IfKPWrPVFXWNX/dDaJepLfffqe5IdwDx1Tgt+vxnw2ervo5w0TfUkUJIPqm0DHQPq6RwvaQveDKwGzlVre/VlfRpwGfBE9/HvCXhZsxk3quta8Eqg5HpQvaUPfCjfkzwArAVWqi+34JLhK6BemFOGzvLQAJoZLv8l9cnq3v2vU5I1lTGwSa3IZsw62a5VN5XjLriyrpdjp3r1jFH3dfOzwHxgeWU7ATyToCG+pvXzdojDoWf+Bw9V6l+fO2xS/wMInjMueg7JWQAAAABJRU5ErkJggg==\" alt=\"\">\n </div>\n <ButtonPopper\n style=\"top: -124px;\"\n :show=\"isShowSpeed\"\n @plus=\"changeSpeed('plus')\"\n @minus=\"changeSpeed('minus')\"\n >\n <template #center>\n <span>{{ step }}</span>\n </template>\n </ButtonPopper>\n </div>\n\n <LockButton\n :is-locked=\"isLocked\"\n :is-locked-by-other=\"isLockedByOther\"\n @lock-ptz=\"lockPTZ\"\n @unlock-ptz=\"unlockPTZ\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport OperationButton from './components/operationButton.vue'\nimport LockButton from './components/lockButton.vue'\nimport ButtonPopper from './components/popper.vue'\nimport type { PTZZoomCommand } from '../../../types'\n\ninterface Props {\n step?: number\n isLocked?: boolean\n isLockedByOther?: boolean\n stopAllCommand: () => void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n step: 4,\n isLocked: false,\n isLockedByOther: false\n})\n\nconst emit = defineEmits<{\n (e: 'update:step', value: number): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n (e: 'lock-ptz'): void\n (e: 'unlock-ptz'): void\n}>()\n\nconst isShowSpeed = ref(false)\nconst localStep = ref(props.step)\n\nconst changeSpeed = (type: string) => {\n if (type === 'plus' && localStep.value < 7) {\n localStep.value++\n emit('update:step', localStep.value)\n } else if (type === 'minus' && localStep.value > 1) {\n localStep.value--\n emit('update:step', localStep.value)\n }\n}\n\nconst doZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n\nconst lockPTZ = () => emit('lock-ptz')\nconst unlockPTZ = () => emit('unlock-ptz')\nconst stopCommand = () => props.stopAllCommand()\n</script>","<template>\n <div class=\"wwav-player__ptz__operation\" @mouseup=\"stopCommand\" @mouseleave.stop=\"stopCommand\">\n <OperationButton\n :is-locked-by-other=\"isLockedByOther\"\n type=\"Multiple\"\n title=\"变倍\"\n command1=\"zoom_in\"\n command2=\"zoom_out\"\n @do-zoom=\"doZoom\"\n />\n <OperationButton\n :is-locked-by-other=\"isLockedByOther\"\n type=\"Focus\"\n title=\"聚焦\"\n command1=\"focus_in\"\n command2=\"focus_out\"\n @do-zoom=\"doZoom\"\n />\n <OperationButton\n :is-locked-by-other=\"isLockedByOther\"\n type=\"Aperature\"\n title=\"光圈\"\n command1=\"iris_down\"\n command2=\"iris_up\"\n @do-zoom=\"doZoom\"\n />\n\n <div class=\"wwav-player__ptz__operation-button\" title=\"速度\" @mouseup=\"() => {}\">\n <div class=\"image\" @click=\"isShowSpeed = !isShowSpeed\">\n <img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADAUlEQVRIS+2WXcifcxjHPx89lBUrMwdbMtrBkHaA1oZGZLUozjgQQmPZMEeKnVhKqWENIaWkOJKXxCiUl81L0xoRaSnJyxJlXsZX17P7XvezPc//vp95tBPXyfPU/ftdn+v6Xi+/vxwm87/kJlmofjEZY1rgJCcAS4GFwHFAgN3Al8BW9dsWkuQ84Bd1+yGBk8wCrgWuAc4Epgr2Z+B49c8kc4D71aumUnRkxkluADYAlelvwCvAm8CnwA/A38Bc4FRgTL2vQEleAB5Tn58WOMmxwFPApcBPwL3AI2r9P9KS3ArcWMGoVYpJ7aCMG5leBxYDLwLXqd/1AZtMqxRvA7epDyc5uiQH7lS/7/qYAG4OlpRnAxuB20dF3XWU5BjgI2A2cJK6J8n1JXk1HnC+WuUatwPBDwE3AY+rVd/BluRp4ErgbnV9p7sLXAFsVm8+CJykxqRk+hhYov4xlNrJbA+woFuaJEcB24AzgHPU9yZknGQLcCGwrP04BJzk9MZxjd2j6qoD7yVZArwLvKZevB+cZBHwCbBFXTEE2DRTwSqbgv9Vf9XPJruf5FXgImCR+vl4jZPcAdwDXKE+Mw1wW7+68px6+VR3k1T9qw/uUje04FoMFc1ctVZgr3UctWerRCXnpJakVmwtnXG5W/DXJZW6oJe4T6Ha1R8CtWjK3lAv6LubZBdwhHpiC/61ulmtzh5pSY4E3gHO6hxcoVYN++6WIovVWS14b42SunzA5VqJtVxa+0CthdNrSd5qpmasBf8IfKPWrPVFXWNX/dDaJepLfffqe5IdwDx1Tgt+vxnw2ervo5w0TfUkUJIPqm0DHQPq6RwvaQveDKwGzlVre/VlfRpwGfBE9/HvCXhZsxk3quta8Eqg5HpQvaUPfCjfkzwArAVWqi+34JLhK6BemFOGzvLQAJoZLv8l9cnq3v2vU5I1lTGwSa3IZsw62a5VN5XjLriyrpdjp3r1jFH3dfOzwHxgeWU7ATyToCG+pvXzdojDoWf+Bw9V6l+fO2xS/wMInjMueg7JWQAAAABJRU5ErkJggg==\" alt=\"\">\n </div>\n <ButtonPopper\n style=\"top: -124px;\"\n :show=\"isShowSpeed\"\n @plus=\"changeSpeed('plus')\"\n @minus=\"changeSpeed('minus')\"\n >\n <template #center>\n <span>{{ step }}</span>\n </template>\n </ButtonPopper>\n </div>\n\n <LockButton\n :is-locked=\"isLocked\"\n :is-locked-by-other=\"isLockedByOther\"\n @lock-ptz=\"lockPTZ\"\n @unlock-ptz=\"unlockPTZ\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport OperationButton from './components/operationButton.vue'\nimport LockButton from './components/lockButton.vue'\nimport ButtonPopper from './components/popper.vue'\nimport type { PTZZoomCommand } from '../../../types'\n\ninterface Props {\n step?: number\n isLocked?: boolean\n isLockedByOther?: boolean\n stopAllCommand: () => void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n step: 4,\n isLocked: false,\n isLockedByOther: false\n})\n\nconst emit = defineEmits<{\n (e: 'update:step', value: number): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n (e: 'lock-ptz'): void\n (e: 'unlock-ptz'): void\n}>()\n\nconst isShowSpeed = ref(false)\nconst localStep = ref(props.step)\n\nconst changeSpeed = (type: string) => {\n if (type === 'plus' && localStep.value < 7) {\n localStep.value++\n emit('update:step', localStep.value)\n } else if (type === 'minus' && localStep.value > 1) {\n localStep.value--\n emit('update:step', localStep.value)\n }\n}\n\nconst doZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n\nconst lockPTZ = () => emit('lock-ptz')\nconst unlockPTZ = () => emit('unlock-ptz')\nconst stopCommand = () => props.stopAllCommand()\n</script>","<template>\n <Transition name=\"fade\">\n <div v-if=\"visible\" class=\"wwav-player__ptz-message\" :class=\"type\">\n {{ message }}\n </div>\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\nconst visible = ref(false)\nconst message = ref('')\nconst type = ref<'success' | 'error' | 'info'>('info')\n\nconst show = (msg: string, msgType: 'success' | 'error' | 'info' = 'info') => {\n message.value = msg\n type.value = msgType\n visible.value = true\n setTimeout(() => {\n visible.value = false\n }, 3000)\n}\n\ndefineExpose({ show })\n</script>\n\n<style scoped>\n.wwav-player__ptz-message {\n position: absolute;\n top: 10px;\n left: 50%;\n transform: translateX(-50%);\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n z-index: 100;\n}\n\n.wwav-player__ptz-message.success {\n background: #67c23a;\n color: #fff;\n}\n\n.wwav-player__ptz-message.error {\n background: #f56c6c;\n color: #fff;\n}\n\n.wwav-player__ptz-message.info {\n background: #909399;\n color: #fff;\n}\n\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","<template>\n <Transition name=\"fade\">\n <div v-if=\"visible\" class=\"wwav-player__ptz-message\" :class=\"type\">\n {{ message }}\n </div>\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\nconst visible = ref(false)\nconst message = ref('')\nconst type = ref<'success' | 'error' | 'info'>('info')\n\nconst show = (msg: string, msgType: 'success' | 'error' | 'info' = 'info') => {\n message.value = msg\n type.value = msgType\n visible.value = true\n setTimeout(() => {\n visible.value = false\n }, 3000)\n}\n\ndefineExpose({ show })\n</script>\n\n<style scoped>\n.wwav-player__ptz-message {\n position: absolute;\n top: 10px;\n left: 50%;\n transform: translateX(-50%);\n padding: 8px 16px;\n border-radius: 4px;\n font-size: 14px;\n z-index: 100;\n}\n\n.wwav-player__ptz-message.success {\n background: #67c23a;\n color: #fff;\n}\n\n.wwav-player__ptz-message.error {\n background: #f56c6c;\n color: #fff;\n}\n\n.wwav-player__ptz-message.info {\n background: #909399;\n color: #fff;\n}\n\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n</style>\n","import { ref, onBeforeUnmount } from 'vue'\n\nexport function useLock() {\n const isLocked = ref(false)\n const lockToken = ref<string | null>(null)\n const isLockedByOther = ref(false)\n const unlockTimerId = ref<ReturnType<typeof setInterval>>(0)\n const idle_timeout = 10\n\n // 重置锁定状态\n const resetLock = () => {\n if (unlockTimerId.value) {\n clearInterval(unlockTimerId.value)\n }\n unlockTimerId.value = 0\n lockToken.value = null\n isLocked.value = false\n isLockedByOther.value = false\n }\n\n // 组件卸载时清理\n onBeforeUnmount(() => {\n resetLock()\n })\n\n return {\n isLocked,\n lockToken,\n isLockedByOther,\n unlockTimerId,\n idle_timeout,\n resetLock\n }\n}\n","<template>\n <div\n ref=\"videoContainer\"\n class=\"wwav-player__ptz\"\n @wheel.self.prevent=\"handleWheel\"\n @mouseleave=\"handleMouseLeave\"\n >\n <span v-show=\"isFullscreen\" class=\"wwav-player__ptz-status-label\">\n 可操控: {{ isLockedByOther ? '否' : '是' }}\n </span>\n <Direction\n v-show=\"isFullscreen\"\n :current-direction=\"currentDirection\"\n :stop-all-command=\"handleStopAllCommand\"\n :is-inside=\"isInside\"\n :is-fullscreen=\"isFullscreen\"\n @move-to-direction=\"handleMoveToDirection\"\n @do-zoom=\"handleDoZoom\"\n />\n <Operation\n v-show=\"isFullscreen\"\n v-model:step=\"step\"\n :is-locked=\"isLocked\"\n :is-locked-by-other=\"isLockedByOther\"\n :stop-all-command=\"handleStopAllCommand\"\n @do-zoom=\"handleDoZoom\"\n @lock-ptz=\"handleLockPTZ\"\n @unlock-ptz=\"handleUnlockPTZ\"\n />\n <PTZMessage ref=\"messageRef\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onBeforeUnmount } from 'vue'\nimport Direction from './direction.vue'\nimport Operation from './operations.vue'\nimport PTZMessage from './components/message.vue'\nimport { useLock } from './composables/useLock'\nimport { throttle } from '../utils/helper'\nimport type { PTZDirection, PTZZoomCommand } from '../../../types'\nimport './controller.css'\n\ninterface Props {\n devicePath?: string\n isFullscreen?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n devicePath: '',\n isFullscreen: false\n})\n\nconst emit = defineEmits<{\n (e: 'move-to-direction', direction: PTZDirection): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n (e: 'lock-ptz', status: boolean): void\n}>()\n\n// Refs\nconst videoContainer = ref<HTMLElement | null>(null)\nconst messageRef = ref<InstanceType<typeof PTZMessage> | null>(null)\n\n// Lock state\nconst { isLocked, isLockedByOther, resetLock } = useLock()\n\n// PTZ state\nconst step = ref(4)\nconst isInside = ref(false)\nconst currentDirection = ref('')\n\n// Handlers\nconst handleMoveToDirection = (direction: PTZDirection) => {\n currentDirection.value = direction\n emit('move-to-direction', direction)\n}\n\nconst handleDoZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n\nconst handleStopAllCommand = throttle(() => {\n currentDirection.value = ''\n}, 200)\n\nconst showMessage = (options: { type: 'success' | 'error' | 'info'; message: string }) => {\n messageRef.value?.show(options.message, options.type)\n}\n\nconst handleLockPTZ = () => {\n emit('lock-ptz', true)\n isLocked.value = true\n showMessage({ type: 'success', message: '云台已锁定' })\n}\n\nconst handleUnlockPTZ = () => {\n emit('lock-ptz', false)\n resetLock()\n showMessage({ type: 'success', message: '云台已解锁' })\n}\n\n// Wheel handler\nconst wheelStopTimer = ref<ReturnType<typeof setTimeout> | null>(null)\nconst isZooming = ref(false)\n\nconst handleWheel = (e: WheelEvent) => {\n if (wheelStopTimer.value) clearTimeout(wheelStopTimer.value)\n if (!isZooming.value) {\n isZooming.value = true\n const command = e.deltaY > 0 ? 'zoom_out' : 'zoom_in'\n handleDoZoom(command as PTZZoomCommand)\n }\n wheelStopTimer.value = setTimeout(() => {\n handleStopAllCommand()\n isZooming.value = false\n }, 500)\n}\n\nconst handleMouseLeave = () => {\n isInside.value = false\n handleStopAllCommand()\n}\n\nonBeforeUnmount(() => {\n resetLock()\n if (wheelStopTimer.value) {\n clearTimeout(wheelStopTimer.value)\n }\n})\n</script>\n","<template>\n <div\n ref=\"videoContainer\"\n class=\"wwav-player__ptz\"\n @wheel.self.prevent=\"handleWheel\"\n @mouseleave=\"handleMouseLeave\"\n >\n <span v-show=\"isFullscreen\" class=\"wwav-player__ptz-status-label\">\n 可操控: {{ isLockedByOther ? '否' : '是' }}\n </span>\n <Direction\n v-show=\"isFullscreen\"\n :current-direction=\"currentDirection\"\n :stop-all-command=\"handleStopAllCommand\"\n :is-inside=\"isInside\"\n :is-fullscreen=\"isFullscreen\"\n @move-to-direction=\"handleMoveToDirection\"\n @do-zoom=\"handleDoZoom\"\n />\n <Operation\n v-show=\"isFullscreen\"\n v-model:step=\"step\"\n :is-locked=\"isLocked\"\n :is-locked-by-other=\"isLockedByOther\"\n :stop-all-command=\"handleStopAllCommand\"\n @do-zoom=\"handleDoZoom\"\n @lock-ptz=\"handleLockPTZ\"\n @unlock-ptz=\"handleUnlockPTZ\"\n />\n <PTZMessage ref=\"messageRef\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onBeforeUnmount } from 'vue'\nimport Direction from './direction.vue'\nimport Operation from './operations.vue'\nimport PTZMessage from './components/message.vue'\nimport { useLock } from './composables/useLock'\nimport { throttle } from '../utils/helper'\nimport type { PTZDirection, PTZZoomCommand } from '../../../types'\nimport './controller.css'\n\ninterface Props {\n devicePath?: string\n isFullscreen?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n devicePath: '',\n isFullscreen: false\n})\n\nconst emit = defineEmits<{\n (e: 'move-to-direction', direction: PTZDirection): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n (e: 'lock-ptz', status: boolean): void\n}>()\n\n// Refs\nconst videoContainer = ref<HTMLElement | null>(null)\nconst messageRef = ref<InstanceType<typeof PTZMessage> | null>(null)\n\n// Lock state\nconst { isLocked, isLockedByOther, resetLock } = useLock()\n\n// PTZ state\nconst step = ref(4)\nconst isInside = ref(false)\nconst currentDirection = ref('')\n\n// Handlers\nconst handleMoveToDirection = (direction: PTZDirection) => {\n currentDirection.value = direction\n emit('move-to-direction', direction)\n}\n\nconst handleDoZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n\nconst handleStopAllCommand = throttle(() => {\n currentDirection.value = ''\n}, 200)\n\nconst showMessage = (options: { type: 'success' | 'error' | 'info'; message: string }) => {\n messageRef.value?.show(options.message, options.type)\n}\n\nconst handleLockPTZ = () => {\n emit('lock-ptz', true)\n isLocked.value = true\n showMessage({ type: 'success', message: '云台已锁定' })\n}\n\nconst handleUnlockPTZ = () => {\n emit('lock-ptz', false)\n resetLock()\n showMessage({ type: 'success', message: '云台已解锁' })\n}\n\n// Wheel handler\nconst wheelStopTimer = ref<ReturnType<typeof setTimeout> | null>(null)\nconst isZooming = ref(false)\n\nconst handleWheel = (e: WheelEvent) => {\n if (wheelStopTimer.value) clearTimeout(wheelStopTimer.value)\n if (!isZooming.value) {\n isZooming.value = true\n const command = e.deltaY > 0 ? 'zoom_out' : 'zoom_in'\n handleDoZoom(command as PTZZoomCommand)\n }\n wheelStopTimer.value = setTimeout(() => {\n handleStopAllCommand()\n isZooming.value = false\n }, 500)\n}\n\nconst handleMouseLeave = () => {\n isInside.value = false\n handleStopAllCommand()\n}\n\nonBeforeUnmount(() => {\n resetLock()\n if (wheelStopTimer.value) {\n clearTimeout(wheelStopTimer.value)\n }\n})\n</script>\n","import { ref } from 'vue'\nimport type { VideoStatus, PlayerOptions, MediaInfo, WWAVPlayerInstance } from '../../../types'\n\nexport function usePlayer() {\n const player = ref<WWAVPlayerInstance | null>(null)\n const playerCreated = ref(false)\n const attachedElement = ref(false)\n const streamType = ref<'H264' | 'H265'>('H264')\n const mediaInfo = ref<MediaInfo>({\n format: 'H264',\n width: 0,\n height: 0\n })\n const videoStatus = ref<number>(4) // vStop\n\n // 错误回调\n const onError = (e: Error, detail?: unknown, info?: unknown) => {\n console.error('Player error:', e, detail, info)\n }\n\n // 媒体信息回调\n const onMediaInfo = (info: MediaInfo) => {\n mediaInfo.value = info\n streamType.value = info.format as 'H264' | 'H265'\n }\n\n // 播放回调\n const onPlay = () => {\n videoStatus.value = 2 // vPlay\n }\n\n // 暂停回调\n const onPause = () => {\n videoStatus.value = 3 // vPause\n }\n\n // 创建播放器实例\n const createPlayer = async (\n options: { debug?: boolean },\n videoMedia?: HTMLVideoElement | null,\n canvasMedia?: HTMLCanvasElement | null,\n playerOptions?: PlayerOptions\n ) => {\n // 动态导入播放器\n const WWAVPlayer = (await import('@vanwei-wcs/wwav-player')).default\n const _player = new WWAVPlayer(options) as unknown as WWAVPlayerInstance\n\n _player.on('error', (...args: unknown[]) => onError(args[0] as Error, args[1], args[2]))\n _player.on('media_info', (...args: unknown[]) => onMediaInfo(args[0] as MediaInfo))\n _player.on('play', onPlay)\n _player.on('pause', onPause)\n\n player.value = _player as unknown as WWAVPlayerInstance\n playerCreated.value = true\n\n if (!attachedElement.value) {\n attachElement(videoMedia, canvasMedia, playerOptions)\n }\n }\n\n // 打开视频\n const open = (video: { url: string; token?: string }, startStaticsTimer: () => void) => {\n return new Promise<void>((resolve) => {\n if (player.value) {\n player.value.open(video.url, video.token)\n startStaticsTimer()\n videoStatus.value = 2 // vPlay\n resolve()\n } else {\n setTimeout(() => {\n open(video, startStaticsTimer).then(resolve)\n }, 200)\n }\n })\n }\n\n // 打开对讲\n const openTalk = (talk: { url: string; token?: string }) => {\n if (player.value) {\n player.value.openTalk(talk.url, talk.token)\n }\n }\n\n // 关闭对讲\n const closeTalk = () => {\n if (player.value) {\n player.value.closeTalk()\n }\n }\n\n // 静音控制\n const controlSound = (muted: boolean) => {\n if (player.value) {\n player.value.muted(muted)\n }\n }\n\n // 绑定元素\n const attachElement = (\n videoMedia?: HTMLVideoElement | null,\n canvasMedia?: HTMLCanvasElement | null,\n options?: PlayerOptions\n ) => {\n if (player.value && !attachedElement.value) {\n if (videoMedia) {\n player.value.attachVideoElement(videoMedia, options)\n }\n if (canvasMedia) {\n player.value.attachCanvasElement(canvasMedia, options)\n }\n attachedElement.value = true\n }\n }\n\n // 播放\n const play = () => {\n if (player.value) {\n player.value.play()\n }\n }\n\n // 暂停\n const pause = () => {\n if (player.value) {\n player.value.pause()\n }\n }\n\n // 改变播放状态\n const changePlayStatus = (status: number) => {\n try {\n if (player.value) {\n if (status === 2) { // vPlay\n player.value.play()\n } else if (status === 3) { // vPause\n player.value.pause()\n }\n }\n } catch (e) {\n console.error('changePlayStatus error:', e)\n }\n }\n\n // 销毁播放器\n const destroyPlayer = async (clearStaticsTimer: () => void) => {\n clearStaticsTimer()\n if (player.value) {\n await player.value.destroy()\n }\n videoStatus.value = 4 // vStop\n player.value = null\n playerCreated.value = false\n attachedElement.value = false\n }\n\n return {\n player,\n playerCreated,\n attachedElement,\n streamType,\n mediaInfo,\n videoStatus,\n createPlayer,\n open,\n openTalk,\n closeTalk,\n controlSound,\n attachElement,\n play,\n pause,\n changePlayStatus,\n destroyPlayer\n }\n}\n","import { ref, type Ref } from 'vue'\n\ninterface StreamOptions {\n _staticsInfoTimer: ReturnType<typeof setInterval> | null\n _timeDiff: number\n _BPS: number\n _FPS: number\n speed: number\n fps: number\n}\n\nexport function useStream() {\n const streamOptions = ref<StreamOptions>({\n _staticsInfoTimer: null,\n _timeDiff: 1000,\n _BPS: 0,\n _FPS: 0,\n speed: 0,\n fps: 0\n })\n\n // 处理流数据\n const onStream = (\n info: { type: string; data: ArrayBuffer },\n streamType: Ref<'H264' | 'H265'>,\n enableAI: Ref<boolean>,\n videoStatus: Ref<number>\n ) => {\n if (info.type === 'video') {\n streamOptions.value._BPS += (info.data as ArrayBuffer).byteLength\n streamOptions.value._FPS++\n }\n }\n\n // 启动统计信息定时器\n const startStaticsInfoTimer = () => {\n if (streamOptions.value._staticsInfoTimer) {\n clearInterval(streamOptions.value._staticsInfoTimer)\n }\n streamOptions.value._staticsInfoTimer = setInterval(() => {\n const count = streamOptions.value._BPS\n streamOptions.value.speed = Math.floor(count / 1024)\n streamOptions.value.fps = streamOptions.value._FPS\n streamOptions.value._BPS = 0\n streamOptions.value._FPS = 0\n }, streamOptions.value._timeDiff)\n }\n\n // 清除统计信息定时器\n const clearStaticsInfoTimer = () => {\n if (streamOptions.value._staticsInfoTimer) {\n clearInterval(streamOptions.value._staticsInfoTimer)\n }\n streamOptions.value._BPS = 0\n streamOptions.value._FPS = 0\n streamOptions.value.speed = 0\n streamOptions.value.fps = 0\n }\n\n return {\n streamOptions,\n onStream,\n startStaticsInfoTimer,\n clearStaticsInfoTimer\n }\n}\n","import { ref, type Ref } from 'vue'\nimport { base64ToBlob, downloadFile } from '../utils/helper'\n\ninterface CaptureOptions {\n download?: boolean\n}\n\nexport function useVideo() {\n const _videoStatus = ref<number>(4) // vStop\n\n // 截屏功能\n const capture = async (\n options: CaptureOptions = { download: true },\n videoStatus: Ref<number>,\n videoMedia: HTMLVideoElement | null,\n canvasMedia: HTMLCanvasElement | null,\n streamType: Ref<'H264' | 'H265'>\n ) => {\n if (\n [2, 3].includes(videoStatus.value) && // vPlay or vPause\n videoMedia\n ) {\n try {\n let canvas: HTMLCanvasElement | null\n\n if (streamType.value === 'H265' && canvasMedia) {\n canvas = canvasMedia\n } else {\n canvas = document.createElement('canvas')\n canvas.width = videoMedia.videoWidth\n canvas.height = videoMedia.videoHeight\n const ctx = canvas.getContext('2d')\n if (ctx) {\n ctx.drawImage(videoMedia, 0, 0, canvas.width, canvas.height)\n }\n }\n\n const base64 = await canvas.toDataURL('image/png')\n\n if (base64 === 'data:,') {\n return Promise.reject({\n reply: 400,\n err_msg: '没有视频流,无法截图'\n })\n }\n\n if (options?.download) {\n const blob = await base64ToBlob(base64)\n await downloadFile(blob, 'capture', '.png')\n return Promise.resolve()\n } else {\n return Promise.resolve(base64)\n }\n } catch (e) {\n const error = e as Error\n return Promise.reject({\n reply: 400,\n err_msg: '截图失败' + error.message\n })\n }\n } else {\n return Promise.reject({\n reply: 400,\n err_msg: '未打开视频,无法截图'\n })\n }\n }\n\n // 发送视频状态\n const emitVideoStatus = (\n status: number,\n emit: (event: 'video-status-change', status: number) => void\n ) => {\n _videoStatus.value = status\n emit('video-status-change', status)\n }\n\n return {\n _videoStatus,\n capture,\n emitVideoStatus\n }\n}\n","import { ref } from 'vue'\nimport elementResizeDetectorMaker from 'element-resize-detector'\n\nexport function useDom() {\n const erd = ref<ReturnType<typeof elementResizeDetectorMaker> | null>(null)\n const mediaBox = ref<HTMLElement | null>(null)\n const mediaBoxWidth = ref(0)\n const mediaBoxHeight = ref(0)\n const domForceType = ref<'both' | 'video' | 'canvas'>('both')\n const videoMedia = ref<HTMLVideoElement | null>(null)\n const canvasMedia = ref<HTMLCanvasElement | null>(null)\n const domCreated = ref(false)\n const videoMediaDelay = ref(0.8)\n const videoMediaPlaySpeed = ref(1)\n\n // 监听 DOM 宽高变化\n const mediaBoxResize = (el: HTMLElement) => {\n const { offsetWidth, offsetHeight } = el\n mediaBoxWidth.value = offsetWidth\n mediaBoxHeight.value = offsetHeight\n if (canvasMedia.value) {\n canvasMedia.value.width = offsetWidth\n canvasMedia.value.height = offsetHeight\n }\n }\n\n // 创建 video 和 canvas DOM\n const createMediaDom = async (\n containerRef: HTMLElement | null,\n forceType: 'both' | 'video' | 'canvas' = 'both'\n ) => {\n if (containerRef) {\n if (forceType !== 'canvas') {\n const video = document.createElement('video')\n video.autoplay = true\n video.classList.add('wcs-wwav-base-video__content')\n video.muted = true\n video.playsInline = true\n addVideoListener(video)\n containerRef.appendChild(video)\n videoMedia.value = video\n }\n\n if (forceType !== 'video') {\n const canvas = document.createElement('canvas')\n canvas.width = mediaBoxWidth.value\n canvas.height = mediaBoxHeight.value\n if (forceType === 'canvas') {\n canvas.style.display = 'block'\n } else {\n canvas.style.display = 'none'\n }\n containerRef.appendChild(canvas)\n canvasMedia.value = canvas\n }\n\n domCreated.value = true\n } else {\n domCreated.value = false\n }\n }\n\n // 清除 DOM\n const clearMediaDom = async (player: unknown) => {\n if (player) return\n\n if (videoMedia.value) {\n removeVideoListener(videoMedia.value)\n videoMedia.value.remove()\n }\n if (canvasMedia.value) {\n canvasMedia.value.remove()\n }\n\n videoMedia.value = null\n canvasMedia.value = null\n domCreated.value = false\n }\n\n // 改变 DOM 显示\n const changeDomDisplay = (streamType: 'H264' | 'H265') => {\n if (streamType === 'H265') {\n if (videoMedia.value) videoMedia.value.style.display = 'none'\n if (canvasMedia.value) canvasMedia.value.style.display = 'block'\n } else {\n if (videoMedia.value) videoMedia.value.style.display = 'block'\n if (canvasMedia.value) canvasMedia.value.style.display = 'none'\n }\n }\n\n // 改变播放速率\n const changePlaybackRate = (speed: number, streamType: 'H264' | 'H265') => {\n if (streamType === 'H264' && videoMedia.value) {\n videoMedia.value.playbackRate = speed\n }\n }\n\n // 添加视频监听器\n const addVideoListener = (video: HTMLVideoElement) => {\n video.addEventListener('progress', videoProgressEvent)\n }\n\n // 移除视频监听器\n const removeVideoListener = (video: HTMLVideoElement) => {\n video.removeEventListener('progress', videoProgressEvent)\n }\n\n // 视频进度事件\n const videoProgressEvent = (_e: Event) => {\n // 可以根据实际需求实现直播追帧逻辑\n }\n\n // 初始化 resize 监听\n const initResizeDetector = (container: HTMLElement) => {\n erd.value = elementResizeDetectorMaker()\n erd.value.listenTo(container, mediaBoxResize)\n mediaBox.value = container\n }\n\n // 销毁 resize 监听\n const destroyResizeDetector = () => {\n if (erd.value && mediaBox.value) {\n erd.value.uninstall(mediaBox.value)\n }\n erd.value = null\n }\n\n return {\n erd,\n mediaBox,\n mediaBoxWidth,\n mediaBoxHeight,\n domForceType,\n videoMedia,\n canvasMedia,\n domCreated,\n videoMediaDelay,\n videoMediaPlaySpeed,\n mediaBoxResize,\n createMediaDom,\n clearMediaDom,\n changeDomDisplay,\n changePlaybackRate,\n addVideoListener,\n removeVideoListener,\n initResizeDetector,\n destroyResizeDetector\n }\n}\n","<template>\n <div class=\"base-content wwav-player\" ref=\"mediaContentBoxRef\">\n <div ref=\"mediaBoxRef\" class=\"wcs-wwav-base-video\" />\n <Controller\n v-show=\"showControllerValue\"\n :features=\"features\"\n :stream-working=\"streamWorking\"\n :media-info=\"mediaInfo\"\n :stream-info=\"streamInfo\"\n :stream-type=\"streamType\"\n :is-live=\"isLive\"\n :is-closed=\"isClosedVideo\"\n :video-status=\"videoStatus\"\n v-model:video-quality=\"videoQuality\"\n @change-quality=\"changeQuality\"\n @fullscreen=\"fullScreen\"\n @change-ptz-switch=\"changePTZSwitch\"\n @stop-video=\"stopVideo\"\n @lock-ptz=\"lockPTZ\"\n @control-talk=\"controlTalk\"\n @control-sound=\"controlVideoSound\"\n @change-play-speed=\"changePlaySpeed\"\n @change-play-status=\"changePlayStatus\"\n @capture-video=\"captureVideo\"\n />\n <PTZControl\n v-if=\"enablePTZ && isLive && isFullscreen && showPTZ\"\n :is-fullscreen=\"isFullscreen\"\n @move-to-direction=\"moveToDirection\"\n @do-zoom=\"doZoom\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'\nimport screenfull from 'screenfull'\nimport Controller from './controller.vue'\nimport PTZControl from './PTZ/index.vue'\nimport './css/global.css'\nimport { usePlayer } from './composables/usePlayer'\nimport { useStream } from './composables/useStream'\nimport { useVideo } from './composables/useVideo'\nimport { useDom } from './composables/useDom'\nimport type { PlayerOptions, VideoQuality, PTZDirection, PTZZoomCommand } from '../../types'\n\n// Props\ninterface Props {\n debug?: boolean\n isLive?: boolean\n options?: PlayerOptions\n showPTZ?: boolean\n showController?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n debug: false,\n isLive: true,\n options: () => ({\n debug: false,\n mode: 'video',\n baseLibPath: '/lib/',\n decoderLogLevel: 0\n }),\n showPTZ: false,\n showController: false\n})\n\n// Emits\nconst emit = defineEmits<{\n (e: 'stop-video'): void\n (e: 'quality-change', quality: VideoQuality): void\n (e: 'change-play-speed', speed: number): void\n (e: 'control-talk', status: boolean): void\n (e: 'lock-ptz', status: boolean): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n (e: 'move-to-direction', direction: PTZDirection): void\n (e: 'error', error: Error, detail?: unknown, info?: unknown): void\n (e: 'video-status-change', status: number): void\n (e: 'sei-info', objects: unknown[]): void\n}>()\n\n// Refs\nconst mediaContentBoxRef = ref<HTMLElement | null>(null)\nconst mediaBoxRef = ref<HTMLElement | null>(null)\n\n// 使用 composables\nconst {\n player,\n playerCreated,\n streamType,\n mediaInfo,\n videoStatus,\n createPlayer,\n open,\n controlSound,\n changePlayStatus,\n destroyPlayer\n} = usePlayer()\n\nconst {\n streamOptions,\n onStream,\n startStaticsInfoTimer,\n clearStaticsInfoTimer\n} = useStream()\n\nconst { capture } = useVideo()\n\nconst {\n videoMedia,\n canvasMedia,\n domCreated,\n createMediaDom,\n clearMediaDom,\n changeDomDisplay,\n initResizeDetector,\n destroyResizeDetector\n} = useDom()\n\n// 响应式状态\nconst isClosedVideo = ref(true)\nconst features = ref<string[]>(['PTZ'])\nconst enablePTZ = ref(false)\nconst isFullscreen = ref(false)\nconst streamWorking = ref(false)\nconst videoQuality = ref<VideoQuality>(1)\n\n// 计算属性\nconst showControllerValue = computed(() => props.showController && !isClosedVideo.value)\n\n// 流信息计算属性\nconst streamInfo = computed(() => ({\n speed: streamOptions.value.speed,\n fps: streamOptions.value.fps\n}))\n\n// 方法\nconst openVideo = async (video: { url: string; token?: string }) => {\n if (!isClosedVideo.value) {\n await closeVideo()\n }\n\n if (!domCreated.value && mediaBoxRef.value) {\n await createMediaDom(mediaBoxRef.value)\n initResizeDetector(mediaBoxRef.value)\n }\n\n if (!playerCreated.value) {\n await createPlayer(\n { debug: props.debug },\n videoMedia.value,\n canvasMedia.value,\n props.options\n )\n // 设置流处理回调\n if (player.value) {\n player.value.onStream = (info: { type: string; data: ArrayBuffer }) => {\n onStream(info, streamType, ref(false), videoStatus)\n }\n }\n }\n\n await open(video, startStaticsInfoTimer)\n streamWorking.value = true\n isClosedVideo.value = false\n}\n\nconst closeVideo = async () => {\n await destroyPlayer(clearStaticsInfoTimer)\n await clearMediaDom(player.value)\n streamWorking.value = false\n isClosedVideo.value = true\n}\n\nconst stopVideo = async () => {\n emit('stop-video')\n await closeVideo()\n streamOptions.value.speed = 0\n streamOptions.value.fps = 0\n isClosedVideo.value = true\n streamWorking.value = false\n}\n\nconst fullScreen = () => {\n isFullscreen.value = !isFullscreen.value\n if (mediaContentBoxRef.value && screenfull.isEnabled) {\n screenfull.toggle(mediaContentBoxRef.value)\n }\n}\n\nconst handleFullScreenChange = () => {\n if (!screenfull.isFullscreen) {\n isFullscreen.value = false\n }\n}\n\nconst changePTZSwitch = (status: boolean) => {\n enablePTZ.value = status\n}\n\nconst lockPTZ = (status: boolean) => {\n emit('lock-ptz', status)\n}\n\nconst controlTalk = (e: boolean) => {\n emit('control-talk', e)\n}\n\nconst controlVideoSound = (e: boolean) => {\n controlSound(e)\n}\n\nconst changeQuality = (num: VideoQuality) => {\n videoQuality.value = num\n emit('quality-change', num)\n}\n\nconst changePlaySpeed = (speed: number) => {\n emit('change-play-speed', speed)\n}\n\nconst moveToDirection = (direction: PTZDirection) => {\n emit('move-to-direction', direction)\n}\n\nconst doZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n\nconst captureVideo = async () => {\n try {\n await capture(\n { download: true },\n videoStatus,\n videoMedia.value,\n canvasMedia.value,\n streamType\n )\n } catch (e) {\n console.error('Capture failed:', e)\n }\n}\n\n// 监听流类型变化\nwatch(streamType, () => {\n nextTick(() => {\n changeDomDisplay(streamType.value)\n })\n})\n\nwatch(videoQuality, (newVal) => {\n console.log('videoQuality:', newVal)\n})\n\n// 生命周期\nonMounted(() => {\n nextTick(() => {\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullScreenChange)\n }\n })\n})\n\nonBeforeUnmount(() => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullScreenChange)\n }\n destroyResizeDetector()\n clearStaticsInfoTimer()\n})\n\n// 暴露方法给父组件\ndefineExpose({\n openVideo,\n closeVideo,\n captureVideo,\n changeQuality\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.wcs-wwav-base-video__content {\n width: 100% !important;\n height: 100% !important;\n cursor: pointer;\n object-fit: fill;\n}\n\n.wcs-wwav-base-video {\n height: 100%;\n width: 100%;\n position: relative;\n\n .wcs-wwav-base-video__content {\n width: 100% !important;\n height: 100% !important;\n cursor: pointer;\n object-fit: fill;\n }\n\n canvas {\n width: 100%;\n height: 100%;\n cursor: pointer;\n object-fit: fill;\n display: none;\n }\n}\n\n.base-content {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n</style>\n","<template>\n <div class=\"base-content wwav-player\" ref=\"mediaContentBoxRef\">\n <div ref=\"mediaBoxRef\" class=\"wcs-wwav-base-video\" />\n <Controller\n v-show=\"showControllerValue\"\n :features=\"features\"\n :stream-working=\"streamWorking\"\n :media-info=\"mediaInfo\"\n :stream-info=\"streamInfo\"\n :stream-type=\"streamType\"\n :is-live=\"isLive\"\n :is-closed=\"isClosedVideo\"\n :video-status=\"videoStatus\"\n v-model:video-quality=\"videoQuality\"\n @change-quality=\"changeQuality\"\n @fullscreen=\"fullScreen\"\n @change-ptz-switch=\"changePTZSwitch\"\n @stop-video=\"stopVideo\"\n @lock-ptz=\"lockPTZ\"\n @control-talk=\"controlTalk\"\n @control-sound=\"controlVideoSound\"\n @change-play-speed=\"changePlaySpeed\"\n @change-play-status=\"changePlayStatus\"\n @capture-video=\"captureVideo\"\n />\n <PTZControl\n v-if=\"enablePTZ && isLive && isFullscreen && showPTZ\"\n :is-fullscreen=\"isFullscreen\"\n @move-to-direction=\"moveToDirection\"\n @do-zoom=\"doZoom\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'\nimport screenfull from 'screenfull'\nimport Controller from './controller.vue'\nimport PTZControl from './PTZ/index.vue'\nimport './css/global.css'\nimport { usePlayer } from './composables/usePlayer'\nimport { useStream } from './composables/useStream'\nimport { useVideo } from './composables/useVideo'\nimport { useDom } from './composables/useDom'\nimport type { PlayerOptions, VideoQuality, PTZDirection, PTZZoomCommand } from '../../types'\n\n// Props\ninterface Props {\n debug?: boolean\n isLive?: boolean\n options?: PlayerOptions\n showPTZ?: boolean\n showController?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n debug: false,\n isLive: true,\n options: () => ({\n debug: false,\n mode: 'video',\n baseLibPath: '/lib/',\n decoderLogLevel: 0\n }),\n showPTZ: false,\n showController: false\n})\n\n// Emits\nconst emit = defineEmits<{\n (e: 'stop-video'): void\n (e: 'quality-change', quality: VideoQuality): void\n (e: 'change-play-speed', speed: number): void\n (e: 'control-talk', status: boolean): void\n (e: 'lock-ptz', status: boolean): void\n (e: 'do-zoom', command: PTZZoomCommand): void\n (e: 'move-to-direction', direction: PTZDirection): void\n (e: 'error', error: Error, detail?: unknown, info?: unknown): void\n (e: 'video-status-change', status: number): void\n (e: 'sei-info', objects: unknown[]): void\n}>()\n\n// Refs\nconst mediaContentBoxRef = ref<HTMLElement | null>(null)\nconst mediaBoxRef = ref<HTMLElement | null>(null)\n\n// 使用 composables\nconst {\n player,\n playerCreated,\n streamType,\n mediaInfo,\n videoStatus,\n createPlayer,\n open,\n controlSound,\n changePlayStatus,\n destroyPlayer\n} = usePlayer()\n\nconst {\n streamOptions,\n onStream,\n startStaticsInfoTimer,\n clearStaticsInfoTimer\n} = useStream()\n\nconst { capture } = useVideo()\n\nconst {\n videoMedia,\n canvasMedia,\n domCreated,\n createMediaDom,\n clearMediaDom,\n changeDomDisplay,\n initResizeDetector,\n destroyResizeDetector\n} = useDom()\n\n// 响应式状态\nconst isClosedVideo = ref(true)\nconst features = ref<string[]>(['PTZ'])\nconst enablePTZ = ref(false)\nconst isFullscreen = ref(false)\nconst streamWorking = ref(false)\nconst videoQuality = ref<VideoQuality>(1)\n\n// 计算属性\nconst showControllerValue = computed(() => props.showController && !isClosedVideo.value)\n\n// 流信息计算属性\nconst streamInfo = computed(() => ({\n speed: streamOptions.value.speed,\n fps: streamOptions.value.fps\n}))\n\n// 方法\nconst openVideo = async (video: { url: string; token?: string }) => {\n if (!isClosedVideo.value) {\n await closeVideo()\n }\n\n if (!domCreated.value && mediaBoxRef.value) {\n await createMediaDom(mediaBoxRef.value)\n initResizeDetector(mediaBoxRef.value)\n }\n\n if (!playerCreated.value) {\n await createPlayer(\n { debug: props.debug },\n videoMedia.value,\n canvasMedia.value,\n props.options\n )\n // 设置流处理回调\n if (player.value) {\n player.value.onStream = (info: { type: string; data: ArrayBuffer }) => {\n onStream(info, streamType, ref(false), videoStatus)\n }\n }\n }\n\n await open(video, startStaticsInfoTimer)\n streamWorking.value = true\n isClosedVideo.value = false\n}\n\nconst closeVideo = async () => {\n await destroyPlayer(clearStaticsInfoTimer)\n await clearMediaDom(player.value)\n streamWorking.value = false\n isClosedVideo.value = true\n}\n\nconst stopVideo = async () => {\n emit('stop-video')\n await closeVideo()\n streamOptions.value.speed = 0\n streamOptions.value.fps = 0\n isClosedVideo.value = true\n streamWorking.value = false\n}\n\nconst fullScreen = () => {\n isFullscreen.value = !isFullscreen.value\n if (mediaContentBoxRef.value && screenfull.isEnabled) {\n screenfull.toggle(mediaContentBoxRef.value)\n }\n}\n\nconst handleFullScreenChange = () => {\n if (!screenfull.isFullscreen) {\n isFullscreen.value = false\n }\n}\n\nconst changePTZSwitch = (status: boolean) => {\n enablePTZ.value = status\n}\n\nconst lockPTZ = (status: boolean) => {\n emit('lock-ptz', status)\n}\n\nconst controlTalk = (e: boolean) => {\n emit('control-talk', e)\n}\n\nconst controlVideoSound = (e: boolean) => {\n controlSound(e)\n}\n\nconst changeQuality = (num: VideoQuality) => {\n videoQuality.value = num\n emit('quality-change', num)\n}\n\nconst changePlaySpeed = (speed: number) => {\n emit('change-play-speed', speed)\n}\n\nconst moveToDirection = (direction: PTZDirection) => {\n emit('move-to-direction', direction)\n}\n\nconst doZoom = (command: PTZZoomCommand) => {\n emit('do-zoom', command)\n}\n\nconst captureVideo = async () => {\n try {\n await capture(\n { download: true },\n videoStatus,\n videoMedia.value,\n canvasMedia.value,\n streamType\n )\n } catch (e) {\n console.error('Capture failed:', e)\n }\n}\n\n// 监听流类型变化\nwatch(streamType, () => {\n nextTick(() => {\n changeDomDisplay(streamType.value)\n })\n})\n\nwatch(videoQuality, (newVal) => {\n console.log('videoQuality:', newVal)\n})\n\n// 生命周期\nonMounted(() => {\n nextTick(() => {\n if (screenfull.isEnabled) {\n screenfull.on('change', handleFullScreenChange)\n }\n })\n})\n\nonBeforeUnmount(() => {\n if (screenfull.isEnabled) {\n screenfull.off('change', handleFullScreenChange)\n }\n destroyResizeDetector()\n clearStaticsInfoTimer()\n})\n\n// 暴露方法给父组件\ndefineExpose({\n openVideo,\n closeVideo,\n captureVideo,\n changeQuality\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.wcs-wwav-base-video__content {\n width: 100% !important;\n height: 100% !important;\n cursor: pointer;\n object-fit: fill;\n}\n\n.wcs-wwav-base-video {\n height: 100%;\n width: 100%;\n position: relative;\n\n .wcs-wwav-base-video__content {\n width: 100% !important;\n height: 100% !important;\n cursor: pointer;\n object-fit: fill;\n }\n\n canvas {\n width: 100%;\n height: 100%;\n cursor: pointer;\n object-fit: fill;\n display: none;\n }\n}\n\n.base-content {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n</style>\n","/**\n * 视频状态枚举\n */\nexport const VideoStatus = {\n vConnect: 0, // 开始连接\n vStart: 1, // 开始播放\n vPlay: 2, // 正在播放\n vPause: 3, // 暂停\n vStop: 4 // 停止\n} as const\n\nexport type VideoStatusType = typeof VideoStatus[keyof typeof VideoStatus]\n\n/**\n * 播放器配置\n */\nexport interface PlayerOptions {\n debug: boolean\n mode: 'video' | 'audio'\n baseLibPath: string\n decoderLogLevel?: number\n}\n\n/**\n * 媒体信息\n */\nexport interface MediaInfo {\n format: 'H264' | 'H265'\n width: number\n height: number\n mode?: string\n}\n\n/**\n * 流信息\n */\nexport interface StreamInfo {\n speed: number\n fps: number\n}\n\n/**\n * 流选项\n */\nexport interface StreamOptions {\n _staticsInfoTimer: ReturnType<typeof setInterval> | null\n _timeDiff: number\n _BPS: number\n _FPS: number\n speed: number\n fps: number\n}\n\n/**\n * 视频配置\n */\nexport interface VideoConfig {\n url: string\n token?: string\n}\n\n/**\n * 云台方向\n */\nexport type PTZDirection =\n | 'tilt_up'\n | 'up_right'\n | 'pan_right'\n | 'down_right'\n | 'tilt_down'\n | 'down_left'\n | 'pan_left'\n | 'up_left'\n\n/**\n * 云台变倍指令\n */\nexport type PTZZoomCommand =\n | 'zoom_in'\n | 'zoom_out'\n | 'focus_in'\n | 'focus_out'\n | 'iris_up'\n | 'iris_down'\n\n/**\n * 云台命令\n */\nexport type PTZCommand = PTZDirection | PTZZoomCommand | 'stop_all'\n\n/**\n * 视频质量\n */\nexport type VideoQuality = 0 | 1 | 2 // 0: 高清 1: 标清 2: 流畅\n\n/**\n * 播放速度项\n */\nexport interface SpeedItem {\n label: string\n value: number\n}\n\n/**\n * 组件 Props - 主播放器\n */\nexport interface VideoPlayerProps {\n debug?: boolean\n isLive?: boolean\n options?: PlayerOptions\n showPTZ?: boolean\n showController?: boolean\n}\n\n/**\n * WWAV Player 实例接口\n */\nexport interface WWAVPlayerInstance {\n on(event: string, callback: (...args: unknown[]) => void): void\n onStream: ((info: { type: string; data: ArrayBuffer }) => void) | null\n open(url: string, token?: string): void\n openTalk(url: string, token?: string): void\n closeTalk(): void\n muted(muted: boolean): void\n play(): void\n pause(): void\n close(): void\n destroy(): Promise<void>\n attachVideoElement(element: HTMLVideoElement, options?: PlayerOptions): void\n attachCanvasElement(element: HTMLCanvasElement, options?: PlayerOptions): void\n}\n","import type { App } from 'vue'\nimport WwVideoPlayer from './ww-video-player/index.vue'\n\n// 导入样式\nimport './ww-video-player/css/global.css'\n\n// 组件列表\nconst components = [WwVideoPlayer]\n\n// 插件安装方法\nconst install = (app: App): void => {\n components.forEach((component) => {\n if (component.name) {\n app.component(component.name, component)\n }\n })\n}\n\n// 默认导出(支持全局注册)\nexport default {\n install,\n WwVideoPlayer\n}\n\n// 按需导出单个组件\nexport { WwVideoPlayer }\n\n// 导出类型\nexport * from '../types'\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vue`),require(`screenfull`),require(`element-resize-detector`)):typeof define==`function`&&define.amd?define([`exports`,`vue`,`screenfull`,`element-resize-detector`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.VideoPlayerV3={},e.Vue,e.screenfull,e.erd))})(this,function(e,t,n,r){var i=document.createElement(`style`);i.textContent=`.styled-checkbox[data-v-d478ce3d]{vertical-align:top;cursor:pointer;height:100%}.wwav-player__ptz-message[data-v-97aecee1]{z-index:100;border-radius:4px;padding:8px 16px;font-size:14px;position:absolute;top:10px;left:50%;transform:translate(-50%)}.wwav-player__ptz-message.success[data-v-97aecee1]{color:#fff;background:#67c23a}.wwav-player__ptz-message.error[data-v-97aecee1]{color:#fff;background:#f56c6c}.wwav-player__ptz-message.info[data-v-97aecee1]{color:#fff;background:#909399}.fade-enter-active[data-v-97aecee1],.fade-leave-active[data-v-97aecee1]{transition:opacity .3s}.fade-enter-from[data-v-97aecee1],.fade-leave-to[data-v-97aecee1]{opacity:0}.wwav-player__ptz__direction{opacity:.55;box-sizing:border-box;z-index:1;background:radial-gradient(circle,#0000 0 0,#000 100%);border:2px solid #fff;border-radius:50%;width:144px;height:144px;position:absolute;bottom:3.5em;left:1em;overflow:hidden}.wwav-player__ptz__direction-content{background:0 0;width:95px;height:95px}.wwav-player__ptz__direction-circle-border{border:1px solid #ffffff1a;border-radius:50%;width:80px;height:80px}.wwav-player__ptz__direction-circle{background:#fff6;border:1px solid #ffffff4d;border-radius:50%;width:48px;height:48px}.wwav-player__ptz__direction-triangle{transform-origin:50%;cursor:pointer;opacity:.7;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAwElEQVQ4T5XSTUqCURSA4edOgowoTaIlCBUEDgIHQSC6DxfXAkKl6G8RbaFxKyiufHEUNX/ud0dncN/nTE6CnPMThtVc8H4wwSjlnJv4LojWv0xSbP7EVU3gdx538IGLOsBfHNsv8Y7zUmARB3AdQLsEWIkDuMEbWvuAf3EAXbzidBewMQ7gFs842QZsjQPooTqg403AzjiAO0xxtA7sjQO4xxiNZaAoDqCPRxzOgeI4gAEecIaXWnEAB9UVppS+Zn2ZQFj4MpGPAAAAAElFTkSuQmCC);width:15px;height:15px;position:absolute}.wwav-player__ptz__direction-triangle.active,.wwav-player__ptz__direction-triangle:hover{opacity:1}.wwav-player__ptz__direction-triangle:first-child{top:-10px;left:50%;transform:translate(-50%)rotate(-45deg)}.wwav-player__ptz__direction-triangle:nth-child(3){top:50%;right:-10px;transform:translateY(-50%)rotate(45deg)}.wwav-player__ptz__direction-triangle:nth-child(5){bottom:-10px;left:50%;transform:translate(-50%)rotate(135deg)}.wwav-player__ptz__direction-triangle:nth-child(7){top:50%;left:-10px;transform:translateY(-50%)rotate(225deg)}.wwav-player__ptz__direction-triangle:nth-child(2){top:6px;right:6px}.wwav-player__ptz__direction-triangle:nth-child(4){bottom:6px;right:6px;transform:rotate(90deg)}.wwav-player__ptz__direction-triangle:nth-child(6){bottom:6px;left:6px;transform:rotate(180deg)}.wwav-player__ptz__direction-triangle:nth-child(8){top:6px;left:6px;transform:rotate(270deg)}.wwav-player__ptz__operation{text-align:center;-webkit-user-select:none;user-select:none;z-index:1;padding:1em;position:absolute;bottom:3em;left:50%;transform:translate(-50%)}.wwav-player__ptz__operation-button{vertical-align:top;box-sizing:border-box;cursor:pointer;background-color:#0000004d;border:1px solid #0000;border-radius:50%;width:48px;height:48px;margin:0 15px;padding:0;display:inline-block;position:relative}.wwav-player__ptz__operation-button:focus,.wwav-player__ptz__operation-button:hover{border-color:#fffc}.wwav-player__ptz__operation-button img{width:100%;height:100%}.wwav-player__ptz__operation-button .image{box-sizing:border-box;width:100%;height:100%;padding:8px}.wwav-player__ptz__operation-button-disable{color:#333;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE8AAAAlCAYAAAADW7S6AAABkElEQVRoQ+3ar0ssURjG8e8DBhE0mk1aTCLY/AuUq8liFYwigota7w/hcrnNYhWMgv4DmgXBYjBazIprklfOsrtMWFD3LQd8JuzCcJ5h+MwzZ8I5ontExBKwDSwAY73z/u8LPAPXwD9JF+Wsyk9E/AT2DPVpgV+S9hURP4CzT8c8sCewUvAugUWbfFngquC9eI77MlwJtAteDBV1COMlSmA84yUEElE3z3gJgUTUzTNeQiARdfOMlxBIRN084yUEElE3z3gJgUTUzTNeQiARdfOMlxBIRN084yUEEtHSvCdgPHGN7xrtLAB56XG4x99ZevSi93B4q73tFr+B1nDX+JapQ0mtDl45ImIZ2AHmvQg+sBDt7kafv5LOy4g+Xg39iYhZ4AYYGXA/b8CcpNsa7rU6vO4bcARsDgA6lrRRC1yteJPAPTDRgCp746YlPRrvA4GI2AX+NIYdSCp7CKs6qprzGh+vUeAOmAIegBlJr1XJ1fbBaOJExBpwCqxLOqkNrso5r9G+8lb8B7YkVbkN7h0eRanPahw2mAAAAABJRU5ErkJggg==) no-repeat;width:80px;height:40px;font-family:PingFang SC;font-size:16px;font-weight:400;line-height:31px;transition:display .5s ease-in;display:none;position:absolute;top:-40px;left:-17px}.wwav-player__ptz__operation-button.isLocked{background-color:#67c23a80;border-color:#67c23a}.wwav-player__ptz__operation-button.isLocked:focus,.wwav-player__ptz__operation-button.isLocked:hover{border-color:#67c23a}.wwav-player__ptz__operation-popper{color:#ddd;width:40px;cursor:unset;text-align:center;background-color:#000000b3;border-radius:5px;display:none;position:absolute;top:-124px;left:50%;transform:translate(-50%)}.wwav-player__ptz__operation-popper-show{display:block}.wwav-player__ptz__operation-popper-icon{box-sizing:border-box;color:#bbb;cursor:pointer;width:40px;height:40px;padding:8px;line-height:40px}.wwav-player__ptz__operation-popper-icon:focus,.wwav-player__ptz__operation-popper-icon:hover{color:#fff;background-color:#000c;border-radius:5px}.wwav-player__ptz__operation-popper-icon svg{fill:currentColor;vertical-align:middle;width:16px;height:16px}.wwav-player__ptz__operation-popper span{color:#ddd;height:40px;font-size:12px;line-height:40px;display:block}.wwav-player__ptz__message{text-align:center;color:#fff;background-color:#3339;border:1px solid;border-radius:5px;width:400px;padding:10px;line-height:18px;position:absolute;bottom:120px;left:50%;transform:translate(-50%)}.wwav-player__ptz__message.error{color:#f56c6c;border-color:#fde2e2}.wwav-player__ptz__message.success{color:#67c23a;border-color:#e1f3d8}.wwav-player-rotate{animation:1.5s linear infinite wwav-player-rotating}@keyframes wwav-player-rotating{0%{transform:rotate(0)}to{transform:rotate(-1turn)}}.wwav-player__common-icon,.wwav-player__common-span{color:#afb9bc;text-align:center;cursor:pointer;z-index:2;height:100%;margin:0 .5em;line-height:2.55em;transition:all .1s;display:inline-block}.wwav-player__common-icon:hover,.wwav-player__common-span:hover{color:#fff}.wwav-player__common-icon.hidden,.wwav-player__common-span.hidden{opacity:0;z-index:1}.wwav-player__common-icon{text-shadow:1px 1px 1px #000c;width:1.5em;margin:0 .3em}.wwav-player__common-icon.active{color:#67c23a}.wwav-player__svg-icon{fill:currentColor;width:13px;height:13px}.wwav-player__content{width:100%;height:100%}.wwav-player__header{z-index:9;-webkit-user-select:none;user-select:none;background:linear-gradient(#343b4acc 0,#16181dcc);width:100%;height:2.2em;padding-bottom:1px;transition:bottom .3s ease-out;position:absolute;top:-2.2em;left:0}.wwav-player__header--device-name{vertical-align:top;width:auto;margin:0 0 0 1em;line-height:2.3em;position:relative}.wwav-player__footer{z-index:10;-webkit-user-select:none;user-select:none;background:linear-gradient(#343b4acc 0,#16181dcc);width:100%;height:2.2em;padding-bottom:1px;transition:bottom .3s ease-out;position:absolute;bottom:-2.2em;left:0}.wwav-player__footer__pop{opacity:0;background:#2d3443;border:1px solid #404f6f;border-radius:3px;width:auto;margin:0;padding:6px 0;transition:opacity .5s;position:absolute;bottom:-99em}.wwav-player__footer__pop.show{opacity:1;bottom:2.4em}.wwav-player__footer--stop{width:2.2em;margin:0;position:relative;top:0;left:0}.wwav-player__footer--stop:after{content:"";background-color:#fff3;width:1px;height:66%;position:absolute;inset:17% 0 auto auto}.wwav-player__footer--fullscreen{width:2.2em;margin:0;position:absolute;top:0;right:0}.wwav-player__footer--fullscreen:after{content:"";background-color:#fff3;width:1px;height:66%;position:absolute;inset:17% auto auto 0}.wwav-player__footer--left{width:auto;height:100%;position:absolute;top:0;left:2.7em}.wwav-player__footer--play{vertical-align:top;margin:0}.wwav-player__footer--speed{vertical-align:top;width:2em;margin:0;line-height:2.3em;position:relative}.wwav-player__footer--speed>div{width:100%;height:100%;position:relative;top:0;left:0}.wwav-player__footer--speed-pop{width:7em;font-size:12px;left:-2em}.wwav-player__footer--speed-pop--item{white-space:nowrap;text-overflow:ellipsis;color:#8191a9;box-sizing:border-box;cursor:pointer;text-align:center;background:#2d3443;height:2em;padding:0 10px;line-height:2.2em;position:relative;overflow:hidden}.wwav-player__footer--speed-pop--item i{width:1.2em;margin:0;position:absolute}.wwav-player__footer--speed-pop--item i:first-child{left:.5em}.wwav-player__footer--speed-pop--item i:last-child{right:.5em}.wwav-player__footer--ai,.wwav-player__footer--capture,.wwav-player__footer--ptz{vertical-align:top}.wwav-player__footer--right{width:auto;height:100%;position:absolute;top:0;right:2.7em}.wwav-player__footer--net-speed{cursor:auto;vertical-align:top;width:4.5em;margin:0;line-height:2.3em;overflow:hidden}.wwav-player__footer--net-speed:hover{color:#afb9bc}.wwav-player__footer--net-speed span{font-size:.8em}.wwav-player__footer--info{vertical-align:top;position:relative}.wwav-player__footer--info-pop{width:11em;font-size:12px;left:-5.5em}.wwav-player__footer--info-pop--item{white-space:nowrap;text-overflow:ellipsis;color:#8191a9;box-sizing:border-box;cursor:pointer;text-align:left;background:#2d3443;height:2em;padding:0 10px;line-height:2em;overflow:hidden}.wwav-player__footer--quality{vertical-align:top;width:auto;margin:0;line-height:2.4em;position:relative}.wwav-player__footer--quality-select{width:4em;left:-1em}.wwav-player__footer--quality-select--item{white-space:nowrap;text-overflow:ellipsis;color:#8191a9;box-sizing:border-box;cursor:pointer;text-align:center;background:#2d3443;height:2em;padding:0 10px;line-height:2em;overflow:hidden}.wwav-player__footer--quality-select--item:hover{color:#4b99e7}.wwav-player__footer--quality-select--item.active{color:#409eff}.wwav-player__footer--setting-pop{cursor:default;width:11em;font-size:12px;left:-4em}.wwav-player__footer--setting-pop--item{white-space:nowrap;text-overflow:ellipsis;color:#8191a9;box-sizing:border-box;text-align:left;background:#2d3443;height:2em;padding:0 10px;line-height:2em;overflow:hidden}.wwav-player__name{color:#afb9bc;z-index:9;-webkit-user-select:none;user-select:none;background:linear-gradient(#343b4acc 0,#16181dcc);justify-content:space-between;align-items:center;width:100%;height:2.2em;padding:0 .5em;transition:top .3s ease-out;display:flex;position:absolute;top:-2.2em;left:0}.wwav-player__name span{z-index:10}.wwav-player__watermark{z-index:8;width:100%;height:100%;position:absolute}.wwav-player__watermark span{color:#fff;font-size:16px;font-weight:600}.wwav-player.active .wwav-player__header,.wwav-player:hover .wwav-player__header,.wwav-player:hover .wwav-player__name{transition:top 50ms ease-out;top:0}.wwav-player.active .wwav-player__footer,.wwav-player:hover .wwav-player__footer{transition:top 50ms ease-out;bottom:0}.wwav-player-center-middle{position:absolute;top:50%;left:50%;transform:translate(-50%)translateY(-50%)}.wwav-player__el-input{min-width:0;height:28px;font-size:12px;line-height:28px;display:inline-block;position:relative}.wwav-player__el-input__inner{-webkit-appearance:none;box-sizing:border-box;color:#eee;font-size:inherit;caret-color:#05d380;background-color:#aaaaaa80;background-image:none;border:none;border-radius:4px;outline:none;width:100%;height:28px;padding:0 10px;font-family:PingFang SC;font-weight:400;line-height:28px;display:inline-block}.wwav-player__el-input__inner::-webkit-input-placeholder{color:#bbb;font-size:14px}.wwav-player__ptz{z-index:9;box-sizing:border-box;background-color:#0000;border:none;width:100%;height:100%;margin:0;padding:0;font-size:16px;display:inline-block;position:absolute;top:0;left:0}.wwav-player__ptz-status-label{color:#fff;background-color:#0006;border:none;border-radius:3px;width:auto;padding:10px 19px;font-family:PingFang SC;font-size:27px;font-weight:400;position:absolute;top:1.8em;left:1em}.wcs-wwav-base-video__content{cursor:pointer;object-fit:fill;width:100%!important;height:100%!important}.wcs-wwav-base-video{width:100%;height:100%;position:relative}.wcs-wwav-base-video .wcs-wwav-base-video__content{cursor:pointer;object-fit:fill;width:100%!important;height:100%!important}.wcs-wwav-base-video canvas{cursor:pointer;object-fit:fill;width:100%;height:100%;display:none}.base-content{width:300px;height:300px;position:relative}.wcs-wwav-base-video__content[data-v-c3dbeeea]{cursor:pointer;object-fit:fill;width:100%!important;height:100%!important}.wcs-wwav-base-video[data-v-c3dbeeea]{width:100%;height:100%;position:relative}.wcs-wwav-base-video .wcs-wwav-base-video__content[data-v-c3dbeeea]{cursor:pointer;object-fit:fill;width:100%!important;height:100%!important}.wcs-wwav-base-video canvas[data-v-c3dbeeea]{cursor:pointer;object-fit:fill;width:100%;height:100%;display:none}.base-content[data-v-c3dbeeea]{width:100%;height:100%;position:relative;overflow:hidden}
|
|
2
|
+
/*$vite$:1*/`,document.head.appendChild(i),Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var a=Object.create,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyNames,l=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=c(t),a=0,l=i.length,d;a<l;a++)d=i[a],!u.call(e,d)&&d!==n&&o(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=s(t,d))||r.enumerable});return e},f=(e,t,n)=>(n=e==null?{}:a(l(e)),d(t||!e||!e.__esModule?o(n,`default`,{value:e,enumerable:!0}):n,e));n=f(n,1),r=f(r,1);function p(e){e=parseInt(String(e));let t=0,n=`B/s`;return e>=1024*1024*1024?(t=parseFloat((e/(1024*1024*1024)).toFixed(2)),n=`GB/s`):e>=1024*1024?(t=parseFloat((e/(1024*1024)).toFixed(2)),t>=10&&(t=parseFloat(t.toFixed(1))),n=`MB/s`):e>=1024?(t=Math.floor(e/1024),n=`KB/s`):e>=0&&(t=e,n=`B/s`),t+n}function m(e,t=200,n=800){let r=null,i=new Date;return function(...a){let o=this,s=new Date;r&&clearTimeout(r),s.getTime()-i.getTime()>=n?(e.apply(o,a),i=s):r=setTimeout(function(){e.apply(o,a)},t)}}function h(){let e=String(+new Date),t=String(Math.floor((1+Math.random())*65536));return Number(t+e).toString(32)}function g(e,t=`file`,n=``){let r=window.URL.createObjectURL(new Blob([e])),i=document.createElement(`a`);i.style.display=`none`,i.href=r;let a=t+`_`+h()+n;i.setAttribute(`download`,a),document.body.appendChild(i),i.click(),document.body.removeChild(i)}function _(e){let t=e.split(`;base64,`),n=t[0].split(`:`)[1],r=window.atob(t[1]),i=r.length,a=new Uint8Array(i);for(let e=0;e<i;++e)a[e]=r.charCodeAt(e);return Promise.resolve(new Blob([a],{type:n}))}var v=[{label:`16X`,value:16},{label:`8X`,value:8},{label:`4X`,value:4},{label:`2X`,value:2},{label:`1X`,value:1},{label:`1/2X`,value:.5},{label:`1/4X`,value:.25},{label:`1/8X`,value:.125},{label:`1/16X`,value:.0625}],y={class:`wwav-player__footer`},b={class:`wwav-player__footer--left`},x={class:`wwav-player__common-span wwav-player__footer--net-speed`},S={class:`wwav-player__common-span wwav-player__footer--info`},C=[`title`],w=[`title`],T={class:`wwav-player__footer--info-pop--item`},E={class:`wwav-player__footer--info-pop--item`},D={class:`wwav-player__common-span wwav-player__footer--info`},O={class:`wwav-player__common-span wwav-player__footer--info`},ee={class:`wwav-player__footer--right`},te={key:0,class:`wwav-player__common-icon wwav-player__footer--play`},k={class:`wwav-player__common-span wwav-player__footer--speed`},A={class:`wwav-player__footer--speed-pop--item`},j={class:`speed-text`},M={key:1,class:`wwav-player__common-span wwav-player__footer--quality`},N=[`onClick`],P={key:2,class:`wwav-player__common-span wwav-player__footer--setting`},F={key:0,class:`wwav-player__footer--setting-pop--item`},I=(0,t.defineComponent)({__name:`controller`,props:(0,t.mergeModels)({isLive:{type:Boolean},streamWorking:{type:Boolean},isClosed:{type:Boolean},videoStatus:{},mediaInfo:{default:()=>({format:`H264`,width:0,height:0})},streamInfo:{default:()=>({speed:0,fps:0})},features:{default:()=>[]},enableAI:{type:Boolean,default:!1},devicePath:{default:``}},{videoQuality:{default:1},videoQualityModifiers:{}}),emits:(0,t.mergeModels)([`fullscreen`,`stop-video`,`capture-video`,`change-play-status`,`change-play-speed`,`control-talk`,`control-sound`,`change-ptz-switch`,`change-ai-status`,`change-quality`],[`update:videoQuality`]),setup(e,{emit:n}){let r=e,i=(0,t.useModel)(e,`videoQuality`),a=n,o=(0,t.ref)(!1),s=(0,t.ref)(!1),c=(0,t.ref)(!1),l=(0,t.ref)(!1),u=(0,t.ref)(!0),d=(0,t.ref)(!1),f=(0,t.ref)(!1),h=(0,t.ref)(1),g=(0,t.computed)(()=>r.videoStatus===2),_=(0,t.computed)(()=>r.videoStatus===3),I=(0,t.computed)(()=>r.mediaInfo.format===`H265`),L=(0,t.computed)(()=>r.mediaInfo.format===`H265`&&r.mediaInfo.mode===`硬解码`),R=(0,t.computed)(()=>{let e=i.value;return e===0?`高清`:e===1?`标清`:e===2?`流畅`:`标清`}),z=(0,t.computed)(()=>{let e=v.findIndex(e=>e.value===h.value);return e===-1?`1`:v[e].label}),B=(0,t.computed)(()=>r.streamInfo?.speed||0),V=()=>a(`fullscreen`),H=()=>{u.value=!0,d.value=!1,a(`stop-video`)},U=()=>a(`capture-video`),W=e=>{i.value=e,o.value=!1,a(`change-quality`,e)},G=e=>a(`change-play-status`,e),K=m(e=>{let t=String(e),n=h.value;t===`plus`?(n*=2,n>v[0].value&&(n=v[0].value)):(n/=2,n<v[v.length-1].value&&(n=v[v.length-1].value)),h.value=n,a(`change-play-speed`,n)},1e3),q=e=>{u.value=e,a(`control-sound`,u.value)},J=e=>{d.value=e,a(`control-talk`,d.value)},Y=()=>a(`change-ptz-switch`,f.value);return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,y,[(0,t.createElementVNode)(`span`,{class:`wwav-player__common-icon wwav-player__footer--stop`,title:`关闭`,onClick:(0,t.withModifiers)(H,[`stop`])},[...r[13]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`13`,height:`13`},[(0,t.createElementVNode)(`path`,{d:`M788.842733 146.596542a485.068578 485.068578 0 0 1 86.347229 78.14224 510.614455 510.614455 0 0 1 64.763128 94.31408 465.389593 465.389593 0 0 1 41.014123 107.249385 475.088367 475.088367 0 0 1 14.071881 114.794079q0 100.245919-38.318816 188.097757t-103.62317 153.058773Q787.76028 947.470614 699.789372 985.735307t-188.346721 38.264693q-99.304185 0-187.264269-38.264693t-153.816489-103.471627Q104.516313 817.045922 66.738723 729.204908T28.961134 541.107151a468.701898 468.701898 0 0 1 13.487357-112.098773 497.495132 497.495132 0 0 1 38.318816-104.554079 461.005661 461.005661 0 0 1 61.526595-92.701225 524.231707 524.231707 0 0 1 82.039069-77.611839c15.825454-11.495645 32.841606-15.305877 51.264947-12.989429 11.906977 1.537082 24.192812 12.480676 25.253615 25.71907 1.786046 22.168626-13.963636 39.726004-31.726681 53.256659Q189.164092 278.525843 146.634536 363.487533T104.12663 546.086432q0 83.684397 31.72668 157.864861t86.942579 129.34224q55.205073 55.205073 129.461309 87.494629t158.038053 32.332854q83.770993 0 158.038054-32.332854t129.461309-87.494629q55.205073-55.205073 87.570401-129.34224T917.654571 546.086432a400.669763 400.669763 0 0 0-45.668668-187.036954q-45.690317-88.133276-128.184016-145.200167c-18.618182-12.675518-32.278731-30.655053-30.02723-52.845327 1.60203-15.749683 11.008541-23.911374 23.251078-25.71907 18.780549-2.781903 35.980718 0.541226 51.806173 11.311628z`}),(0,t.createElementVNode)(`path`,{d:`M501.245949 0.000011A42.930063 42.930063 0 0 1 544.208486 42.930074v429.354752a42.935475 42.935475 0 0 1-85.870951 0V42.930074A42.930063 42.930063 0 0 1 501.245949 0.000011z`})],-1)]]),(0,t.createElementVNode)(`div`,b,[(0,t.createElementVNode)(`span`,x,[(0,t.createElementVNode)(`span`,null,(0,t.toDisplayString)((0,t.unref)(p)(B.value)),1)]),(0,t.withDirectives)((0,t.createElementVNode)(`div`,S,[(0,t.createElementVNode)(`span`,{title:`视频信息`,onClick:r[0]||=e=>s.value=!s.value},[...r[14]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`13`,height:`13`},[(0,t.createElementVNode)(`path`,{d:`M512 2q139 1 255 68.5T953 257q69 121 69 255t-69 255q-70 119-186 186.5T512 1022q-217-6-360.5-149.5T2 512q6-217 149.5-360.5T512 2z m76 313q30 0 49-17.5t19-47.5-19-47.5-48.5-17.5-48.5 17.5-19 47.5 19 47.5 48 17.5z m14 410q0-7 1-18.5t0-21.5l-60 69q-10 10-19.5 16t-15.5 4q-11-5-9-17l99-315q6-31-10-54t-52-27q-39 1-86 33.5T368 476l-1 18q0 12 1 21l59-69q10-10 19.5-15.5t15-3.5 8 7 0.5 11l-99 313q-8 29 8 51.5t55 29.5q57-1 96-32.5t72-81.5z`})],-1)]]),(0,t.createElementVNode)(`ul`,{class:(0,t.normalizeClass)([`wwav-player__footer__pop wwav-player__footer--info-pop`,{show:s.value}])},[(0,t.createElementVNode)(`li`,{class:`wwav-player__footer--info-pop--item`,title:e.mediaInfo.format},` 流类型: `+(0,t.toDisplayString)(e.mediaInfo.format),9,C),(0,t.createElementVNode)(`li`,{class:`wwav-player__footer--info-pop--item`,title:e.mediaInfo.format},` 解码方式: `+(0,t.toDisplayString)(I.value?e.mediaInfo.mode||`软解码`:`硬解码`),9,w),(0,t.createElementVNode)(`li`,T,` 分辨率: `+(0,t.toDisplayString)(`${e.mediaInfo.width}x${e.mediaInfo.height}`),1),(0,t.createElementVNode)(`li`,E,` 实时帧率: `+(0,t.toDisplayString)(`${e.streamInfo.fps}`),1)],2)],512),[[t.vShow,e.streamWorking]]),(0,t.withDirectives)((0,t.createElementVNode)(`div`,D,[u.value?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,{key:0,title:`静音`,onClick:r[1]||=e=>q(!1)},[...r[15]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`200`,height:`200`},[(0,t.createElementVNode)(`path`,{d:`M553.948279 55.153116a48.580465 48.580465 0 0 0-30.684279 11.121117L258.714791 294.816744H73.013581c-40.20986 0-72.489674 32.279814-72.489674 71.953861L0 679.995535c0 39.685953 32.803721 72.477767 73.013581 72.477767H261.35814l260.834232 205.288186a46.734884 46.734884 0 0 0 30.684279 11.097303c25.373767 0 48.663814-19.57507 48.663814-48.128l1.047814-817.413954c0.559628-28.600558-23.242419-48.163721-48.64-48.163721z m-24.349767 816.354233L305.806884 695.331721a71.930047 71.930047 0 0 0-44.436837-15.336186H71.95386l1.059721-312.689116 185.70121-0.512c17.467535 0 33.863442-6.370233 47.092093-17.467535l224.851349-194.16707-1.059721 716.347535z m0 0`,fill:`#a6b0b3`}),(0,t.createElementVNode)(`path`,{d:`M1012.950326 624.568558c14.57414 14.57414 14.764651 38.018977 0.416744 52.366884-14.347907 14.347907-37.792744 14.169302-52.366884-0.404837L683.901023 399.431442c-14.57414-14.57414-14.764651-38.018977-0.416744-52.366884 14.347907-14.347907 37.792744-14.157395 52.366884 0.416744l277.099163 277.087256z m0 0`,fill:`#a6b0b3`}),(0,t.createElementVNode)(`path`,{d:`M960.988279 347.481302c14.57414-14.57414 38.018977-14.764651 52.366884-0.416744 14.347907 14.347907 14.157395 37.792744-0.416744 52.366884L735.851163 676.518698c-14.57414 14.57414-38.018977 14.764651-52.366884 0.404837-14.347907-14.347907-14.169302-37.792744 0.404837-52.366884l277.099163-277.075349z m0 0`,fill:`#a6b0b3`})],-1)]])):((0,t.openBlock)(),(0,t.createElementBlock)(`span`,{key:1,title:`播放`,onClick:r[2]||=e=>q(!0)},[...r[16]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`200`,height:`200`},[(0,t.createElementVNode)(`path`,{d:`M536.873674 69.227163c-10.251907 0-21.039628 3.584-29.743627 10.775814L250.749023 301.520372H70.763163c-38.971535 0-70.251163 31.279628-70.251163 69.739163L0 674.816c0 38.459535 31.791628 70.239256 70.763163 70.239256h182.54586l252.797024 198.953674a45.353674 45.353674 0 0 0 29.743627 10.763907c24.587907 0 47.163535-18.967814 47.163535-46.651535l1.024-792.21879c0.523907-27.707535-22.551814-46.675349-47.163535-46.675349z m-23.599627 791.19479l-216.885582-170.746046a69.774884 69.774884 0 0 0-43.067535-14.859907H69.739163l1.035907-303.056372 179.973953-0.500093c16.931721 0 32.815628-6.167814 45.639442-16.931721l217.921488-188.189767-1.035906 694.283906z m207.169488-578.393302c-15.907721-10.752-37.959442-6.144-48.211349 9.751814-10.752 15.883907-6.144 37.935628 9.751814 48.199442 54.343442 36.411535 87.170977 96.398884 87.170977 160.49414 0 62.035349-30.767628 120.498605-82.03907 156.898232a34.685023 34.685023 0 0 0-8.215814 48.711442c6.667907 9.751814 17.419907 14.883721 28.719628 14.883721 7.168 0 14.336-2.059907 19.991814-6.667907 69.75107-49.735442 111.270698-129.738419 111.270698-214.349395 0-87.170977-44.091535-168.68614-118.438698-217.921489z m0 0`,fill:`#a6b0b3`}),(0,t.createElementVNode)(`path`,{d:`M868.62586 154.362047c-14.359814-12.823814-36.411535-11.799814-49.235348 2.56-12.811907 14.359814-11.776 36.399628 2.56 49.211534 84.110884 75.394977 132.298419 182.557767 132.298418 294.340466 0 109.222698-44.079628 210.741581-124.082604 286.124651-13.835907 13.323907-14.859907 35.375628-1.536 49.211535 6.667907 7.191814 15.895814 10.775814 25.635721 10.775814a33.696744 33.696744 0 0 0 24.09972-9.751814C972.204651 747.615256 1024 628.140651 1024 499.95014c0.500093-130.750512-55.903256-256.881116-155.37414-345.588093z m0 0`,fill:`#a6b0b3`})],-1)]]))],512),[[t.vShow,e.streamWorking]]),(0,t.withDirectives)((0,t.createElementVNode)(`div`,O,[d.value?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,{key:1,title:`打开`,onClick:r[4]||=e=>J(!1)},[...r[18]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`200`,height:`200`},[(0,t.createElementVNode)(`path`,{d:`M512 53.312a245.312 245.312 0 0 0-245.312 245.376v170.624a245.312 245.312 0 1 0 490.624 0V298.688A245.312 245.312 0 0 0 512 53.312zM330.688 298.688a181.312 181.312 0 1 1 362.624 0v170.624a181.312 181.312 0 1 1-362.624 0V298.688z`,fill:`#a6b0b3`}),(0,t.createElementVNode)(`path`,{d:`M202.688 469.312a32 32 0 0 0-64 0A373.376 373.376 0 0 0 480 841.344v65.28H384a32 32 0 1 0 0 64h256a32 32 0 0 0 0-64H544v-65.28a373.376 373.376 0 0 0 341.312-372.032 32 32 0 1 0-64 0 309.312 309.312 0 1 1-618.624 0z`,fill:`#a6b0b3`})],-1)]])):((0,t.openBlock)(),(0,t.createElementBlock)(`span`,{key:0,title:`关闭`,onClick:r[3]||=e=>J(!0)},[...r[17]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`200`,height:`200`},[(0,t.createElementVNode)(`path`,{d:`M62.72 62.72a32 32 0 0 1 45.248 0l212.864 212.8 0.96 1.024 340.224 340.224a35.84 35.84 0 0 1 1.216 1.216l89.92 89.92a35.712 35.712 0 0 1 1.088 1.088l207.04 207.04a32 32 0 1 1-45.248 45.248l-187.648-187.648a371.456 371.456 0 0 1-184.32 67.648v65.408H640a32 32 0 1 1 0 64H384a32 32 0 0 1 0-64h96v-65.344a373.376 373.376 0 0 1-341.376-372.032 32 32 0 0 1 64 0 309.312 309.312 0 0 0 479.68 258.304l-46.464-46.464a245.312 245.312 0 0 1-369.216-211.84v-157.44L62.72 108.032a32 32 0 0 1 0-45.248z m267.968 406.592a181.312 181.312 0 0 0 257.856 164.48l-257.92-257.92v93.44zM512 117.312c-66.944 0-125.44 36.288-156.928 90.432a32 32 0 1 1-55.296-32.192 245.312 245.312 0 0 1 457.6 123.072v170.688c0 40.128-9.664 78.08-26.816 111.552a32 32 0 0 1-56.96-29.12 180.48 180.48 0 0 0 19.712-82.432V298.688A181.312 181.312 0 0 0 512 117.312zM885.312 469.312a32 32 0 1 0-64 0c0 63.936-19.328 123.2-52.48 172.48a32 32 0 1 0 53.12 35.712c40-59.52 63.36-131.2 63.36-208.192z`,fill:`#a6b0b3`})],-1)]]))],512),[[t.vShow,e.isLive&&e.streamWorking]])]),(0,t.createElementVNode)(`div`,ee,[!e.isLive&&e.streamWorking?((0,t.openBlock)(),(0,t.createElementBlock)(`span`,te,[(0,t.withDirectives)((0,t.createElementVNode)(`span`,{title:`播放`,onClick:r[5]||=e=>G(2)},[...r[19]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`13`,height:`13`},[(0,t.createElementVNode)(`path`,{d:`M701.44 539.648L440.32 711.475a32.973 32.973 0 0 1-45.67-9.42 31.949 31.949 0 0 1-5.53-18.228V340.173a32.973 32.973 0 0 1 32.973-32.973 33.792 33.792 0 0 1 18.227 5.325l261.12 171.827a33.178 33.178 0 0 1 9.42 45.875 37.478 37.478 0 0 1-9.42 9.421z`}),(0,t.createElementVNode)(`path`,{d:`M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512z m0-57.958A454.042 454.042 0 1 0 57.958 512 454.246 454.246 0 0 0 512 966.042z`})],-1)]],512),[[t.vShow,_.value]]),(0,t.withDirectives)((0,t.createElementVNode)(`span`,{title:`暂停`,onClick:r[6]||=e=>G(3)},[...r[20]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`13`,height:`13`},[(0,t.createElementVNode)(`path`,{d:`M512 8.858C234.496 8.858 8.858 234.496 8.858 512S234.548 1015.142 512 1015.142c277.504 0 503.142-225.69 503.142-503.142C1015.142 234.496 789.504 8.858 512 8.858z m0 937.984A434.79 434.79 0 0 1 77.158 512 434.79 434.79 0 0 1 512 77.158 434.79 434.79 0 0 1 946.842 512 434.79 434.79 0 0 1 512 946.842zM408.474 304.947a45.978 45.978 0 0 0-45.568 45.568v320.922c0 24.832 20.736 45.568 45.568 45.568s45.568-20.736 45.568-45.568V350.515a45.978 45.978 0 0 0-45.568-45.568z m207.052 0a45.978 45.978 0 0 0-45.568 45.568v320.922c0 24.832 20.736 45.568 45.568 45.568s45.568-20.736 45.568-45.568V350.515a45.978 45.978 0 0 0-45.568-45.568z`})],-1)]],512),[[t.vShow,g.value]])])):(0,t.createCommentVNode)(``,!0),(0,t.withDirectives)((0,t.createElementVNode)(`div`,k,[(0,t.createElementVNode)(`div`,{title:`播放速度`,onClick:r[7]||=e=>l.value=!l.value},[(0,t.createElementVNode)(`span`,null,(0,t.toDisplayString)(h.value===1?`倍速`:z.value),1)]),(0,t.createElementVNode)(`ul`,{class:(0,t.normalizeClass)([`wwav-player__footer__pop wwav-player__footer--speed-pop`,{show:l.value}])},[(0,t.createElementVNode)(`li`,A,[(0,t.createElementVNode)(`i`,{class:`wwav-player__common-icon`,onClick:r[8]||=e=>(0,t.unref)(K)(`minus`)},`-`),(0,t.createElementVNode)(`span`,j,(0,t.toDisplayString)(z.value),1),(0,t.createElementVNode)(`i`,{class:`wwav-player__common-icon`,onClick:r[9]||=e=>(0,t.unref)(K)(`plus`)},`+`)])],2)],512),[[t.vShow,!e.isLive&&e.streamWorking&&(I.value&&L.value||!I.value)]]),(0,t.withDirectives)((0,t.createElementVNode)(`span`,{class:`wwav-player__common-icon wwav-player__footer--capture`,title:`截屏`,onClick:(0,t.withModifiers)(U,[`stop`])},[...r[21]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1132 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`13`,height:`13`},[(0,t.createElementVNode)(`path`,{d:`M987.332085 0H146.998468C66.647149 0 1.437957 64.27234 1.437957 143.468936v678.410894a42.550468 42.550468 0 0 0 0 21.830808v36.820426C1.41617 959.72766 66.625362 1024 147.020255 1024h840.333617C1067.726979 1024 1132.93617 959.72766 1132.93617 880.531064V143.468936C1132.93617 64.27234 1067.726979 0 987.332085 0zM146.998468 87.345021h840.333617c31.35183 0 56.973617 25.273191 56.973617 56.123915v544.898724c-32.898723-43.966638-72.769362-92.007489-114.252255-130.069788-24.684936-22.745872-55.383149-32.114383-88.93549-27.430127-52.85583 7.494809-110.788085 50.851404-176.91234 132.24851a1004.456851 1004.456851 0 0 0-41.787915 55.208851c-58.237277-79.218383-172.81634-225.497872-269.987404-292.885787-28.802723-19.957106-61.091404-24.619574-94.011915-14.030979-35.752851 11.547234-70.590638 41.482894-106.016681 91.397447-20.567149 28.693787-41.461106 64.250553-62.681872 106.038468V143.468936a56.799319 56.799319 0 0 1 57.300425-56.123915z`}),(0,t.createElementVNode)(`path`,{d:`M697.191489 337.702128a76.255319 76.255319 0 1 0 152.510639 0 76.255319 76.255319 0 1 0-152.510639 0z`})],-1)]],512),[[t.vShow,(g.value||_.value)&&(I.value&&L.value||!I.value)]]),e.isLive&&!e.isClosed?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,M,[(0,t.createElementVNode)(`span`,{onClick:r[10]||=e=>o.value=!o.value},(0,t.toDisplayString)(R.value),1),(0,t.createElementVNode)(`ul`,{class:(0,t.normalizeClass)([`wwav-player__footer__pop wwav-player__footer--quality-select`,{show:o.value}])},[((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)([`高清`,`标清`,`流畅`],(e,n)=>(0,t.createElementVNode)(`li`,{key:e,class:(0,t.normalizeClass)([`wwav-player__footer--quality-select--item`,{active:n===i.value}]),onClick:e=>W(n)},(0,t.toDisplayString)(e),11,N)),64))],2)])):(0,t.createCommentVNode)(``,!0),e.features.length===0?(0,t.createCommentVNode)(``,!0):((0,t.openBlock)(),(0,t.createElementBlock)(`div`,P,[(0,t.createElementVNode)(`span`,{title:`其他设置`,onClick:r[11]||=e=>c.value=!c.value},[...r[22]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`16`,height:`16`},[(0,t.createElementVNode)(`path`,{d:`M962.496 448.96c-3.584-19.84-22.656-39.808-42.304-44.288l-14.72-3.392c-34.624-10.432-65.536-33.536-84.992-67.328-19.648-33.984-24.128-72.576-15.616-107.968 0 0 0 0 0 0l4.288-13.824c5.952-19.264-1.792-45.76-17.216-58.816 0 0-13.824-11.712-52.992-34.304-39.168-22.592-56.128-28.736-56.128-28.736-19.008-6.848-45.76-0.32-59.52 14.464L612.928 115.84C586.56 140.672 551.104 155.904 512 155.904c-39.232 0-74.88-15.36-101.248-40.384L400.832 104.832C387.136 90.048 360.32 83.52 341.312 90.368c0 0-17.024 6.144-56.256 28.736C245.952 141.696 232.128 153.344 232.128 153.344 216.768 166.4 209.024 192.832 214.976 212.16l4.288 14.016c8.448 35.328 3.904 73.856-15.68 107.776C184 367.872 152.896 391.04 118.08 401.408L103.808 404.672c-19.648 4.48-38.72 24.448-42.304 44.288 0 0-3.2 17.792-3.2 63.04 0 45.248 3.2 62.976 3.2 62.976 3.584 19.84 22.656 39.808 42.304 44.288l13.952 3.2c0 0 0 0 0 0 34.944 10.304 66.112 33.536 85.824 67.584 19.648 33.984 24.128 72.576 15.616 107.968 0 0 0 0 0 0l-4.224 13.76c-5.952 19.264 1.792 45.76 17.216 58.816 0 0 13.824 11.712 52.992 34.304 39.168 22.592 56.128 28.736 56.128 28.736 19.008 6.848 45.76 0.32 59.52-14.464l9.792-10.56c26.432-25.024 62.08-40.448 101.376-40.448 39.296 0 75.008 15.424 101.44 40.512 0 0 0 0 0.064 0l9.728 10.496c13.76 14.784 40.512 21.312 59.52 14.464 0 0 17.024-6.144 56.256-28.736 39.168-22.592 52.928-34.304 52.928-34.304 15.424-13.056 23.168-39.488 17.216-58.816l-4.352-14.208c-8.32-35.264-3.84-73.664 15.744-107.52 19.648-34.048 50.88-57.216 85.824-67.584 0 0 0-0.064 0-0.064l13.952-3.2c19.648-4.48 38.72-24.448 42.304-44.288 0 0 3.2-17.792 3.2-63.04C965.696 466.752 962.496 448.96 962.496 448.96zM512 692.928c-99.904 0-180.928-81.024-180.928-180.928S412.096 331.136 512 331.136s180.928 81.024 180.928 180.928S611.904 692.928 512 692.928z`})],-1)]]),(0,t.createElementVNode)(`ul`,{class:(0,t.normalizeClass)([`wwav-player__footer__pop wwav-player__footer--setting-pop`,{show:c.value}])},[e.features.indexOf(`PTZ`)===-1?(0,t.createCommentVNode)(``,!0):((0,t.openBlock)(),(0,t.createElementBlock)(`li`,F,[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{"onUpdate:modelValue":r[12]||=e=>f.value=e,class:`styled-checkbox`,type:`checkbox`,onChange:Y},null,544),[[t.vModelCheckbox,f.value]]),r[23]||=(0,t.createElementVNode)(`label`,null,`云台(需全屏)`,-1)]))],2)]))]),(0,t.createElementVNode)(`span`,{class:`wwav-player__common-icon wwav-player__footer--fullscreen`,title:`全屏`,onClick:(0,t.withModifiers)(V,[`stop`])},[...r[24]||=[(0,t.createElementVNode)(`svg`,{class:`wwav-player__svg-icon`,viewBox:`0 0 1097 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`13`,height:`13`},[(0,t.createElementVNode)(`path`,{d:`M51.2 658.285714c29.257143 0 43.885714 21.942857 51.2 43.885715v219.428571h241.371429c29.257143 0 51.2 21.942857 51.2 51.2 0 29.257143-21.942857 43.885714-43.885715 51.2H0V709.485714c0-29.257143 21.942857-51.2 51.2-51.2z m950.857143 0c29.257143 0 51.2 21.942857 51.2 51.2V1024H709.485714c-29.257143 0-51.2-21.942857-51.2-51.2s21.942857-51.2 51.2-51.2H950.857143V709.485714c0-29.257143 21.942857-51.2 51.2-51.2z m-658.285714-658.285714c29.257143 0 51.2 21.942857 51.2 51.2s-21.942857 51.2-51.2 51.2H102.4v212.114286c0 29.257143-21.942857 51.2-51.2 51.2S0 343.771429 0 314.514286V0h343.771429z m709.485714 0v314.514286c0 29.257143-21.942857 51.2-51.2 51.2-29.257143 0-43.885714-21.942857-51.2-43.885715v-219.428571H709.485714c-29.257143 0-51.2-21.942857-51.2-51.2 0-29.257143 21.942857-43.885714 43.885715-51.2h351.085714z`})],-1)]])]))}}),L=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},R=L(I,[[`__scopeId`,`data-v-d478ce3d`]]),z={class:`wwav-player-center-middle wwav-player__ptz__direction-content`},B=[`onMousedown`],V=(0,t.defineComponent)({__name:`direction`,props:{currentDirection:{default:``},isInside:{type:Boolean,default:!1},isFullscreen:{type:Boolean,default:!1},stopAllCommand:{}},emits:[`move-to-direction`,`do-zoom`],setup(e,{emit:n}){let r=e,i=n,a=(0,t.ref)(!1),o=(0,t.ref)(!1),s=[`tilt_up`,`up_right`,`pan_right`,`down_right`,`tilt_down`,`down_left`,`pan_left`,`up_left`],c=new Map([[45,`zoom_in`],[46,`zoom_out`],[36,`focus_out`],[35,`focus_in`],[33,`iris_down`],[34,`iris_up`],[37,`pan_left`],[38,`tilt_up`],[39,`pan_right`],[40,`tilt_down`]]),l=()=>{document.addEventListener(`keydown`,d,!1),document.addEventListener(`keyup`,f,!1),o.value=!0},u=()=>{try{document.removeEventListener(`keydown`,d,!1),document.removeEventListener(`keyup`,f,!1),r.stopAllCommand(),o.value=!1}catch(e){console.error(e)}},d=e=>{if(!r.isFullscreen||a.value||!r.isInside)return;a.value=!0;let t=c.get(e.keyCode);t&&([37,38,39,40].includes(e.keyCode)?i(`move-to-direction`,t):i(`do-zoom`,t))},f=e=>{!r.isFullscreen||!r.isInside||c.get(e.keyCode)&&(a.value=!1,r.stopAllCommand())},p=e=>{i(`move-to-direction`,e)},m=()=>{r.stopAllCommand()};return(0,t.onMounted)(()=>{l()}),(0,t.onBeforeUnmount)(()=>{u()}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`wwav-player__ptz__direction`,onMouseup:m,onMouseleave:(0,t.withModifiers)(m,[`stop`])},[(0,t.createElementVNode)(`div`,z,[((0,t.openBlock)(),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(s,n=>(0,t.createElementVNode)(`div`,{key:n,class:(0,t.normalizeClass)({"wwav-player__ptz__direction-triangle":!0,active:n===e.currentDirection}),onMousedown:(0,t.withModifiers)(e=>p(n),[`stop`])},null,42,B)),64))]),r[0]||=(0,t.createElementVNode)(`div`,{class:`wwav-player-center-middle wwav-player__ptz__direction-circle-border`},null,-1),r[1]||=(0,t.createElementVNode)(`div`,{class:`wwav-player-center-middle wwav-player__ptz__direction-circle`},null,-1)],32))}}),H=(0,t.defineComponent)({__name:`popper`,props:{show:{type:Boolean,default:!1}},emits:[`plus`,`minus`],setup(e){return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:(0,t.normalizeClass)([`wwav-player__ptz__operation-popper`,{"wwav-player__ptz__operation-popper-show":e.show}])},[(0,t.createElementVNode)(`div`,{class:`wwav-player__ptz__operation-popper-icon`,onMousedown:r[0]||=(0,t.withModifiers)(e=>n.$emit(`plus`),[`stop`])},[...r[2]||=[(0,t.createElementVNode)(`svg`,{viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`16`,height:`16`},[(0,t.createElementVNode)(`path`,{d:`M832 464H560V192a48 48 0 1 0-96 0v272H192a48 48 0 1 0 0 96h272v272a48 48 0 1 0 96 0V560h272a48 48 0 1 0 0-96z`})],-1)]],32),(0,t.renderSlot)(n.$slots,`center`),(0,t.createElementVNode)(`div`,{class:`wwav-player__ptz__operation-popper-icon`,onMousedown:r[1]||=(0,t.withModifiers)(e=>n.$emit(`minus`),[`stop`])},[...r[3]||=[(0,t.createElementVNode)(`svg`,{viewBox:`0 0 1024 1024`,version:`1.1`,xmlns:`http://www.w3.org/2000/svg`,width:`16`,height:`16`},[(0,t.createElementVNode)(`path`,{d:`M853.333333 554.666667H170.666667c-23.466667 0-42.666667-19.2-42.666667-42.666667s19.2-42.666667 42.666667-42.666667h682.666666c23.466667 0 42.666667 19.2 42.666667 42.666667s-19.2 42.666667-42.666667 42.666667z`})],-1)]],32)],2))}}),U=[`title`],W={key:0,src:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADQElEQVRIS8WWWehVVRSHv08oCINsehC1KKHZ0hKMZrWHKKRBc8IgCIPooR580kKorAhKoh6Kwop6aICSKKKSkApBRWyejCbFSqEHSbRxxYp95Xo9+57zF8r9eM5e69t77bV+a8khWh4iLp3AEXEqsAC4BDgNOA74E/gZ+Ah4G3hR3dH1IkPBBfgAMAv+PeR3wIfATmAUMB44txxkL/AksFz9pe0AVXBE3AI8VBw8ATymfjboMCLyABcDtwNXlygsUNcOgzeCI+IeYBmwAVikbmm7Qf6PiJnAMyUC89XVNbsDwBFxK/Ao8CowT80Qdl4RMQ5YA5wEXKqubzLeDxwRpwObgQ+K0W+diX0bI+IEYBOwCzhL3TPoZxD8GpDhmqR+fTDQnk1EzAVeyCdT762Cy20/BR5RbxsGjYiJwG71p5Z9G4G8/Xj1j/69+24cEXcBdwJnqJ/XHBboV8AOdWwL+KZSYleob9bA75aTndzibCqQN9mrHtGyNw+2HbhPXVoDp+qsU69pchYRZwJjinKlUPwOzCh7f1C3VuzS7/vqdTVwSuBT6uIGkTgR+KaoVZP/beqECjjzZqd6WQ2c9fq8emMD+CjgPeBY4DDg+NQL4Meyd/3gjfqy+0tgq3p5DZzl872a5VRdETGSN87k/RV4Wb2hBn4FmJ5yp2bYG9cIwecUMVqiPlgD3ww8DlypvjEEfDTwVnYq9fqW6NwN3FEE6ZMaODM2M3NDW7iHwbre9siSkN+q0wZtBiVzBZD1Nld9qQtgSGRWllY5S00p3m8NgkeXN8nsvaip/3Y5TETMKTq9Wp3dZNPUFs8upbMbuErNbtV5RcR84GngcOB8NXv6Aas2CFxY+nFK4nLgYTWValiZZZSyC6UA9fymXE5XU9vroe7/ExGp2c8CFwDbUtWA13Pm6g0HEZHCkomTMrsIyIR6DliVtQtkBSR8hppCsm+1DXv5fyGwBJhcrP4uopCzVoJy/VVK7H41m02OQeeVb8cUhUv4Fz1yp/G2OMrppDfeprOE5Xj7MfBOU2+OiJxAc/TtwWf2Wm5ncOfsGtgYEVPKDJbwLeopueU/B5do5TPl8LhJvfZ/A3cup4MN60js/gFMSkEuKKvOXwAAAABJRU5ErkJggg==`,alt:``},G={key:1,src:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADJUlEQVRIS8WX2cuNaxjGf5chJ4QynMk8lESGkE04QDhQlF3YMjuhRPwHiH0gDsyKzQEnFE6UTGWToWwZM6SkbcyhxK3r87x61/rW8K4vH3etVu9az3Nf93xfr/hNoiK4EeFzk4CZwDhgANAV8O8fgMfAVeAMcFHS13p6awJHRDtgCbAR6At8Af4D7gFTgLbAOWAIMCw9PwW2Agck+XxFqQocEYOBY8CIBLQDOCHJHhIRl4EOksakZ0dgLrAGGArcBhZIspHNpCJwREw3SPJwQ7K+JHzlwJnmlBZHaRvQHpgvySkokWbAETEDOAk4ZLMkPalkcTXgnAG9U85dD3PKwUuAI2IQcAN4CUyQ9LZajuoBp/B3Ay4ANmJMPuw/gCOiDXAtVezIap7mPDroUEpaWKuCI6IPcAt4BozOCi4PvBTYD6yUtLdeOzTyf0Q45weA1ZJ2+24TcCqIR8BnV2SRPmwQ2Dh3gI5AP+vPgCe68VvD21xqlgH7gKmSzmfAfwNrgR6S3jfiTdGzEdEFeA3skrQuA74EdJLkYdFqEhE3nU5JYzPgVy57SX+2Gur3WvoHmCapewbsovIofFEG/LilxiQQj9289PJykdQ+D/wGKJ9STyQtbkkUIsJ97qmVl35AT0ltf3Woj6ZQd8uA3UqdJQ1viXdF70SEJ9gnSeMy4C3A+hSGd0UVNXIuIrw23U47JK3PgCcA3q8/RlojSoucjYgVwB5gsqQL+ZH5IO3f1hqZd00cXHCSmrhUk0SEq/cQsEqSLstpEhHLAS+e5ZK8iL4viQTstfgv4N4bJclLo6pExOG0FmsOnYjon3a8CeHYZmsxgbvvTAT+B/6Q5O+KUpAIdE9EwIPDzjzMlFWiPuZbp4DnwOxqntcDTp6eBkwETH3O5j2oRvamAcdTKja5Gsupag2y55SZVGxP9032SkBLclwez4gYCBwxVwKc7502RpJ7sRK9dVjnJXpr7nYd+EuSu6WZ1CP0tn4RYK+tLBLHvm8ymAi8p54JvT8+byM3A4drMZlCrzDJw/Gmu7lXGC92y8cE5o44I+lKkT4sDFxEWSNnvgEeKk4uGlQWRgAAAABJRU5ErkJggg==`,alt:``},K={key:2,src:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAEV0lEQVRIS8WXe8jecxjGP5fDiJrkMGxamM00lENGXo0Jmy2iWBabkjHJaWYlc2gx5qyktTlMi5xCDkMZw6hJ/DGHHOcwTZtohDlcuh7f39vvefY+7+Hxh7vef37v9/u97vu6D9f9iP/J1B9c21sA44CTgCOA4cDOwB/AT8CXwFvAc8Brkv7u691egW1vCZwLXA58DDwJvA3MBA4BTge+A/YGuoDTgBHArcBiSX+1c6AtsO0xwBLgPWCepM9tDwaeKBHOlJSIm8z2PsA1wP7ANEmrewLvEdh2KL0bOF/SS7loewjwArBUUiLq1WyfCNwTdiQtaz28GbDtk4H5yWeiLKBDgThwc6H8MGA0sHt8An4AvgI+AFZKWlvuhfbk/RJJcbrbmoBth54cHCdpTbm8A/BmKaY/C/XJcygMQN7YCTgauAL4Hvi2sPM4sBF4GZgo6aMKuRu4FNI7wGxJOdgw208DqdIHgWWSfmvHse2pwNVJEXAgcCawXWFjN+DwquDqwDOAexOZpA0FNN8mSDqlr5zWHJ0I3AYcG8pt7wucB5wDzJG0KGcbwKVPQ8OvaR9Jq2ynT1cVL0Nfv832FOCy0F8xZLvK9+j0eQU8HrgY+AR4X9IS22kJSbq234i1g7ZvAgZJurTGxvPAAknLK+A7StFkQqXAUiSfFo9TKAM224MSBHCqpA8LsxlGIyXNroBXAmcD25f8XAVcJ+mEASM2R30WMF7S9AK8H7BI0lEV8Ddl/qYnM3cfADZIuvM/Am8NfA2MkbTe9lbAGklDK+C1kvYoXj0DZEBMlpT26thsp5UiIhdJSsekkNdJGtITcATgdmCwpN87Rv0XJEqWIfKupMkFuBFkE9Vpbtu7lKIY3pMIDMQR27PKAMk82LO0b6geVgFnJE6XlHaKp1GlFyUtHQhQ61nbr5QOuSV0F/1OcXVVwFGb1ZLuK8ARgGjvQZI2dQJuOzWzXNIo2xGXCEiKbYSkKyvgYyL2kibVmj153pRDHQLPA36RdKPttOoB5W++pFfrIzNNHgX5rES9LbAihSbp4YGAl2jfAA6W9KPtscDCTLLIqSTXRSKDPDocFVqYaVMeSJ5mSXq2P+B2482Mxkck5a3UzK7AuqIDi/OtVRYjChH0CH+099GiuxkkN0h6qB247Uy9pCq0bpQUoWiY7XyfC4ytFsF2i8DxQBa9M8pmmT1qx9LfoT8bR+6mgDLbQ2UKMlRmOeiS9HMBHZkOKfK6+SJQ8y56msKaVGuvUHVoRh+wV3EiV0JfqrUhn8AFwHGSGjJqO6DZaLJ3dS8XTVTXKbQdcciIu1BS8tWr2Z4TFSrFub5G713AjFbQtsA1bzNAIo9zq+hbHNymOJhpNyX02h4FXF+YmdrTvV6BC3jyPK1Mny+Ap0qLxZlhwGPA68D9wJFAVqT8yliQnbyjhb4lshRStsgJBSB5zvaZxSGFljU4m2dW2BXp077S06/fTn090sn//wGEVdYusNmj3QAAAABJRU5ErkJggg==`,alt:``},q=(0,t.defineComponent)({__name:`operationButton`,props:{isLockedByOther:{type:Boolean,default:!1},type:{},title:{},command1:{},command2:{}},emits:[`do-zoom`],setup(e,{emit:n}){let r=n,i=(0,t.ref)(!1),a=e=>{r(`do-zoom`,e)};return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`wwav-player__ptz__operation-button`,title:e.title},[(0,t.createElementVNode)(`div`,{class:`image`,onClick:r[0]||=(0,t.withModifiers)(e=>i.value=!i.value,[`stop`])},[e.type===`Multiple`?((0,t.openBlock)(),(0,t.createElementBlock)(`img`,W)):e.type===`Focus`?((0,t.openBlock)(),(0,t.createElementBlock)(`img`,G)):((0,t.openBlock)(),(0,t.createElementBlock)(`img`,K))]),e.isLockedByOther?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:1,class:(0,t.normalizeClass)([`wwav-player__ptz__operation-button-disable`,{"wwav-player__ptz__operation-popper-show":i.value}])},` 不可操作 `,2)):((0,t.openBlock)(),(0,t.createBlock)(H,{key:0,show:i.value,onPlus:r[1]||=t=>a(e.command1),onMinus:r[2]||=t=>a(e.command2)},null,8,[`show`]))],8,U))}}),J={key:0,src:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACAklEQVRIS+2WMUiWURSGn7eIEhqiCArcTAzNhiAIGwMxijBsSmgMsgZxaonAySVqscC1oCUSQiGquXQKK7MiR0OQoqEhIX3jwBf82u9/r34/idBZ7vCde5573vvd916xSaFN4rIusO09wDXgPNBWLPodMAoMS/qe20g22HYH8Ag4CCwBn4uxBdgOfAF6JE3kwLPAtg8Dk8Bu4A4wJGkhALb3A9eBfuAHcFzSpxQ8F/wCOAUMSLpdrajtAeAW8FxSZ2mw7UNAdDAFHJPkNcDRxGvgKNAsabYWPNmx7V7gATAo6WatYrYHgRvARUkPy4KvAHeBq5JiXDNs98XfDfRJulcvcLKY7T+LTObmSJ1dbOuCbYchxNndBVwozulQYSC1tm517k/gg6QwnBXxl9S2W4EnQFPqLGZ+D4c7J2mmMr8a+BVwAvgKjAGLmYDVaaHWWWAv8FLSyRT4V+HBbZJitRuOwnymgW2SdqTA4UzTko5smFgx0XaAWyWtULea1AF+Kymsr3TYfgO0b32w7ftxK0q6lLDR+nZsez6Akg78B1cqUPefy/ZcsceN/1rqrmKPn9YT/FFSXBKlw3Y8m+IplDSQuFHC3k5LelaGbDsefaHIoqSGlGXG47wbWAbel7gkdoZVhk8DjyX1pMD7gBHgDBCTy0SoNw5clvStJrgMZT1zfwNkdRIu4LPeUgAAAABJRU5ErkJggg==`,alt:``},Y={key:1,src:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAACAklEQVRIS+2WMUiWURSGn7eIEhqiCArcTAzNhiAIGwMxijBsSmgMsgZxaonAySVqscC1oCUSQiGquXQKK7MiR0OQoqEhIX3jwBf82u9/r34/idBZ7vCde5573vvd916xSaFN4rIusO09wDXgPNBWLPodMAoMS/qe20g22HYH8Ag4CCwBn4uxBdgOfAF6JE3kwLPAtg8Dk8Bu4A4wJGkhALb3A9eBfuAHcFzSpxQ8F/wCOAUMSLpdrajtAeAW8FxSZ2mw7UNAdDAFHJPkNcDRxGvgKNAsabYWPNmx7V7gATAo6WatYrYHgRvARUkPy4KvAHeBq5JiXDNs98XfDfRJulcvcLKY7T+LTObmSJ1dbOuCbYchxNndBVwozulQYSC1tm517k/gg6QwnBXxl9S2W4EnQFPqLGZ+D4c7J2mmMr8a+BVwAvgKjAGLmYDVaaHWWWAv8FLSyRT4V+HBbZJitRuOwnymgW2SdqTA4UzTko5smFgx0XaAWyWtULea1AF+Kymsr3TYfgO0b32w7ftxK0q6lLDR+nZsez6Akg78B1cqUPefy/ZcsceN/1rqrmKPn9YT/FFSXBKlw3Y8m+IplDSQuFHC3k5LelaGbDsefaHIoqSGlGXG47wbWAbel7gkdoZVhk8DjyX1pMD7gBHgDBCTy0SoNw5clvStJrgMZT1zfwNkdRIu4LPeUgAAAABJRU5ErkJggg==`,alt:``},X=(0,t.defineComponent)({__name:`lockButton`,props:{isLocked:{type:Boolean,default:!1},isLockedByOther:{type:Boolean,default:!1}},emits:[`lock-ptz`,`unlock-ptz`],setup(e,{emit:n}){let r=e,i=n,a=(0,t.ref)(!1),o=(0,t.ref)(!1),s=(0,t.ref)(r.isLocked),c=()=>{if(!o.value){if(r.isLockedByOther){a.value=!0;return}o.value=!0,s.value?i(`unlock-ptz`):i(`lock-ptz`),setTimeout(()=>{o.value=!1,s.value=!s.value},1e3)}};return(0,t.onBeforeUnmount)(()=>{i(`unlock-ptz`)}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:(0,t.normalizeClass)({"wwav-player__ptz__operation-button":!0,isLocked:e.isLocked}),title:`锁定`,onMousedown:(0,t.withModifiers)(()=>{},[`stop`]),onMousemove:(0,t.withModifiers)(()=>{},[`stop`]),onMouseup:(0,t.withModifiers)(()=>{},[`stop`])},[(0,t.createElementVNode)(`div`,{class:`image`,onClick:c},[e.isLocked?((0,t.openBlock)(),(0,t.createElementBlock)(`img`,J)):((0,t.openBlock)(),(0,t.createElementBlock)(`img`,Y))]),e.isLockedByOther?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,class:(0,t.normalizeClass)([`wwav-player__ptz__operation-button-disable`,{"wwav-player__ptz__operation-popper-show":a.value}])},` 不可操作 `,2)):(0,t.createCommentVNode)(``,!0)],34))}}),Z=(0,t.defineComponent)({__name:`operations`,props:{step:{default:4},isLocked:{type:Boolean,default:!1},isLockedByOther:{type:Boolean,default:!1},stopAllCommand:{}},emits:[`update:step`,`do-zoom`,`lock-ptz`,`unlock-ptz`],setup(e,{emit:n}){let r=e,i=n,a=(0,t.ref)(!1),o=(0,t.ref)(r.step),s=e=>{e===`plus`&&o.value<7?(o.value++,i(`update:step`,o.value)):e===`minus`&&o.value>1&&(o.value--,i(`update:step`,o.value))},c=e=>{i(`do-zoom`,e)},l=()=>i(`lock-ptz`),u=()=>i(`unlock-ptz`),d=()=>r.stopAllCommand();return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`wwav-player__ptz__operation`,onMouseup:d,onMouseleave:(0,t.withModifiers)(d,[`stop`])},[(0,t.createVNode)(q,{"is-locked-by-other":e.isLockedByOther,type:`Multiple`,title:`变倍`,command1:`zoom_in`,command2:`zoom_out`,onDoZoom:c},null,8,[`is-locked-by-other`]),(0,t.createVNode)(q,{"is-locked-by-other":e.isLockedByOther,type:`Focus`,title:`聚焦`,command1:`focus_in`,command2:`focus_out`,onDoZoom:c},null,8,[`is-locked-by-other`]),(0,t.createVNode)(q,{"is-locked-by-other":e.isLockedByOther,type:`Aperature`,title:`光圈`,command1:`iris_down`,command2:`iris_up`,onDoZoom:c},null,8,[`is-locked-by-other`]),(0,t.createElementVNode)(`div`,{class:`wwav-player__ptz__operation-button`,title:`速度`,onMouseup:()=>{}},[(0,t.createElementVNode)(`div`,{class:`image`,onClick:r[0]||=e=>a.value=!a.value},[...r[3]||=[(0,t.createElementVNode)(`img`,{src:`data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAADAUlEQVRIS+2WXcifcxjHPx89lBUrMwdbMtrBkHaA1oZGZLUozjgQQmPZMEeKnVhKqWENIaWkOJKXxCiUl81L0xoRaSnJyxJlXsZX17P7XvezPc//vp95tBPXyfPU/ftdn+v6Xi+/vxwm87/kJlmofjEZY1rgJCcAS4GFwHFAgN3Al8BW9dsWkuQ84Bd1+yGBk8wCrgWuAc4Epgr2Z+B49c8kc4D71aumUnRkxkluADYAlelvwCvAm8CnwA/A38Bc4FRgTL2vQEleAB5Tn58WOMmxwFPApcBPwL3AI2r9P9KS3ArcWMGoVYpJ7aCMG5leBxYDLwLXqd/1AZtMqxRvA7epDyc5uiQH7lS/7/qYAG4OlpRnAxuB20dF3XWU5BjgI2A2cJK6J8n1JXk1HnC+WuUatwPBDwE3AY+rVd/BluRp4ErgbnV9p7sLXAFsVm8+CJykxqRk+hhYov4xlNrJbA+woFuaJEcB24AzgHPU9yZknGQLcCGwrP04BJzk9MZxjd2j6qoD7yVZArwLvKZevB+cZBHwCbBFXTEE2DRTwSqbgv9Vf9XPJruf5FXgImCR+vl4jZPcAdwDXKE+Mw1wW7+68px6+VR3k1T9qw/uUje04FoMFc1ctVZgr3UctWerRCXnpJakVmwtnXG5W/DXJZW6oJe4T6Ha1R8CtWjK3lAv6LubZBdwhHpiC/61ulmtzh5pSY4E3gHO6hxcoVYN++6WIovVWS14b42SunzA5VqJtVxa+0CthdNrSd5qpmasBf8IfKPWrPVFXWNX/dDaJepLfffqe5IdwDx1Tgt+vxnw2ervo5w0TfUkUJIPqm0DHQPq6RwvaQveDKwGzlVre/VlfRpwGfBE9/HvCXhZsxk3quta8Eqg5HpQvaUPfCjfkzwArAVWqi+34JLhK6BemFOGzvLQAJoZLv8l9cnq3v2vU5I1lTGwSa3IZsw62a5VN5XjLriyrpdjp3r1jFH3dfOzwHxgeWU7ATyToCG+pvXzdojDoWf+Bw9V6l+fO2xS/wMInjMueg7JWQAAAABJRU5ErkJggg==`,alt:``},null,-1)]]),(0,t.createVNode)(H,{style:{top:`-124px`},show:a.value,onPlus:r[1]||=e=>s(`plus`),onMinus:r[2]||=e=>s(`minus`)},{center:(0,t.withCtx)(()=>[(0,t.createElementVNode)(`span`,null,(0,t.toDisplayString)(e.step),1)]),_:1},8,[`show`])],32),(0,t.createVNode)(X,{"is-locked":e.isLocked,"is-locked-by-other":e.isLockedByOther,onLockPtz:l,onUnlockPtz:u},null,8,[`is-locked`,`is-locked-by-other`])],32))}}),Q=L((0,t.defineComponent)({__name:`message`,setup(e,{expose:n}){let r=(0,t.ref)(!1),i=(0,t.ref)(``),a=(0,t.ref)(`info`);return n({show:(e,t=`info`)=>{i.value=e,a.value=t,r.value=!0,setTimeout(()=>{r.value=!1},3e3)}}),(e,n)=>((0,t.openBlock)(),(0,t.createBlock)(t.Transition,{name:`fade`},{default:(0,t.withCtx)(()=>[r.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,class:(0,t.normalizeClass)([`wwav-player__ptz-message`,a.value])},(0,t.toDisplayString)(i.value),3)):(0,t.createCommentVNode)(``,!0)]),_:1}))}}),[[`__scopeId`,`data-v-97aecee1`]]);function ne(){let e=(0,t.ref)(!1),n=(0,t.ref)(null),r=(0,t.ref)(!1),i=(0,t.ref)(0),a=()=>{i.value&&clearInterval(i.value),i.value=0,n.value=null,e.value=!1,r.value=!1};return(0,t.onBeforeUnmount)(()=>{a()}),{isLocked:e,lockToken:n,isLockedByOther:r,unlockTimerId:i,idle_timeout:10,resetLock:a}}var re=(0,t.defineComponent)({__name:`index`,props:{devicePath:{default:``},isFullscreen:{type:Boolean,default:!1}},emits:[`move-to-direction`,`do-zoom`,`lock-ptz`],setup(e,{emit:n}){let r=n,i=(0,t.ref)(null),a=(0,t.ref)(null),{isLocked:o,isLockedByOther:s,resetLock:c}=ne(),l=(0,t.ref)(4),u=(0,t.ref)(!1),d=(0,t.ref)(``),f=e=>{d.value=e,r(`move-to-direction`,e)},p=e=>{r(`do-zoom`,e)},h=m(()=>{d.value=``},200),g=e=>{a.value?.show(e.message,e.type)},_=()=>{r(`lock-ptz`,!0),o.value=!0,g({type:`success`,message:`云台已锁定`})},v=()=>{r(`lock-ptz`,!1),c(),g({type:`success`,message:`云台已解锁`})},y=(0,t.ref)(null),b=(0,t.ref)(!1),x=e=>{y.value&&clearTimeout(y.value),b.value||(b.value=!0,p(e.deltaY>0?`zoom_out`:`zoom_in`)),y.value=setTimeout(()=>{h(),b.value=!1},500)},S=()=>{u.value=!1,h()};return(0,t.onBeforeUnmount)(()=>{c(),y.value&&clearTimeout(y.value)}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{ref_key:`videoContainer`,ref:i,class:`wwav-player__ptz`,onWheel:(0,t.withModifiers)(x,[`self`,`prevent`]),onMouseleave:S},[(0,t.withDirectives)((0,t.createElementVNode)(`span`,{class:`wwav-player__ptz-status-label`},` 可操控: `+(0,t.toDisplayString)((0,t.unref)(s)?`否`:`是`),513),[[t.vShow,e.isFullscreen]]),(0,t.withDirectives)((0,t.createVNode)(V,{"current-direction":d.value,"stop-all-command":(0,t.unref)(h),"is-inside":u.value,"is-fullscreen":e.isFullscreen,onMoveToDirection:f,onDoZoom:p},null,8,[`current-direction`,`stop-all-command`,`is-inside`,`is-fullscreen`]),[[t.vShow,e.isFullscreen]]),(0,t.withDirectives)((0,t.createVNode)(Z,{step:l.value,"onUpdate:step":r[0]||=e=>l.value=e,"is-locked":(0,t.unref)(o),"is-locked-by-other":(0,t.unref)(s),"stop-all-command":(0,t.unref)(h),onDoZoom:p,onLockPtz:_,onUnlockPtz:v},null,8,[`step`,`is-locked`,`is-locked-by-other`,`stop-all-command`]),[[t.vShow,e.isFullscreen]]),(0,t.createVNode)(Q,{ref_key:`messageRef`,ref:a},null,512)],544))}});function ie(){let e=(0,t.ref)(null),n=(0,t.ref)(!1),r=(0,t.ref)(!1),i=(0,t.ref)(`H264`),a=(0,t.ref)({format:`H264`,width:0,height:0}),o=(0,t.ref)(4),s=(e,t,n)=>{console.error(`Player error:`,e,t,n)},c=e=>{a.value=e,i.value=e.format},l=()=>{o.value=2},u=()=>{o.value=3},d=async(t,i,a,o)=>{let d=(await import(`@vanwei-wcs/wwav-player`)).default,f=new d(t);f.on(`error`,(...e)=>s(e[0],e[1],e[2])),f.on(`media_info`,(...e)=>c(e[0])),f.on(`play`,l),f.on(`pause`,u),e.value=f,n.value=!0,r.value||g(i,a,o)},f=(t,n)=>new Promise(r=>{e.value?(e.value.open(t.url,t.token),n(),o.value=2,r()):setTimeout(()=>{f(t,n).then(r)},200)}),p=t=>{e.value&&e.value.openTalk(t.url,t.token)},m=()=>{e.value&&e.value.closeTalk()},h=t=>{e.value&&e.value.muted(t)},g=(t,n,i)=>{e.value&&!r.value&&(t&&e.value.attachVideoElement(t,i),n&&e.value.attachCanvasElement(n,i),r.value=!0)};return{player:e,playerCreated:n,attachedElement:r,streamType:i,mediaInfo:a,videoStatus:o,createPlayer:d,open:f,openTalk:p,closeTalk:m,controlSound:h,attachElement:g,play:()=>{e.value&&e.value.play()},pause:()=>{e.value&&e.value.pause()},changePlayStatus:t=>{try{e.value&&(t===2?e.value.play():t===3&&e.value.pause())}catch(e){console.error(`changePlayStatus error:`,e)}},destroyPlayer:async t=>{t(),e.value&&await e.value.destroy(),o.value=4,e.value=null,n.value=!1,r.value=!1}}}function ae(){let e=(0,t.ref)({_staticsInfoTimer:null,_timeDiff:1e3,_BPS:0,_FPS:0,speed:0,fps:0});return{streamOptions:e,onStream:(t,n,r,i)=>{t.type===`video`&&(e.value._BPS+=t.data.byteLength,e.value._FPS++)},startStaticsInfoTimer:()=>{e.value._staticsInfoTimer&&clearInterval(e.value._staticsInfoTimer),e.value._staticsInfoTimer=setInterval(()=>{let t=e.value._BPS;e.value.speed=Math.floor(t/1024),e.value.fps=e.value._FPS,e.value._BPS=0,e.value._FPS=0},e.value._timeDiff)},clearStaticsInfoTimer:()=>{e.value._staticsInfoTimer&&clearInterval(e.value._staticsInfoTimer),e.value._BPS=0,e.value._FPS=0,e.value.speed=0,e.value.fps=0}}}function oe(){let e=(0,t.ref)(4);return{_videoStatus:e,capture:async(e={download:!0},t,n,r,i)=>{if([2,3].includes(t.value)&&n)try{let t;if(i.value===`H265`&&r)t=r;else{t=document.createElement(`canvas`),t.width=n.videoWidth,t.height=n.videoHeight;let e=t.getContext(`2d`);e&&e.drawImage(n,0,0,t.width,t.height)}let a=await t.toDataURL(`image/png`);return a===`data:,`?Promise.reject({reply:400,err_msg:`没有视频流,无法截图`}):e?.download?(await g(await _(a),`capture`,`.png`),Promise.resolve()):Promise.resolve(a)}catch(e){let t=e;return Promise.reject({reply:400,err_msg:`截图失败`+t.message})}else return Promise.reject({reply:400,err_msg:`未打开视频,无法截图`})},emitVideoStatus:(t,n)=>{e.value=t,n(`video-status-change`,t)}}}function se(){let e=(0,t.ref)(null),n=(0,t.ref)(null),i=(0,t.ref)(0),a=(0,t.ref)(0),o=(0,t.ref)(`both`),s=(0,t.ref)(null),c=(0,t.ref)(null),l=(0,t.ref)(!1),u=(0,t.ref)(.8),d=(0,t.ref)(1),f=e=>{let{offsetWidth:t,offsetHeight:n}=e;i.value=t,a.value=n,c.value&&(c.value.width=t,c.value.height=n)},p=async(e,t=`both`)=>{if(e){if(t!==`canvas`){let t=document.createElement(`video`);t.autoplay=!0,t.classList.add(`wcs-wwav-base-video__content`),t.muted=!0,t.playsInline=!0,_(t),e.appendChild(t),s.value=t}if(t!==`video`){let n=document.createElement(`canvas`);n.width=i.value,n.height=a.value,t===`canvas`?n.style.display=`block`:n.style.display=`none`,e.appendChild(n),c.value=n}l.value=!0}else l.value=!1},m=async e=>{e||(s.value&&(v(s.value),s.value.remove()),c.value&&c.value.remove(),s.value=null,c.value=null,l.value=!1)},h=e=>{e===`H265`?(s.value&&(s.value.style.display=`none`),c.value&&(c.value.style.display=`block`)):(s.value&&(s.value.style.display=`block`),c.value&&(c.value.style.display=`none`))},g=(e,t)=>{t===`H264`&&s.value&&(s.value.playbackRate=e)},_=e=>{e.addEventListener(`progress`,y)},v=e=>{e.removeEventListener(`progress`,y)},y=e=>{};return{erd:e,mediaBox:n,mediaBoxWidth:i,mediaBoxHeight:a,domForceType:o,videoMedia:s,canvasMedia:c,domCreated:l,videoMediaDelay:u,videoMediaPlaySpeed:d,mediaBoxResize:f,createMediaDom:p,clearMediaDom:m,changeDomDisplay:h,changePlaybackRate:g,addVideoListener:_,removeVideoListener:v,initResizeDetector:t=>{e.value=(0,r.default)(),e.value.listenTo(t,f),n.value=t},destroyResizeDetector:()=>{e.value&&n.value&&e.value.uninstall(n.value),e.value=null}}}var $=L((0,t.defineComponent)({__name:`index`,props:{debug:{type:Boolean,default:!1},isLive:{type:Boolean,default:!0},options:{default:()=>({debug:!1,mode:`video`,baseLibPath:`/lib/`,decoderLogLevel:0})},showPTZ:{type:Boolean,default:!1},showController:{type:Boolean,default:!1}},emits:[`stop-video`,`quality-change`,`change-play-speed`,`control-talk`,`lock-ptz`,`do-zoom`,`move-to-direction`,`error`,`video-status-change`,`sei-info`],setup(e,{expose:r,emit:i}){let a=e,o=i,s=(0,t.ref)(null),c=(0,t.ref)(null),{player:l,playerCreated:u,streamType:d,mediaInfo:f,videoStatus:p,createPlayer:m,open:h,controlSound:g,changePlayStatus:_,destroyPlayer:v}=ie(),{streamOptions:y,onStream:b,startStaticsInfoTimer:x,clearStaticsInfoTimer:S}=ae(),{capture:C}=oe(),{videoMedia:w,canvasMedia:T,domCreated:E,createMediaDom:D,clearMediaDom:O,changeDomDisplay:ee,initResizeDetector:te,destroyResizeDetector:k}=se(),A=(0,t.ref)(!0),j=(0,t.ref)([`PTZ`]),M=(0,t.ref)(!1),N=(0,t.ref)(!1),P=(0,t.ref)(!1),F=(0,t.ref)(1),I=(0,t.computed)(()=>a.showController&&!A.value),L=(0,t.computed)(()=>({speed:y.value.speed,fps:y.value.fps})),z=async e=>{A.value||await B(),!E.value&&c.value&&(await D(c.value),te(c.value)),u.value||(await m({debug:a.debug},w.value,T.value,a.options),l.value&&(l.value.onStream=e=>{b(e,d,(0,t.ref)(!1),p)})),await h(e,x),P.value=!0,A.value=!1},B=async()=>{await v(S),await O(l.value),P.value=!1,A.value=!0},V=async()=>{o(`stop-video`),await B(),y.value.speed=0,y.value.fps=0,A.value=!0,P.value=!1},H=()=>{N.value=!N.value,s.value&&n.default.isEnabled&&n.default.toggle(s.value)},U=()=>{n.default.isFullscreen||(N.value=!1)},W=e=>{M.value=e},G=e=>{o(`lock-ptz`,e)},K=e=>{o(`control-talk`,e)},q=e=>{g(e)},J=e=>{F.value=e,o(`quality-change`,e)},Y=e=>{o(`change-play-speed`,e)},X=e=>{o(`move-to-direction`,e)},Z=e=>{o(`do-zoom`,e)},Q=async()=>{try{await C({download:!0},p,w.value,T.value,d)}catch(e){console.error(`Capture failed:`,e)}};return(0,t.watch)(d,()=>{(0,t.nextTick)(()=>{ee(d.value)})}),(0,t.watch)(F,e=>{console.log(`videoQuality:`,e)}),(0,t.onMounted)(()=>{(0,t.nextTick)(()=>{n.default.isEnabled&&n.default.on(`change`,U)})}),(0,t.onBeforeUnmount)(()=>{n.default.isEnabled&&n.default.off(`change`,U),k(),S()}),r({openVideo:z,closeVideo:B,captureVideo:Q,changeQuality:J}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`base-content wwav-player`,ref_key:`mediaContentBoxRef`,ref:s},[(0,t.createElementVNode)(`div`,{ref_key:`mediaBoxRef`,ref:c,class:`wcs-wwav-base-video`},null,512),(0,t.withDirectives)((0,t.createVNode)(R,{features:j.value,"stream-working":P.value,"media-info":(0,t.unref)(f),"stream-info":L.value,"stream-type":(0,t.unref)(d),"is-live":e.isLive,"is-closed":A.value,"video-status":(0,t.unref)(p),"video-quality":F.value,"onUpdate:videoQuality":r[0]||=e=>F.value=e,onChangeQuality:J,onFullscreen:H,onChangePtzSwitch:W,onStopVideo:V,onLockPtz:G,onControlTalk:K,onControlSound:q,onChangePlaySpeed:Y,onChangePlayStatus:(0,t.unref)(_),onCaptureVideo:Q},null,8,[`features`,`stream-working`,`media-info`,`stream-info`,`stream-type`,`is-live`,`is-closed`,`video-status`,`video-quality`,`onChangePlayStatus`]),[[t.vShow,I.value]]),M.value&&e.isLive&&N.value&&e.showPTZ?((0,t.openBlock)(),(0,t.createBlock)(re,{key:0,"is-fullscreen":N.value,onMoveToDirection:X,onDoZoom:Z},null,8,[`is-fullscreen`])):(0,t.createCommentVNode)(``,!0)],512))}}),[[`__scopeId`,`data-v-c3dbeeea`]]),ce={vConnect:0,vStart:1,vPlay:2,vPause:3,vStop:4},le=[$],ue={install:e=>{le.forEach(t=>{t.name&&e.component(t.name,t)})},WwVideoPlayer:$};e.VideoStatus=ce,e.WwVideoPlayer=$,e.default=ue});
|
|
3
|
+
//# sourceMappingURL=video-player-v3.umd.cjs.map
|