index.html 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <meta http-equiv="pragma" content="no-cache">
  6. <title>节点实时播放</title>
  7. <link rel="stylesheet" type="text/css" href="./css/index.css" />
  8. </head>
  9. <body>
  10. <table>
  11. <tbody>
  12. <tr>
  13. <input id="ws_url" type="text" value="ws://10.138.6.221:28001">
  14. </tr>
  15. <tr>
  16. <input id="ws_msg" type="text" value="57">
  17. </tr>
  18. </tbody>
  19. </table>
  20. <div class="container">
  21. <button onclick="connectWS()" id="conn_btn">连接</button>
  22. <button onclick="startPlay()" id="play_btn">播放</button>
  23. <button onclick="stopPlay()" id="stop_btn">停止</button>
  24. <button onclick="startPlay2()" id="play_btn">播放2</button>
  25. <button onclick="startPlay()">播放3</button>
  26. <!-- <button id="btn">获取数据</button>
  27. <button id="playAudio">播放</button> -->
  28. <div class="pcmGraph_wrapper">
  29. <span class="wrapper_span">时域波纹图</span>
  30. <div id="pcmGraph" style="background: #0e2855;"></div>
  31. </div>
  32. <div class="wrapper">
  33. <span class="wrapper_span">时频域声纹图</span>
  34. <div id="stftGraph"></div>
  35. <span class="wrapper_span">频域频谱图</span>
  36. <div id="fftGraph"></div>
  37. </div>
  38. <div class="wrapper">
  39. </div>
  40. </div>
  41. <script src="./js/pcm_player.js"></script>
  42. <!--script src="https://gw.alipayobjects.com/os/lib/antv/g2/4.2.0/dist/g2.min.js"></script-->
  43. <script src="./js/g2.min.js"></script>
  44. <!-- <script src="https://cdn.jsdelivr.net/npm/js-base64@3.7.2/base64.min.js"></script>
  45. <script src="./pcm_to_wav.js"></script> -->
  46. <script src="./js/wavesurfer.js"></script>
  47. <script src="./js/wavesurfer.spectrogram.min.js"></script>
  48. <script type="text/javascript" src="./js/addWavHeader.js"></script>
  49. <script type="text/javascript" src="./js/colors.js"></script>
  50. <script type="text/javascript" src="./js/init.js"></script>
  51. <script type="text/javascript" src="./js/processing.js"></script>
  52. <script type="text/javascript" src="./js/dsp.js"></script>
  53. <script>
  54. //xieqian js
  55. let samples = 16000;
  56. // 频域频谱图
  57. const chart = new G2.Chart({
  58. container: "fftGraph",
  59. autoFit: true,
  60. padding: [30, 10, 30, 40],
  61. defaultInteractions: []
  62. });
  63. //New pcm player
  64. var player = new PCMPlayer({
  65. // inputCodec: 'Int16',
  66. inputCodec: 'Float32',
  67. channels: 1,
  68. sampleRate: samples,
  69. flushTime: 1000
  70. });
  71. let wavesurfer = WaveSurfer.create({
  72. container: '#pcmGraph',//容器
  73. waveColor: '#FF55C5',
  74. progressColor: '#00BFBF',
  75. split: false,
  76. minPxPerSec: 18,
  77. audioContext: player.audioCtx,
  78. drawingContextAttributes: {
  79. desynchronized: false
  80. },
  81. height: 128,
  82. // barWidth: 0.8,
  83. barHeight: 13,
  84. splitChannels: false,
  85. audioRate: '1',
  86. plugins: [
  87. WaveSurfer.spectrogram.create({
  88. container: '#stftGraph',
  89. labels: true,
  90. colorMap: colors,
  91. fftSamples: 1024,
  92. // height: 400,
  93. frequencyMax:samples/2,
  94. }),
  95. ]
  96. });
  97. function drawFFTGraph(data) {
  98. // return
  99. let newFFT = [];
  100. // 找最大值
  101. let max = 0;
  102. for (let i = 0; i < 1024; i++) {//data.length
  103. if (i < 10) {
  104. data[i] = 0
  105. }
  106. if (data[i] > max) {
  107. max = data[i];
  108. }
  109. }
  110. // 归一
  111. for (let i = 0; i < 1024; i++) {//data.length
  112. newFFT.push({
  113. index: i,
  114. freq: data[i] / max,
  115. })
  116. }
  117. chart.data(newFFT);
  118. chart.scale({
  119. index: {
  120. tickCount: 48,
  121. nice: true,
  122. },
  123. freq: {
  124. tickCount: 7,
  125. nice: true,
  126. }
  127. });
  128. chart.axis('index', {
  129. title: {
  130. text: '(kHz)',
  131. position: 'center',
  132. offset: 25,
  133. style: {
  134. fill: '#9BB7EF',
  135. fontSize: '13'
  136. }
  137. }
  138. })
  139. chart.interval().position("index*freq");
  140. chart.legend(false);
  141. chart.tooltip(false);
  142. chart.render();
  143. }
  144. // jiangkai js
  145. // play command value
  146. var play_cmd = document.getElementById("ws_msg").value;
  147. var stop_cmd = "stop";
  148. // var isPlay = false
  149. var connBtn = document.getElementById("conn_btn");
  150. var playBtn = document.getElementById("play_btn");
  151. var stopBtn = document.getElementById("stop_btn");
  152. playBtn.setAttribute('disabled', 'disabled');
  153. stopBtn.setAttribute('disabled', 'disabled');
  154. var objSocket;
  155. function connectWS() {
  156. //测试
  157. var wsServer = document.getElementById("ws_url").value;
  158. /**
  159. WebSocket服务连接
  160. */
  161. objSocket = new WebSocket(wsServer)
  162. objSocket.onopen = function (evt) {
  163. onOpen(evt)
  164. }
  165. objSocket.onclose = function (evt) {
  166. onClose(evt)
  167. }
  168. objSocket.onmessage = function (evt) {
  169. onMessage(evt)
  170. }
  171. objSocket.onerror = function (evt) {
  172. onError(evt)
  173. }
  174. connBtn.setAttribute('disabled', 'disabled');
  175. }
  176. function onOpen(evt) {
  177. console.log('Connected to WebSocket server.');
  178. playBtn.removeAttribute('disabled');
  179. stopBtn.removeAttribute('disabled');
  180. }
  181. function onClose(evt) {
  182. console.log('Disconnected')
  183. playBtn.setAttribute('disabled', 'disabled');
  184. stopBtn.setAttribute('disabled', 'disabled');
  185. connBtn.removeAttribute('disabled');
  186. }
  187. function onError(evt) {
  188. alert('Error occured: ' + evt.data);
  189. playBtn.setAttribute('disabled', 'disabled');
  190. stopBtn.setAttribute('disabled', 'disabled');
  191. connBtn.removeAttribute('disabled');
  192. }
  193. function onMessage(evt) {
  194. console.log(wavesurfer,"@xq");
  195. //websocket返回数据信息处理
  196. // console.log('Retrieved data from server: ' + evt.data.size)
  197. if (evt.data.size > 10) {
  198. var reader = new FileReader(); //文件阅读器
  199. reader.readAsArrayBuffer(evt.data); //读取成ArrayBuffer对象
  200. reader.onload = function () {
  201. //读取完毕
  202. // Now feed PCM data into player getting from websocket or ajax whatever the transport you are using.Accept ArrayBuffer or TypedArray
  203. // 接收PCM格式的原始数据,ArrayBuffer 类型或者 TypedArray 类型
  204. // player.feed(this.result);
  205. let input = new Float32Array(this.result);
  206. // 数据全部左移,使得小数点前有足够的整数部分, 然后取整
  207. let buf = new Int32Array(input.length);
  208. for (var i = 0; i < input.length; i++) {
  209. // buf[i] = input[i] * 10000000000;//100000000000
  210. buf[i] = input[i] * 5000000000;
  211. buf[i] = parseInt(buf[i]);
  212. }
  213. let uintBuf = new Uint32Array(buf);
  214. const audioDate = new Blob([addWavHeader(uintBuf, samples, 32, 2)]);
  215. wavesurfer.loadBlob(audioDate);
  216. drawFFTGraph(uintBuf);
  217. }
  218. setTimeout('objSocket.send(play_cmd)', 10000);
  219. }
  220. else {
  221. setTimeout('objSocket.send(play_cmd)', 10000);
  222. }
  223. }
  224. //发送消息
  225. function startPlay() {
  226. play_cmd = document.getElementById("ws_msg").value;
  227. var ar=[53,54,55,57];
  228. let i=Math.floor(Math.random()*4);
  229. play_cmd=ar[i]
  230. objSocket.send(play_cmd);
  231. playBtn.setAttribute('disabled', 'disabled');
  232. }
  233. // //李兆基2 10.30.1.88
  234. // const baseUrl="http://10.30.1.88"
  235. // const baseUrls="ws://10.30.1.88"
  236. // const baseApi = baseUrl+":11086";
  237. // const baseResources = baseUrl+":9000";
  238. // const baseWs = baseUrls+":11086/ws";
  239. // const baseVideo = "10.30.1.88:10087"
  240. // const baseVioce = baseUrl+":11086/video"
  241. // const blueThemeMap = baseUrl+":9000/map/blue/foshan/"; // 蓝色地图
  242. // const greenThemeMap = baseUrl+":9000/map/green/foshan/"// //绿色地图
  243. // const mapCenter = [113.2576, 22.8383]; //[113.111836,23.066335]
  244. [57,53,54,55]
  245. //发送消息
  246. function startPlay2() {
  247. wavesurfer.setPlaybackRate(8)
  248. wavesurfer.setVolume(100)
  249. wavesurfer.play();
  250. }
  251. //关闭连接
  252. function stopPlay() {
  253. // isPlay = false;
  254. player.destroy();
  255. if (objSocket.readyState === WebSocket.OPEN) {
  256. objSocket.send("close");
  257. objSocket.close(1000, "Disconnect");
  258. }
  259. playBtn.removeAttribute('disabled');
  260. }
  261. </script>
  262. </body>
  263. </html>