ventutil.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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. videoParentDomList.push(videoParentDom);
  103. try {
  104. const server = new window['WebRtcStreamer'](videoDom, location.protocol + VUE_APP_URL.webRtcUrl);
  105. webRtcServer.unshift(server);
  106. await server.connect(cameraUrl.addr);
  107. videoDom.play();
  108. playerDoms.unshift(videoDom);
  109. childResolve(null);
  110. } catch (error) {
  111. console.log('WebRtcStreamer 抛出异常!!!!!!');
  112. playerDoms.unshift(null);
  113. childResolve(null);
  114. }
  115. }
  116. } else {
  117. try {
  118. fetch(cameraUrl.addr)
  119. .then(() => {
  120. videoParentDomList.push(['player', cameraUrl]);
  121. childResolve(null);
  122. })
  123. .catch(() => {
  124. videoParentDomList.push(['onPlayer' + index, cameraUrl]);
  125. childResolve(null);
  126. });
  127. } catch (error) {
  128. // console.log('可以捕获到异常吗?????');
  129. childResolve(null);
  130. }
  131. }
  132. });
  133. promiseList.push(promise);
  134. });
  135. Promise.all(promiseList).then(() => {
  136. resolve(null);
  137. });
  138. } else {
  139. resolve(null);
  140. }
  141. };
  142. playCamrea();
  143. }).then(() => {
  144. videoParentDomList.forEach((videoParentDom) => {
  145. if (typeof videoParentDom[0] === 'string') {
  146. if (videoParentDom[0].startsWith('onPlayer')) {
  147. render(
  148. h(LivePlayer, {
  149. class: 'player',
  150. id: videoParentDom[0],
  151. muted: 'muted',
  152. autoplay: true,
  153. live: true,
  154. videoUrl: videoParentDom[1].addr,
  155. videoTitle: videoParentDom[1].name,
  156. alt: '无信号',
  157. poster: '/src/assets/images/vent/noSinge.png',
  158. }),
  159. livePlayerDiv
  160. );
  161. } else {
  162. render(
  163. h(LivePlayer, {
  164. class: 'player',
  165. muted: 'muted',
  166. autoplay: true,
  167. live: true,
  168. videoUrl: videoParentDom[1].addr,
  169. videoTitle: videoParentDom[1].name,
  170. alt: '无信号',
  171. poster: '/src/assets/images/vent/noSinge.png',
  172. }),
  173. livePlayerDiv
  174. );
  175. }
  176. } else {
  177. player.appendChild(videoParentDom as Node);
  178. }
  179. });
  180. const players = livePlayerDiv?.getElementsByClassName('player');
  181. if (players && players.length) {
  182. for (let i = 0; i < players.length; i++) {
  183. try {
  184. const isCanPlayer = !players[i].getAttribute('id')?.startsWith('onPlayer');
  185. const dom = players[i].getElementsByTagName('video')[0];
  186. if (dom && isCanPlayer) {
  187. playerDoms.unshift(dom);
  188. } else {
  189. playerDoms.unshift(null);
  190. }
  191. } catch (error) {
  192. console.log('可以捕获到异常吗?????');
  193. playerDoms.unshift(null);
  194. }
  195. }
  196. }
  197. if (webRtcServerList.length > 0) {
  198. for (let i = 0; i < webRtcServerList.length; i++) {
  199. webRtcServerList[i].videoElement.parentElement.remove();
  200. webRtcServerList[i].disconnect();
  201. webRtcServerList[i] = undefined;
  202. }
  203. }
  204. return { webRtcServerList: webRtcServer, playerDoms };
  205. });
  206. }