ventutil.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import { render, h, nextTick } from 'vue';
  2. import LivePlayer from '@liveqing/liveplayer-v3';
  3. import { play } from '../views/vent/monitorManager/balancePressMonitor/balancePress.threejs';
  4. export function toEchartsData(list, option) {
  5. option.legend['data'] = [];
  6. option.yAxis.length = list.length;
  7. option.yAxis.series = list.length;
  8. list.forEach((item: any, index) => {
  9. option.legend['data'].push(`${item['legend']}(${item['unit']})`);
  10. const yAxiObj = {
  11. type: 'value',
  12. position: item['yaxispos'],
  13. axisLabel: { formatter: `{value} ${item['unit']}` },
  14. };
  15. const serieObj = {
  16. name: `${item['legend']}(${item['unit']})`,
  17. type: item['linetype'],
  18. yAxisIndex: item['sort'],
  19. };
  20. if (!option.yAxis[index]) {
  21. option.yAxis[index] = yAxiObj;
  22. } else {
  23. Object.assign(option.yAxis[index], yAxiObj);
  24. }
  25. if (!option.series[index]) {
  26. option.series[index] = serieObj;
  27. } else {
  28. Object.assign(option.series[index], serieObj);
  29. }
  30. });
  31. return option;
  32. }
  33. export function formatNum(data) {
  34. return new Intl.NumberFormat('ja-JP', {
  35. minimumFractionDigits: 2,
  36. maximumFractionDigits: 2,
  37. }).format(data);
  38. }
  39. export function cameraInit(dom, rtspUrl) {
  40. let webRtcServer = undefined;
  41. const ip = VUE_APP_URL.webRtcUrl;
  42. // const ip = '//192.168.183.216:8000';
  43. webRtcServer = new window['WebRtcStreamer'](dom, location.protocol + ip);
  44. if (webRtcServer) webRtcServer.connect(rtspUrl);
  45. return { webRtcServer };
  46. }
  47. // 模型监测加载视频
  48. export function deviceCameraInit(cameraAddrs, player: HTMLElement, webRtcServerList: any[] = []) {
  49. const playerDoms: (HTMLVideoElement | undefined | null)[] = [];
  50. const webRtcServer: any[] = [];
  51. let livePlayerDiv: HTMLElement | null = document.getElementById('LivePlayerBox');
  52. if (livePlayerDiv) {
  53. livePlayerDiv.remove();
  54. livePlayerDiv = null;
  55. }
  56. if (!livePlayerDiv) {
  57. const dom = document.createElement('div');
  58. dom.setAttribute('id', 'LivePlayerBox');
  59. livePlayerDiv = dom;
  60. player.appendChild(livePlayerDiv);
  61. }
  62. const videoParentDomList: (HTMLElement | [string, { name: string; addr: string }])[] = [];
  63. return new Promise((resolve) => {
  64. const playCamrea = () => {
  65. if (cameraAddrs.length > 0) {
  66. const promiseList: Promise<any>[] = [];
  67. cameraAddrs.forEach(async (cameraUrl: { name: string; addr: string }, index) => {
  68. const promise = new Promise(async (childResolve) => {
  69. let cameraNameDom: null | HTMLElement = null;
  70. console.log('摄像头地址--------->', cameraUrl, cameraUrl.addr.startsWith('rtsp://'), livePlayerDiv);
  71. if (cameraUrl.addr && cameraUrl.addr.startsWith('rtsp://')) {
  72. const server = webRtcServerList.shift();
  73. if (server) {
  74. try {
  75. const videoElement = server.videoElement as HTMLVideoElement;
  76. videoElement.volume = 0;
  77. const cameraNameDom = videoElement.parentElement?.getElementsByClassName('video-name')[0];
  78. if (cameraNameDom) cameraNameDom.innerText = cameraUrl.name;
  79. playerDoms.unshift(videoElement);
  80. webRtcServer.unshift(server);
  81. await server.connect(cameraUrl['addr']);
  82. videoElement.play();
  83. childResolve(null);
  84. } catch (error) {
  85. playerDoms.unshift(undefined);
  86. childResolve(null);
  87. }
  88. } else {
  89. const videoParentDom: HTMLElement = document.createElement('div');
  90. videoParentDom.setAttribute('class', 'video-parent');
  91. const videoDom: HTMLVideoElement = document.createElement('video');
  92. videoDom.volume = 0;
  93. videoDom.setAttribute('class', 'rtspVideo');
  94. videoDom.setAttribute('muted', 'muted');
  95. videoDom.setAttribute('poster', '/src/assets/images/vent/noSinge.png');
  96. videoDom.autoplay = true;
  97. videoParentDom.appendChild(videoDom);
  98. cameraNameDom = document.createElement('div');
  99. cameraNameDom.setAttribute('class', 'video-name');
  100. cameraNameDom.innerText = cameraUrl.name;
  101. videoParentDom.appendChild(cameraNameDom);
  102. videoParentDom.addEventListener('dblclick', () => {
  103. if (videoDom.requestFullscreen) {
  104. videoDom.requestFullscreen();
  105. videoDom.play();
  106. }
  107. });
  108. videoParentDomList.push(videoParentDom);
  109. try {
  110. const server = new window['WebRtcStreamer'](videoDom, location.protocol + VUE_APP_URL.webRtcUrl);
  111. webRtcServer.unshift(server);
  112. await server.connect(cameraUrl.addr);
  113. videoDom.play();
  114. playerDoms.unshift(videoDom);
  115. childResolve(null);
  116. } catch (error) {
  117. console.log('WebRtcStreamer 抛出异常!!!!!!');
  118. playerDoms.unshift(null);
  119. childResolve(null);
  120. }
  121. }
  122. } else {
  123. try {
  124. fetch(cameraUrl.addr, {
  125. method: 'get',
  126. mode: 'no-cors',
  127. })
  128. .then(() => {
  129. videoParentDomList.push(['player', cameraUrl]);
  130. childResolve(null);
  131. })
  132. .catch(() => {
  133. videoParentDomList.push(['onPlayer' + index, cameraUrl]);
  134. childResolve(null);
  135. });
  136. } catch (error) {
  137. // console.log('可以捕获到异常吗?????');
  138. childResolve(null);
  139. }
  140. }
  141. });
  142. promiseList.push(promise);
  143. });
  144. Promise.all(promiseList).then(() => {
  145. resolve(null);
  146. });
  147. } else {
  148. resolve(null);
  149. }
  150. };
  151. playCamrea();
  152. }).then(() => {
  153. videoParentDomList.forEach((videoParentDom) => {
  154. if (typeof videoParentDom[0] === 'string') {
  155. const videoDom: HTMLElement = document.createElement('div');
  156. livePlayerDiv?.appendChild(videoDom);
  157. if (videoParentDom[0].startsWith('onPlayer')) {
  158. render(
  159. h(LivePlayer, {
  160. class: 'player',
  161. id: videoParentDom[0],
  162. muted: 'muted',
  163. autoplay: true,
  164. live: true,
  165. videoUrl: videoParentDom[1].addr,
  166. videoTitle: videoParentDom[1].name,
  167. alt: '无信号',
  168. poster: '/src/assets/images/vent/noSinge.png',
  169. }),
  170. videoDom
  171. );
  172. } else {
  173. render(
  174. h(LivePlayer, {
  175. class: 'player',
  176. muted: 'muted',
  177. autoplay: true,
  178. live: true,
  179. videoUrl: videoParentDom[1].addr,
  180. videoTitle: videoParentDom[1].name,
  181. alt: '无信号',
  182. poster: '/src/assets/images/vent/noSinge.png',
  183. }),
  184. videoDom
  185. );
  186. }
  187. } else {
  188. player.appendChild(videoParentDom as Node);
  189. }
  190. });
  191. const players = livePlayerDiv?.getElementsByClassName('player');
  192. if (players && players.length) {
  193. for (let i = 0; i < players.length; i++) {
  194. try {
  195. const isCanPlayer = !players[i].getAttribute('id')?.startsWith('onPlayer');
  196. const dom = players[i].getElementsByTagName('video')[0];
  197. if (dom && isCanPlayer) {
  198. playerDoms.unshift(dom);
  199. } else {
  200. playerDoms.unshift(null);
  201. }
  202. } catch (error) {
  203. console.log('可以捕获到异常吗?????');
  204. playerDoms.unshift(null);
  205. }
  206. }
  207. }
  208. if (webRtcServerList.length > 0) {
  209. for (let i = 0; i < webRtcServerList.length; i++) {
  210. webRtcServerList[i].videoElement.parentElement.remove();
  211. webRtcServerList[i].disconnect();
  212. webRtcServerList[i] = undefined;
  213. }
  214. }
  215. return { webRtcServerList: webRtcServer, playerDoms };
  216. });
  217. }