index-cb44e888.js 15 KB

12345678910111213141516171819202122232425262728
  1. import{c as k,bi as le,d as B,Y as ie,Z as d,a1 as S,a2 as K,a3 as j,$ as C,a0 as i,T as o,a8 as h,ay as w,aQ as I,a7 as m,n as l,aK as A,a6 as H,a5 as R,b$ as ce,j as re,bn as X,bc as U,at as ne,f as ue,a9 as de,aH as D,bs as pe,aG as _e,aI as ve}from"./index-a8341fa1.js";import"./dayjs-919e6097.js";import{S as J}from"./index-a35c88a6.js";import{D as ee}from"./index-d1462287.js";var L=(e=>(e.VERTICAL="vertical",e.HORIZONTAL="horizontal",e))(L||{}),u=(e=>(e[e.STOP=0]="STOP",e[e.MOVE_RIGHT=1]="MOVE_RIGHT",e[e.MOVE_LEFT=2]="MOVE_LEFT",e[e.MOVE_DOWN=4]="MOVE_DOWN",e[e.MOVE_UP=8]="MOVE_UP",e[e.MOVE_LEFT_UP=10]="MOVE_LEFT_UP",e[e.MOVE_LEFT_DOWN=6]="MOVE_LEFT_DOWN",e[e.MOVE_RIGHT_UP=9]="MOVE_RIGHT_UP",e[e.MOVE_RIGHT_DOWN=5]="MOVE_RIGHT_DOWN",e[e.SHOT_ZOOM_FAR=16]="SHOT_ZOOM_FAR",e[e.SHOT_ZOOM_NEAR=32]="SHOT_ZOOM_NEAR",e[e.SHOT_FOCUS_FAR=66]="SHOT_FOCUS_FAR",e[e.SHOT_FOCUS_NEAR=65]="SHOT_FOCUS_NEAR",e[e.APERTRUE_FAR=72]="APERTRUE_FAR",e[e.APERTRUE_NEAR=68]="APERTRUE_NEAR",e[e.WIPER_OPEN=140]="WIPER_OPEN",e[e.WIPER_CLOSE=141]="WIPER_CLOSE",e[e.POINT_SET=129]="POINT_SET",e[e.POINT_CALL=130]="POINT_CALL",e[e.POINT_DEL=131]="POINT_DEL",e))(u||{});const fe=[1,2,3,4,5,6,7,8],oe=(e,t)=>{const s=e;let a,n,c;switch(e){case 1:case 2:case 66:case 65:a=F();break;case 8:case 4:case 72:case 68:n=F();break;case 10:case 6:case 9:case 5:a=F(),n=F();break;case 16:case 32:c=ke();break;case 140:case 141:a=1;break;case 129:case 130:case 131:n=fe[t]}return me({valIdx3:s,valIdx4:a,valIdx5:n,valIdx6:c})};function me({valIdx3:e,valIdx4:t,valIdx5:s,valIdx6:a}){const n=[165,15,1,0,0,0,0,0];return e&&(n[3]=e),t&&(n[4]=t),s&&(n[5]=s),a&&(n[6]=a),n[7]=(n[0]+n[1]+n[2]+n[3]+n[4]+n[5]+n[6])%256,be(n)}function be(e){let t="";for(let s=0;s<e.length;s++){let a=e[s].toString(16);a.length===1&&(a="0"+a),t+=a.toUpperCase()}return t}const Q=k(5),Ce=()=>k(Q),Oe=[25,50,75,100,125,150,175,200,225,250],Ee=[16,48,80,112,144,160,176,192,208,224];function F(){return Oe[Q.value-1]}function ke(){return Ee[Q.value-1]}const $e=()=>oe(0);var V=(e=>(e.CLICK="click",e.CONTINUE="continue",e))(V||{});const se=le({id:"app-control-store",state:()=>({controlMode:"continue"})}),ge={class:"move-btn"},ye=B({__name:"move",props:{clickCB:{type:Function}},setup(e){const t=se(),s=k([[{ptzType:u.MOVE_LEFT_UP,icon:"iconamoon:arrow-left-2-duotone",iconClass:"rotate-45",btnClass:"active:top-2px"},{ptzType:u.MOVE_UP,icon:"iconamoon:arrow-left-2-duotone",iconClass:"rotate-90",btnClass:"top--12px active:left-2px"},{ptzType:u.MOVE_RIGHT_UP,icon:"iconamoon:arrow-left-2-duotone",iconClass:"rotate-135",btnClass:"active:top-2px"}],[{ptzType:u.MOVE_LEFT,icon:"iconamoon:arrow-left-2-duotone",iconClass:"ml--25px",btnClass:"active:top-2px"},{ptzType:u.STOP,icon:"lets-icons:stop",btnClass:"top-2px"},{ptzType:u.MOVE_RIGHT,icon:"iconamoon:arrow-left-2-duotone",iconClass:"rotate-180 mr--25px",btnClass:"active:top-2px"}],[{ptzType:u.MOVE_LEFT_DOWN,icon:"iconamoon:arrow-left-2-duotone",iconClass:"rotate--45",btnClass:"active:top-2px"},{ptzType:u.MOVE_DOWN,icon:"iconamoon:arrow-left-2-duotone",iconClass:"rotate-270",btnClass:"bottom--10px active:top-8px"},{ptzType:u.MOVE_RIGHT_DOWN,icon:"iconamoon:arrow-left-2-duotone",iconClass:"rotate-225",btnClass:"active:top-2px"}]]);return ie(()=>{t.controlMode===V.CLICK?s.value[1][1]={icon:"mingcute:round-line",btnClass:"top-2px cursor-unset pointer-events-none"}:s.value[1][1]={ptzType:u.STOP,icon:"lets-icons:stop",btnClass:"top-2px"}}),(a,n)=>(d(),S("ul",ge,[(d(!0),S(K,null,j(s.value,(c,g)=>(d(),S("li",{key:g},[(d(!0),S(K,null,j(c,(p,f)=>(d(),C(o(I),{key:f,type:"text",class:w([`${p?.btnClass}`]),onClick:()=>a.clickCB(p.ptzType)},{icon:i(()=>[p.icon==="mingcute:round-line"?(d(),C(o(h),{key:0,color:"#bcbcbc",hoverColor:"#bcbcbc",icon:p.icon,size:30,class:w(["v-text-bottom",`${p?.iconClass}`])},null,8,["icon","class"])):(d(),C(o(h),{key:1,icon:p.icon,size:26,class:w(["v-text-bottom",`${p?.iconClass}`])},null,8,["icon","class"]))]),_:2},1032,["class","onClick"]))),128))]))),128))]))}});const Ie={class:"text-text text-center"},G=B({__name:"compose-btn",props:{clickCB:{type:Function},title:{},direction:{},items:{}},setup(e){return(t,s)=>(d(),C(o(A),{title:t.title},{default:i(()=>[m("div",{class:w(["compose-btn",`${t.direction}`])},[l(o(A),{title:t.items?.first.title},{default:i(()=>[l(o(I),{size:"small",type:"text",onClick:s[0]||(s[0]=()=>t.clickCB(t.items?.first.ptzType))},{icon:i(()=>[t.items?.first.svg?(d(),C(o(J),{key:0,icon:t.items.first.svg,size:"20"},null,8,["icon"])):(d(),C(o(h),{key:1,icon:t.items?.first.icon,size:"20"},null,8,["icon"]))]),_:1})]),_:1},8,["title"]),m("span",Ie,H(t.items?.center),1),l(o(A),{title:t.items?.last.title},{default:i(()=>[l(o(I),{size:"small",type:"text",onClick:s[1]||(s[1]=()=>t.clickCB(t.items?.last.ptzType))},{icon:i(()=>[t.items?.last.svg?(d(),C(o(J),{key:0,icon:t.items.last.svg,size:"20"},null,8,["icon"])):(d(),C(o(h),{key:1,icon:t.items?.last.icon,size:"20"},null,8,["icon"]))]),_:1})]),_:1},8,["title"])],2)]),_:1},8,["title"]))}});const te=B({__name:"single-btn",props:{clickCB:{type:Function},title:{},icon:{},svg:{},ptzType:{}},setup(e){return(t,s)=>(d(),C(o(A),{title:t.title},{default:i(()=>[l(o(I),{class:"single-btn",type:"text",shape:"circle",onClick:s[0]||(s[0]=()=>t.clickCB(t.ptzType))},{icon:i(()=>[t.svg?(d(),C(o(J),{key:0,icon:t.svg,size:"16"},null,8,["icon"])):(d(),C(o(h),{key:1,icon:t.icon,size:"16"},null,8,["icon"]))]),_:1})]),_:1},8,["title"]))}});const Se={class:"speed-btn"},he={class:"speedNum text-text cursor-auto"},Te=B({__name:"speed",setup(e){const t=Ce(),s=(a="plus")=>{a==="plus"?t.value<10&&t.value++:t.value>1&&t.value--};return(a,n)=>(d(),C(o(A),{title:"速度,支持 1-10 "},{default:i(()=>[m("div",Se,[l(o(I),{size:"small",type:"text",disabled:o(t)===1,onClick:n[0]||(n[0]=()=>s("reduce"))},{icon:i(()=>[l(o(h),{icon:"ant-design:minus-outlined",size:"20"})]),_:1},8,["disabled"]),m("span",he,H(o(t)),1),n[2]||(n[2]=m("span",{class:"speedNumBg"}," ",-1)),l(o(I),{size:"small",type:"text",onClick:n[1]||(n[1]=()=>s("plus")),disabled:o(t)===10},{icon:i(()=>[l(o(h),{icon:"ant-design:plus-outlined",size:"20"})]),_:1},8,["disabled"])])]),_:1}))}});const xe={class:"flex justify-between"},we={class:"font-size-18px"},Ae=B({__name:"point",props:{clickCB:{type:Function}},setup(e){const t=[{name:"①",ptzType:"xxx"},{name:"②",ptzType:"xxx"},{name:"③",ptzType:"xxx"},{name:"④",ptzType:"xxx"},{name:"⑤",ptzType:"xxx"},{name:"⑥",ptzType:"xxx"},{name:"⑦",ptzType:"xxx"},{name:"⑧",ptzType:"xxx"}];return(s,a)=>(d(),S("div",xe,[(d(),S(K,null,j(t,(n,c)=>l(o(ce),{key:n.name,trigger:"hover"},{content:i(()=>[m("div",null,[l(o(I),{size:"small",type:"link",onClick:()=>s.clickCB(o(u).POINT_SET,c)},{default:i(()=>a[0]||(a[0]=[R("添加")])),_:2},1032,["onClick"]),l(o(ee),{type:"vertical",class:"m-0"}),l(o(I),{size:"small",type:"link",onClick:()=>s.clickCB(o(u).POINT_CALL,c)},{default:i(()=>a[1]||(a[1]=[R("调用")])),_:2},1032,["onClick"]),l(o(ee),{type:"vertical",class:"m-0"}),l(o(I),{size:"small",type:"link",danger:"",onClick:()=>s.clickCB(o(u).POINT_DEL,c)},{default:i(()=>a[2]||(a[2]=[R("删除")])),_:2},1032,["onClick"])])]),default:i(()=>[l(o(I),{class:"point flex-center",type:"text",shape:"circle",size:"small"},{default:i(()=>[m("span",we,H(n.name),1)]),_:2},1024)]),_:2},1024)),64))]))}});const Be=["disabled"],Z=1200,Ne=B({__name:"broadcast-btn",props:{deviceId:{},channelId:{},apiBaseUrl:{}},setup(e){const t=e,s=k(!1),a=k(!1),n=k(null),c=k(null),g=k(null),p=k(null),f=k(new Uint8Array(0));class N{static encode(r){const _=new Uint8Array(r.length);for(let b=0;b<r.length;b++)_[b]=N.linearToALaw(r[b]);return _}static linearToALaw(r){let M=0,P=0,x=0;return r<0&&(M=128,r=-r),r>32767&&(r=32767),r>=256?(P=N.findExponent(r),x=r>>P+3&15):(P=0,x=r>>4),(M|P<<4|x)^85}static findExponent(r){let _=0;for(_=0;_<8&&!(r<=256<<_);_++);return _}}async function E(){if(!t.deviceId||!t.channelId){U.error("设备ID或通道ID不能为空");return}if(!(s.value||a.value))try{a.value=!0;const r=`${t.apiBaseUrl||window.location.origin}/gb28181/api/broadcast/start`,_=new AbortController,b=setTimeout(()=>_.abort(),3e4),O=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({deviceId:t.deviceId,channelId:t.channelId}),signal:_.signal});if(clearTimeout(b),!O.ok)throw new Error(`广播启动失败: HTTP ${O.status}`);const P=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/gb28181/api/talk/start`;if(n.value=new WebSocket(P),n.value.binaryType="arraybuffer",await new Promise((x,z)=>{if(!n.value)return z(new Error("WebSocket 创建失败"));n.value.onopen=()=>{x()},n.value.onerror=ae=>{console.error("[Broadcast] WebSocket 错误:",ae),z(new Error("WebSocket 连接失败"))},n.value.onclose=()=>{Y()}}),await y(),n.value&&n.value.readyState===WebSocket.OPEN){const x={type:"startBroadcast",deviceId:t.deviceId,channelId:t.channelId};n.value.send(JSON.stringify(x))}s.value=!0,a.value=!1,U.success("语音广播已启动")}catch(v){a.value=!1,v.name==="AbortError"?U.error("广播失败:30秒内未收到设备响应"):U.error(`广播失败: ${v.message}`),console.error("[Broadcast] 启动失败:",v),W()}}async function y(){try{g.value=await navigator.mediaDevices.getUserMedia({audio:{sampleRate:8e3,channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}}),c.value=new AudioContext({sampleRate:8e3});const v=c.value.createMediaStreamSource(g.value),r=`
  2. class PCMProcessor extends AudioWorkletProcessor {
  3. constructor() {
  4. super();
  5. this.bufferSize = 2048;
  6. this.buffer = new Float32Array(this.bufferSize);
  7. this.bufferIndex = 0;
  8. }
  9. process(inputs, outputs, parameters) {
  10. const input = inputs[0];
  11. if (!input || input.length === 0) return true;
  12. const inputChannel = input[0];
  13. for (let i = 0; i < inputChannel.length; i++) {
  14. this.buffer[this.bufferIndex++] = inputChannel[i];
  15. if (this.bufferIndex >= this.bufferSize) {
  16. this.port.postMessage(this.buffer.slice());
  17. this.bufferIndex = 0;
  18. }
  19. }
  20. return true;
  21. }
  22. }
  23. registerProcessor('pcm-processor', PCMProcessor);
  24. `,_=new Blob([r],{type:"application/javascript"}),b=URL.createObjectURL(_);await c.value.audioWorklet.addModule(b),p.value=new AudioWorkletNode(c.value,"pcm-processor"),p.value.port.onmessage=O=>{T(O.data)},v.connect(p.value),p.value.connect(c.value.destination)}catch(v){throw console.error("[Broadcast] 音频采集失败:",v),new Error("无法访问麦克风,请检查权限设置")}}function T(v){if(!s.value||!n.value||n.value.readyState!==WebSocket.OPEN)return;const r=new Int16Array(v.length);for(let O=0;O<v.length;O++){const M=Math.max(-1,Math.min(1,v[O]));r[O]=Math.floor(M*32767)}const _=N.encode(r),b=new Uint8Array(f.value.length+_.length);for(b.set(f.value),b.set(_,f.value.length),f.value=b;f.value.length>=Z;){const O=f.value.slice(0,Z);f.value=f.value.slice(Z),n.value&&n.value.readyState===WebSocket.OPEN&&n.value.send(O)}}async function Y(){if(s.value)try{if(n.value&&n.value.readyState===WebSocket.OPEN){const _={type:"stopBroadcast"};n.value.send(JSON.stringify(_))}const r=`${t.apiBaseUrl||window.location.origin}/gb28181/api/broadcast/stop`;await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({deviceId:t.deviceId,channelId:t.channelId})}),U.success("语音广播已停止")}catch(v){console.error("[Broadcast] 停止失败:",v)}finally{W()}}function W(){s.value=!1,a.value=!1,n.value&&(n.value.close(),n.value=null),p.value&&(p.value.disconnect(),p.value.port.onmessage=null,p.value=null),c.value&&(c.value.close(),c.value=null),g.value&&(g.value.getTracks().forEach(v=>v.stop()),g.value=null),f.value=new Uint8Array(0)}function q(){E()}function $(){s.value&&Y()}return re(()=>{W()}),(v,r)=>(d(),C(o(A),null,{title:i(()=>[R(H(a.value?"正在连接...":s.value?"松开停止喊话":"按住喊话"),1)]),default:i(()=>[m("button",{class:w(["broadcast-btn",{broadcasting:s.value,connecting:a.value}]),disabled:a.value,onMousedown:q,onMouseup:$,onMouseleave:$,onTouchstart:X(q,["prevent"]),onTouchend:X($,["prevent"])},[l(o(h),{icon:s.value?"mdi:microphone":a.value?"mdi:loading":"mdi:microphone-outline",class:w({"animate-spin":a.value}),size:24},null,8,["icon","class"])],42,Be)]),_:1}))}});const Pe=ne(Ne,[["__scopeId","data-v-fe5b1323"]]),Re={class:"text-center mt-15px"},Me={key:0,class:"broadcast-container mt-15px"},Ue={class:"w-140px flex justify-around"},Fe=B({__name:"index",props:{hanldeClick:{type:Function},allowed:{type:Boolean},deviceId:{},channelId:{}},setup(e){const t=e,s={first:{ptzType:u.SHOT_ZOOM_FAR,icon:"ant-design:zoom-in-outlined",title:"镜头放大"},last:{ptzType:u.SHOT_ZOOM_NEAR,icon:"ant-design:zoom-out-outlined",title:"镜头缩小"},center:"镜头"},a={first:{ptzType:u.SHOT_FOCUS_FAR,icon:"icon-park-outline:focus-one",title:"聚焦近"},last:{ptzType:u.SHOT_FOCUS_NEAR,icon:"ph:corners-out-fill",title:"聚焦远"},center:"焦距"},n={first:{ptzType:u.APERTRUE_NEAR,svg:"aperture-near",title:"光圈放大"},last:{ptzType:u.APERTRUE_FAR,svg:"aperture-far",title:"光圈缩小"},center:"光圈"},c=(E,y)=>{const T=oe(E,y);t.hanldeClick(T)},g=k("0"),p=se(),f=ue({get(){return p.controlMode},set(E){p.controlMode=E}}),N=[{label:"连动",value:V.CONTINUE},{label:"点动",value:V.CLICK}];return(E,y)=>(d(),S("div",{class:w(["operate-panel flex flex-col items-center",{notAllowed:!E.allowed}])},[l(Te),m("div",Re,[l(ye,{clickCB:c})]),E.deviceId&&E.channelId?(d(),S("div",Me,[l(Pe,{deviceId:E.deviceId,channelId:E.channelId},null,8,["deviceId","channelId"])])):de("",!0),m("div",Ue,[l(G,{key:"shotZoomBtn",direction:o(L).VERTICAL,items:s,class:"mt-20px",clickCB:c},null,8,["direction"]),l(G,{key:"shotFocusBtn",direction:o(L).VERTICAL,items:a,class:"mt-20px",clickCB:c},null,8,["direction"]),l(G,{key:"apertureBtn",direction:o(L).VERTICAL,items:n,class:"mt-20px",clickCB:c},null,8,["direction"])]),l(o(ve),{activeKey:g.value,"onUpdate:activeKey":y[1]||(y[1]=T=>g.value=T),class:"w-full mt-15px",size:"small"},{default:i(()=>[l(o(D),{key:"0",tab:"控制模式"},{default:i(()=>[l(o(A),null,{title:i(()=>y[2]||(y[2]=[m("p",{class:"mb-4px"},[m("b",null,"连动模式"),R(":点击一次操作后会一直执行,需要点击暂停方可停止上次动作 ")],-1),m("p",{class:"mb-0"},[m("b",null,"点动模式"),R(":点击一次执行一次,会自动停止,大范围移动需要多次点击,可配合较大的速度值操作 ")],-1)])),default:i(()=>[l(o(pe),{value:f.value,"onUpdate:value":y[0]||(y[0]=T=>f.value=T),options:N},null,8,["value"])]),_:1})]),_:1}),l(o(D),{key:"1",tab:"预置位"},{default:i(()=>[l(Ae,{clickCB:c})]),_:1}),l(o(D),{key:"2",tab:"雨刷"},{default:i(()=>[l(o(_e),null,{default:i(()=>[l(te,{title:"雨刷开",svg:"open",ptzType:o(u).WIPER_OPEN,clickCB:c},null,8,["ptzType"]),l(te,{title:"雨刷关",svg:"close",ptzType:o(u).WIPER_CLOSE,clickCB:c},null,8,["ptzType"])]),_:1})]),_:1})]),_:1},8,["activeKey"])],2))}});const ze=ne(Fe,[["__scopeId","data-v-a39d353f"]]);export{ze as D,V as I,$e as p,se as u};
  25. //# sourceMappingURL=index-cb44e888.js.map