ventutil.ts 8.1 KB

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