|  | @@ -0,0 +1,227 @@
 | 
	
		
			
				|  |  | +import { defHttp } from '/@/utils/http/axios';
 | 
	
		
			
				|  |  | +import { render, h, nextTick } from 'vue';
 | 
	
		
			
				|  |  | +import LivePlayer from '@liveqing/liveplayer-v3';
 | 
	
		
			
				|  |  | +import { useDrag } from '../event/useDrag';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export function useCamera() {
 | 
	
		
			
				|  |  | +  const cameraList = (params) => defHttp.get({ url: '/safety/ventanalyCamera/list', params });
 | 
	
		
			
				|  |  | +  const cameraAddrList = (params) => defHttp.post({ url: '/ventanaly-device/camera/info', params });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  let webRtcServer = <any[]>[];
 | 
	
		
			
				|  |  | +  let playerDoms = <(HTMLVideoElement | undefined | null)[]>[];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async function getCamera(deviceid, parentPlayerDom?) {
 | 
	
		
			
				|  |  | +    if (!parentPlayerDom) {
 | 
	
		
			
				|  |  | +      parentPlayerDom = document.createElement('div');
 | 
	
		
			
				|  |  | +      parentPlayerDom.setAttribute('style', `top:0px; left: 0px; width: 100%; height: 100%; position: fixed; z-index: 999;`);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    const res = await cameraList({ deviceid });
 | 
	
		
			
				|  |  | +    const cameras: [] = res.records || [];
 | 
	
		
			
				|  |  | +    let cameraAddrs: any[] = [],
 | 
	
		
			
				|  |  | +      cameraNames: string[] = [];
 | 
	
		
			
				|  |  | +    if (cameras.length > 0) {
 | 
	
		
			
				|  |  | +      cameras.forEach((item) => {
 | 
	
		
			
				|  |  | +        if (item['devicekind'] == 'toRtsp' || item['devicekind'] == 'toHLS') {
 | 
	
		
			
				|  |  | +          cameraNames.push(item['name']);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          cameraAddrs.push({ name: item['name'], addr: item['addr'] });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (cameraNames.length > 0) {
 | 
	
		
			
				|  |  | +      // 请求接口从装备院拿数据
 | 
	
		
			
				|  |  | +      const addrs: string[] = await cameraAddrList({ cameraNameList: cameraNames });
 | 
	
		
			
				|  |  | +      for (let i = 0; i < addrs.length; i++) {
 | 
	
		
			
				|  |  | +        cameraAddrs.push({ name: '摄像头' + i, addr: addrs[i] });
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const obj = await deviceCameraInit(cameraAddrs, parentPlayerDom, webRtcServer);
 | 
	
		
			
				|  |  | +    webRtcServer = obj.webRtcServerList;
 | 
	
		
			
				|  |  | +    playerDoms = obj.playerDoms;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  function deviceCameraInit(cameraAddrs, player: HTMLElement, webRtcServerList: any[] = []) {
 | 
	
		
			
				|  |  | +    const playerDoms: (HTMLVideoElement | undefined | null)[] = [];
 | 
	
		
			
				|  |  | +    const webRtcServer: any[] = [];
 | 
	
		
			
				|  |  | +    let livePlayerDiv: HTMLElement | null = document.getElementById('LivePlayerBox');
 | 
	
		
			
				|  |  | +    if (livePlayerDiv) {
 | 
	
		
			
				|  |  | +      livePlayerDiv.remove();
 | 
	
		
			
				|  |  | +      livePlayerDiv = null;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (!livePlayerDiv) {
 | 
	
		
			
				|  |  | +      const dom = document.createElement('div');
 | 
	
		
			
				|  |  | +      dom.setAttribute('id', 'LivePlayerBox');
 | 
	
		
			
				|  |  | +      livePlayerDiv = dom;
 | 
	
		
			
				|  |  | +      player.appendChild(livePlayerDiv);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    const videoParentDomList: (HTMLElement | [string, { name: string; addr: string }])[] = [];
 | 
	
		
			
				|  |  | +    return new Promise((resolve) => {
 | 
	
		
			
				|  |  | +      const playCamrea = () => {
 | 
	
		
			
				|  |  | +        if (cameraAddrs.length > 0) {
 | 
	
		
			
				|  |  | +          const promiseList: Promise<any>[] = [];
 | 
	
		
			
				|  |  | +          cameraAddrs.forEach(async (cameraUrl: { name: string; addr: string }, index) => {
 | 
	
		
			
				|  |  | +            const promise = new Promise(async (childResolve) => {
 | 
	
		
			
				|  |  | +              let cameraNameDom: null | HTMLElement = null;
 | 
	
		
			
				|  |  | +              console.log('摄像头地址--------->', cameraUrl, cameraUrl.addr.startsWith('rtsp://'), livePlayerDiv);
 | 
	
		
			
				|  |  | +              if (cameraUrl.addr && cameraUrl.addr.startsWith('rtsp://')) {
 | 
	
		
			
				|  |  | +                const server = webRtcServerList.shift();
 | 
	
		
			
				|  |  | +                if (server) {
 | 
	
		
			
				|  |  | +                  try {
 | 
	
		
			
				|  |  | +                    const videoElement = server.videoElement as HTMLVideoElement;
 | 
	
		
			
				|  |  | +                    videoElement.volume = 0;
 | 
	
		
			
				|  |  | +                    const cameraNameDom = videoElement.parentElement?.getElementsByClassName('video-name')[0];
 | 
	
		
			
				|  |  | +                    if (cameraNameDom) cameraNameDom.innerText = cameraUrl.name;
 | 
	
		
			
				|  |  | +                    playerDoms.unshift(videoElement);
 | 
	
		
			
				|  |  | +                    webRtcServer.unshift(server);
 | 
	
		
			
				|  |  | +                    await server.connect(cameraUrl['addr']);
 | 
	
		
			
				|  |  | +                    videoElement.play();
 | 
	
		
			
				|  |  | +                    childResolve(null);
 | 
	
		
			
				|  |  | +                  } catch (error) {
 | 
	
		
			
				|  |  | +                    playerDoms.unshift(undefined);
 | 
	
		
			
				|  |  | +                    childResolve(null);
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                  const videoParentDom: HTMLElement = document.createElement('div');
 | 
	
		
			
				|  |  | +                  videoParentDom.setAttribute('class', 'video-parent');
 | 
	
		
			
				|  |  | +                  const videoDom: HTMLVideoElement = document.createElement('video');
 | 
	
		
			
				|  |  | +                  videoDom.volume = 0;
 | 
	
		
			
				|  |  | +                  videoDom.setAttribute('class', 'rtspVideo');
 | 
	
		
			
				|  |  | +                  videoDom.setAttribute('muted', 'muted');
 | 
	
		
			
				|  |  | +                  videoDom.setAttribute('poster', '/src/assets/images/vent/noSinge.png');
 | 
	
		
			
				|  |  | +                  videoDom.autoplay = true;
 | 
	
		
			
				|  |  | +                  videoParentDom.appendChild(videoDom);
 | 
	
		
			
				|  |  | +                  cameraNameDom = document.createElement('div');
 | 
	
		
			
				|  |  | +                  cameraNameDom.setAttribute('class', 'video-name');
 | 
	
		
			
				|  |  | +                  cameraNameDom.innerText = cameraUrl.name;
 | 
	
		
			
				|  |  | +                  videoParentDom.appendChild(cameraNameDom);
 | 
	
		
			
				|  |  | +                  videoParentDom.addEventListener('dblclick', () => {
 | 
	
		
			
				|  |  | +                    if (videoDom.requestFullscreen) {
 | 
	
		
			
				|  |  | +                      videoDom.requestFullscreen();
 | 
	
		
			
				|  |  | +                      videoDom.play();
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                  videoParentDomList.push(videoParentDom);
 | 
	
		
			
				|  |  | +                  livePlayerDiv?.appendChild(videoParentDom);
 | 
	
		
			
				|  |  | +                  try {
 | 
	
		
			
				|  |  | +                    const server = new window['WebRtcStreamer'](videoDom, location.protocol + VUE_APP_URL.webRtcUrl);
 | 
	
		
			
				|  |  | +                    webRtcServer.unshift(server);
 | 
	
		
			
				|  |  | +                    await server.connect(cameraUrl.addr);
 | 
	
		
			
				|  |  | +                    videoDom.play();
 | 
	
		
			
				|  |  | +                    playerDoms.unshift(videoDom);
 | 
	
		
			
				|  |  | +                    childResolve(null);
 | 
	
		
			
				|  |  | +                  } catch (error) {
 | 
	
		
			
				|  |  | +                    console.log('WebRtcStreamer 抛出异常!!!!!!');
 | 
	
		
			
				|  |  | +                    playerDoms.unshift(null);
 | 
	
		
			
				|  |  | +                    childResolve(null);
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              } else {
 | 
	
		
			
				|  |  | +                try {
 | 
	
		
			
				|  |  | +                  fetch(cameraUrl.addr, {
 | 
	
		
			
				|  |  | +                    method: 'get',
 | 
	
		
			
				|  |  | +                    mode: 'no-cors',
 | 
	
		
			
				|  |  | +                  })
 | 
	
		
			
				|  |  | +                    .then(() => {
 | 
	
		
			
				|  |  | +                      videoParentDomList.push(['player', cameraUrl]);
 | 
	
		
			
				|  |  | +                      childResolve(null);
 | 
	
		
			
				|  |  | +                    })
 | 
	
		
			
				|  |  | +                    .catch(() => {
 | 
	
		
			
				|  |  | +                      videoParentDomList.push(['onPlayer' + index, cameraUrl]);
 | 
	
		
			
				|  |  | +                      childResolve(null);
 | 
	
		
			
				|  |  | +                    });
 | 
	
		
			
				|  |  | +                } catch (error) {
 | 
	
		
			
				|  |  | +                  // console.log('可以捕获到异常吗?????');
 | 
	
		
			
				|  |  | +                  childResolve(null);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +            promiseList.push(promise);
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +          Promise.all(promiseList).then(() => {
 | 
	
		
			
				|  |  | +            resolve(null);
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          resolve(null);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      playCamrea();
 | 
	
		
			
				|  |  | +    }).then(() => {
 | 
	
		
			
				|  |  | +      videoParentDomList.forEach((videoParentDom) => {
 | 
	
		
			
				|  |  | +        if (typeof videoParentDom[0] === 'string' && livePlayerDiv) {
 | 
	
		
			
				|  |  | +          const videoDom: HTMLElement = document.createElement('div');
 | 
	
		
			
				|  |  | +          videoDom.setAttribute('class', 'liveVideo');
 | 
	
		
			
				|  |  | +          livePlayerDiv?.appendChild(videoDom);
 | 
	
		
			
				|  |  | +          useDrag(videoDom);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          if (videoParentDom[0].startsWith('onPlayer')) {
 | 
	
		
			
				|  |  | +            render(
 | 
	
		
			
				|  |  | +              h(LivePlayer, {
 | 
	
		
			
				|  |  | +                class: 'player',
 | 
	
		
			
				|  |  | +                id: videoParentDom[0],
 | 
	
		
			
				|  |  | +                muted: 'muted',
 | 
	
		
			
				|  |  | +                autoplay: true,
 | 
	
		
			
				|  |  | +                live: true,
 | 
	
		
			
				|  |  | +                videoUrl: videoParentDom[1].addr,
 | 
	
		
			
				|  |  | +                videoTitle: videoParentDom[1].name,
 | 
	
		
			
				|  |  | +                alt: '无信号',
 | 
	
		
			
				|  |  | +                poster: '/src/assets/images/vent/noSinge.png',
 | 
	
		
			
				|  |  | +              }),
 | 
	
		
			
				|  |  | +              videoDom
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            render(
 | 
	
		
			
				|  |  | +              h(LivePlayer, {
 | 
	
		
			
				|  |  | +                class: 'player',
 | 
	
		
			
				|  |  | +                muted: 'muted',
 | 
	
		
			
				|  |  | +                autoplay: true,
 | 
	
		
			
				|  |  | +                live: true,
 | 
	
		
			
				|  |  | +                videoUrl: videoParentDom[1].addr,
 | 
	
		
			
				|  |  | +                videoTitle: videoParentDom[1].name,
 | 
	
		
			
				|  |  | +                alt: '无信号',
 | 
	
		
			
				|  |  | +                poster: '/src/assets/images/vent/noSinge.png',
 | 
	
		
			
				|  |  | +              }),
 | 
	
		
			
				|  |  | +              videoDom
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          player.appendChild(videoParentDom as Node);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const players = livePlayerDiv?.getElementsByClassName('player');
 | 
	
		
			
				|  |  | +      if (players && players.length) {
 | 
	
		
			
				|  |  | +        for (let i = 0; i < players.length; i++) {
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  | +            const isCanPlayer = !players[i].getAttribute('id')?.startsWith('onPlayer');
 | 
	
		
			
				|  |  | +            const dom = players[i].getElementsByTagName('video')[0];
 | 
	
		
			
				|  |  | +            if (dom && isCanPlayer) {
 | 
	
		
			
				|  |  | +              playerDoms.unshift(dom);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +              playerDoms.unshift(null);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          } catch (error) {
 | 
	
		
			
				|  |  | +            console.log('可以捕获到异常吗?????');
 | 
	
		
			
				|  |  | +            playerDoms.unshift(null);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      if (webRtcServerList.length > 0) {
 | 
	
		
			
				|  |  | +        for (let i = 0; i < webRtcServerList.length; i++) {
 | 
	
		
			
				|  |  | +          webRtcServerList[i].videoElement.parentElement.remove();
 | 
	
		
			
				|  |  | +          webRtcServerList[i].disconnect();
 | 
	
		
			
				|  |  | +          webRtcServerList[i] = undefined;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return { webRtcServerList: webRtcServer, playerDoms };
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return {
 | 
	
		
			
				|  |  | +    getCamera,
 | 
	
		
			
				|  |  | +    webRtcServer,
 | 
	
		
			
				|  |  | +    playerDoms,
 | 
	
		
			
				|  |  | +    deviceCameraInit,
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +}
 |