index.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. let objSocket;
  2. let initPlay = false;
  3. let wavesurfer = WaveSurfer.create({
  4. container: '#pcmGraph',//容器
  5. waveColor: '#FF55C5',
  6. progressColor: '#00BFBF',
  7. split: false,
  8. minPxPerSec: 8,
  9. height: 128,
  10. // barWidth: 1,
  11. barHeight: 1.5,
  12. splitChannels: false,
  13. audioRate: '1',
  14. plugins: [
  15. WaveSurfer.spectrogram.create({
  16. container: '#stftGraph',
  17. labels: true,
  18. colorMap: colors,
  19. fftSamples: 1024,
  20. height: 256,
  21. }),
  22. ]
  23. });
  24. var player = new PCMPlayer({
  25. // inputCodec: 'Int16',
  26. inputCodec: 'Float32',
  27. channels: 1,
  28. sampleRate: 16000,
  29. flushTime: 3000
  30. });
  31. // 频域频谱图
  32. const chart = new G2.Chart({
  33. container: "fftGraph",
  34. autoFit: true,
  35. padding: [30, 10, 30, 40],
  36. defaultInteractions: []
  37. });
  38. wavesurfer.on("finish", () => {
  39. document.getElementById("playAudio").innerText="播放";
  40. // wavesurfer.pause();
  41. objSocket.onclose();
  42. initSocket("ws://lfxstek.top:28091");
  43. });
  44. window.onload = function () {
  45. initSocket("ws://lfxstek.top:28091");
  46. const btn = document.getElementById("btn");
  47. btn.onclick = sendMessage;
  48. const playBtn = document.getElementById("playAudio");
  49. playBtn.onclick = playAudio;
  50. }
  51. function initSocket(wsUrl) {
  52. // const ws = "ws://" + window.location.hostname + ":8081";
  53. // const ws = "ws://lfxstek.top:8081";
  54. objSocket = new WebSocket(wsUrl);
  55. objSocket.onopen = function () {
  56. console.log("Connected to WebSocket server");
  57. sendMessage();
  58. }
  59. objSocket.onclose = function () {
  60. console.log("Disconnected");
  61. }
  62. objSocket.onmessage = function (evt) {
  63. console.log("onMessage", evt);
  64. drawPCMGraph(evt.data);
  65. document.getElementById("playAudio").innerText="播放";
  66. playAudio();
  67. }
  68. objSocket.onerror = function (evt) {
  69. console.log("Error ocured: " + evt.data);
  70. }
  71. }
  72. function sendMessage() {
  73. if (!objSocket || objSocket.readyState !== 1) {
  74. return;
  75. }
  76. // while (!objSocket || objSocket.readyState !== 1) {
  77. // continue;
  78. // }
  79. objSocket.send("1");
  80. console.log("send message");
  81. }
  82. function drawPCMGraph(data) {
  83. console.log("draw pcm graph");
  84. const reader = new FileReader();
  85. reader.readAsArrayBuffer(data);
  86. reader.onload = () => {
  87. player.feed(reader.result);
  88. var buf = new Uint32Array(reader.result);
  89. const audioDate = new Blob([addWavHeader(buf, 16000, 32, 1)]);
  90. const srcUrl = window.URL.createObjectURL(audioDate);
  91. wavesurfer.load(srcUrl);
  92. //
  93. drawFFTGraph(buf);
  94. wavesurfer.play();
  95. };
  96. }
  97. function playAudio() {
  98. const playBtn = document.getElementById("playAudio");
  99. if (playBtn.innerText === "播放") {
  100. if (!initPlay) {
  101. initPlay =true;
  102. }else{
  103. playBtn.innerText = "暂停";
  104. }
  105. wavesurfer.play();
  106. } else {
  107. playBtn.innerText = "播放";
  108. wavesurfer.pause();
  109. }
  110. }
  111. function drawFFTGraph(data) {
  112. // return
  113. let newFFT = [];
  114. // 找最大值
  115. let max = 0;
  116. for (let i = 0; i < 512; i++) {//data.length
  117. if (i < 10) {
  118. data[i] = 0
  119. }
  120. if (data[i] > max) {
  121. max = data[i];
  122. }
  123. }
  124. // 归一
  125. for (let i = 0; i < 512; i++) {//data.length
  126. newFFT.push({
  127. index: i,
  128. freq: data[i] / max,
  129. })
  130. }
  131. chart.data(newFFT);
  132. chart.scale({
  133. index: {
  134. tickCount: 48,
  135. nice: true,
  136. },
  137. freq: {
  138. tickCount: 7,
  139. nice: true,
  140. }
  141. });
  142. chart.axis('index', {
  143. title: {
  144. text: '(kHz)',
  145. position: 'center',
  146. offset: 25,
  147. style: {
  148. fill: '#9BB7EF',
  149. fontSize: '13'
  150. }
  151. }
  152. })
  153. chart.interval().position("index*freq");
  154. chart.legend(false);
  155. chart.tooltip(false);
  156. chart.render();
  157. }