Explorar o código

feat:小节评分

Joburgess %!s(int64=4) %!d(string=hai) anos
pai
achega
c3012f3df9

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicPitchDetailDto.java

@@ -17,6 +17,9 @@ public class MusicPitchDetailDto {
     @ApiModelProperty("频率Hz")
     private float frequency;
 
+    @ApiModelProperty("小节数")
+    private int measureIndex;
+
     public MusicPitchDetailDto() {
     }
 
@@ -54,4 +57,12 @@ public class MusicPitchDetailDto {
     public void setFrequency(float frequency) {
         this.frequency = frequency;
     }
+
+    public int getMeasureIndex() {
+        return measureIndex;
+    }
+
+    public void setMeasureIndex(int measureIndex) {
+        this.measureIndex = measureIndex;
+    }
 }

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/WebSocketInfo.java

@@ -0,0 +1,30 @@
+package com.ym.mec.biz.dal.dto;
+
+import java.util.HashMap;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/17 0017
+ */
+public class WebSocketInfo {
+
+    private HashMap<String, String> header = new HashMap<>();
+
+    private Object body;
+
+    public HashMap<String, String> getHeader() {
+        return header;
+    }
+
+    public void setHeader(HashMap<String, String> header) {
+        this.header = header;
+    }
+
+    public Object getBody() {
+        return body;
+    }
+
+    public void setBody(Object body) {
+        this.body = body;
+    }
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SoundSocketService.java

@@ -0,0 +1,11 @@
+package com.ym.mec.biz.service;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/6/17 0017
+ */
+public interface SoundSocketService {
+
+    String COMMOND = "commond";
+
+}

+ 50 - 18
mec-teacher/src/main/java/com/ym/mec/teacher/handler/WebSocketHandler.java

@@ -1,13 +1,23 @@
 package com.ym.mec.teacher.handler;
 
+import be.tarsos.dsp.AudioDispatcher;
+import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
+import be.tarsos.dsp.pitch.PitchProcessor;
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dto.AudioRecordConfig;
+import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
 import com.ym.mec.biz.dal.dto.WavHeader;
+import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.service.SoundService;
+import com.ym.mec.biz.service.SoundSocketService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.web.socket.*;
 import org.springframework.web.socket.handler.AbstractWebSocketHandler;
 
+import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioSystem;
 import java.io.*;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -23,8 +33,11 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
 
     public static final Map<String, WebSocketSession> WS_CLIENTS = new ConcurrentHashMap<>();
 
-    private static File file;
-    private static FileOutputStream fos;
+    AudioFormat audioFormat = new AudioFormat(44100, 16, 1, true, false);
+    PitchProcessor.PitchEstimationAlgorithm algo = PitchProcessor.PitchEstimationAlgorithm.FFT_YIN;
+
+    private Map<String, RandomAccessFile> userRandomAccessFileMap = new ConcurrentHashMap<>();
+    private Map<String, MusicPitchDetailDto> userXmlInfoMap = new ConcurrentHashMap<>();
 
     public WebSocketHandler() {
         super();
@@ -36,32 +49,53 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         LOGGER.info("{}上线", phone);
         WS_CLIENTS.put(phone, session);
         super.afterConnectionEstablished(session);
-        file = new File("E:\\Temp\\record.wav");
-        fos = new FileOutputStream(file);
     }
 
     @Override
     public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
-        String phone = session.getPrincipal().getName().split(":")[1];
-        LOGGER.info("{}: {}", phone, message.getPayload());
         super.handleMessage(session, message);
     }
 
     @Override
     protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
         super.handleTextMessage(session, message);
+        String phone = session.getPrincipal().getName().split(":")[1];
+        LOGGER.info("{}: {}", phone, message.getPayload());
+        WebSocketInfo webSocketInfo = JSON.parseObject(message.getPayload(), WebSocketInfo.class);
+
+        String commond = "";
+        if(webSocketInfo.getHeader().containsKey(SoundSocketService.COMMOND)){
+            commond = webSocketInfo.getHeader().get(SoundSocketService.COMMOND);
+        }
+
+        if(message.getPayload().contains("Start")){
+            File file = new File("E:\\Temp\\record"+phone+".wav");
+            userRandomAccessFileMap.put(phone, new RandomAccessFile(file, "rw"));
+        }else if(message.getPayload().contains("End")){
+            createHeader(phone);
+        }
     }
 
     @Override
     protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
         super.handleBinaryMessage(session, message);
-        fos.write(message.getPayload().array());
+        String phone = session.getPrincipal().getName().split(":")[1];
+        if(userRandomAccessFileMap.containsKey(phone)){
+            userRandomAccessFileMap.get(phone).write(message.getPayload().array());
+        }
+        AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), audioFormat, 256, 128);
+        dispatcher.addAudioProcessor(new PitchProcessor(algo, 44100, 256, (pitchDetectionResult, audioEvent) -> {
+            int timeStamp = (int) (audioEvent.getTimeStamp()*1000);
+            float pitch = pitchDetectionResult.getPitch();
+//            LOGGER.info("时间:{},频率:{}", timeStamp, pitch);
+        }));
+        dispatcher.run();
     }
 
     @Override
     protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
         super.handlePongMessage(session, message);
-        LOGGER.debug("心跳信息:{}", new String(message.getPayload().array(), "utf-8"));
+        LOGGER.info("心跳信息:{}", new String(message.getPayload().array(), "utf-8"));
     }
 
     @Override
@@ -72,7 +106,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         LOGGER.info("发生了错误,移除客户端: {}", phone);
         session.close();
         WS_CLIENTS.remove(phone);
-        createHeader();
+        createHeader(phone);
     }
 
     @Override
@@ -81,7 +115,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}离线", phone);
         WS_CLIENTS.remove(phone);
-        createHeader();
+        createHeader(phone);
     }
 
     @Override
@@ -89,16 +123,14 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         return super.supportsPartialMessages();
     }
 
-    private void createHeader() throws IOException {
-        fos.close();
-        RandomAccessFile randomAccessFile;
-        try {
-            randomAccessFile = new RandomAccessFile(file, "rw");
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException(e);
+    private void createHeader(String phone) throws IOException {
+        if(!userRandomAccessFileMap.containsKey(phone)){
+            return;
         }
+        RandomAccessFile randomAccessFile = userRandomAccessFileMap.get(phone);
         randomAccessFile.seek(0);
-        randomAccessFile.write(new WavHeader(new AudioRecordConfig(), file.length()).toBytes());
+        randomAccessFile.write(new WavHeader(new AudioRecordConfig(), randomAccessFile.length()).toBytes());
         randomAccessFile.close();
+        userRandomAccessFileMap.remove(phone);
     }
 }