123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- import { render, h, nextTick } from 'vue';
- import LivePlayer from '@liveqing/liveplayer-v3';
- import _ from 'lodash-es';
- export function toEchartsData(list, option) {
- option.legend['data'] = [];
- option.yAxis.length = list.length;
- option.yAxis.series = list.length;
- list.forEach((item: any, index) => {
- option.legend['data'].push(`${item['legend']}(${item['unit']})`);
- const yAxiObj = {
- type: 'value',
- position: item['yaxispos'],
- axisLabel: { formatter: `{value} ${item['unit']}` },
- };
- const serieObj = {
- name: `${item['legend']}(${item['unit']})`,
- type: item['linetype'],
- yAxisIndex: item['sort'],
- };
- if (!option.yAxis[index]) {
- option.yAxis[index] = yAxiObj;
- } else {
- Object.assign(option.yAxis[index], yAxiObj);
- }
- if (!option.series[index]) {
- option.series[index] = serieObj;
- } else {
- Object.assign(option.series[index], serieObj);
- }
- });
- return option;
- }
- export function formatNum(data, len = 2) {
- return new Intl.NumberFormat('ja-JP', {
- minimumFractionDigits: len,
- maximumFractionDigits: len,
- }).format(data);
- }
- export function cameraInit(dom, rtspUrl) {
- let webRtcServer = undefined;
- // const ip = '//192.168.183.216:8000';
- webRtcServer = new window['WebRtcStreamer'](
- dom,
- VUE_APP_URL.webRtcUrl.startsWith('/') ? location.protocol + VUE_APP_URL.webRtcUrl : VUE_APP_URL.webRtcUrl
- );
- if (webRtcServer) webRtcServer.connect(rtspUrl);
- return { webRtcServer };
- }
- export function toTree(idName = 'id', parentIdName: 'parentId', titleName = 'name') {
- function toTreeNode(data) {
- return {
- id: data[idName],
- parentId: data[parentIdName],
- title: data[titleName],
- };
- }
- // 步骤2和3: 构建树
- function buildTree(array) {
- // 创建ID映射
- const idMap = {};
- array.forEach((item) => {
- const node = toTreeNode(item);
- idMap[node.id] = node;
- });
- // 构建父子关系
- array.forEach((item) => {
- const node = idMap[item.id];
- if (item.parentId !== '0') {
- const parentNode = idMap[item.parentId];
- if (parentNode) {
- if (!parentNode.children) parentNode.children = [];
- parentNode.children.push(node);
- }
- }
- });
- // 步骤4: 处理结果并返回根节点
- const roots = [];
- array.forEach((item) => {
- const node = idMap[item.id];
- if (node.parentId === '0') {
- roots.push(node);
- }
- });
- return roots;
- }
- return { buildTree };
- }
- // 模型监测加载视频
- export 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);
- try {
- const server = new window['WebRtcStreamer'](
- videoDom,
- VUE_APP_URL.webRtcUrl.startsWith('/') ? location.protocol + VUE_APP_URL.webRtcUrl : 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') {
- const videoDom: HTMLElement = document.createElement('div');
- livePlayerDiv?.appendChild(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 };
- });
- }
- /**
- * 功能类似 lodash.get 但是当取值为 null 时也直接返回默认值
- */
- export const get: typeof _.get = (o, p, defaultValue = '-') => {
- const d = _.get(o, p, defaultValue);
- return d === null ? defaultValue : d;
- };
|