|
@@ -46,7 +46,8 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
|
|
|
|
|
|
private final BigDecimal oneHundred = new BigDecimal(100);
|
|
|
|
|
|
- private final BigDecimal tenPercent = new BigDecimal(0.1);
|
|
|
+ //检测偏移时长的最终时间
|
|
|
+ private final int endCheckOffsetTime = 500;
|
|
|
|
|
|
private final float simpleRate = 44100;
|
|
|
private int simpleSize = 1024;
|
|
@@ -157,18 +158,44 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
|
|
|
if(Objects.isNull(userSoundInfoMap.get(phone).getAccessFile())){
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
double recordTime = userSoundInfoMap.get(phone).getAccessFile().length()/(audioFormat.getFrameSize()*audioFormat.getFrameRate())*1000;
|
|
|
+
|
|
|
userSoundInfoMap.get(phone).setMeasureStartTime(recordTime);
|
|
|
userSoundInfoMap.get(phone).getRecordMeasurePithInfo().addAll(recordInfo);
|
|
|
+
|
|
|
+ //如果是第一小节,需要计算出录音与播放不同步导致的空白时间偏移量
|
|
|
+ if(userSoundInfoMap.get(phone).getOffsetTime()<=0&&recordTime<endCheckOffsetTime){
|
|
|
+ int hasPitchNum = 0;
|
|
|
+ for (MusicPitchDetailDto ri : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
|
|
|
+ if(hasPitchNum<=0){
|
|
|
+ userSoundInfoMap.get(phone).setOffsetTime(ri.getTimeStamp());
|
|
|
+ }
|
|
|
+ if(ri.getFrequency()>0){
|
|
|
+ hasPitchNum++;
|
|
|
+ }else{
|
|
|
+ hasPitchNum=0;
|
|
|
+ }
|
|
|
+ if(hasPitchNum>=3){
|
|
|
+ LOGGER.info("偏移时间:{}", userSoundInfoMap.get(phone).getOffsetTime());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(hasPitchNum<3){
|
|
|
+ userSoundInfoMap.get(phone).setOffsetTime(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(userSoundInfoMap.get(phone).getOffsetTime()<=0&&recordTime<endCheckOffsetTime){
|
|
|
+ return;
|
|
|
+ }
|
|
|
for (Map.Entry<Integer, Integer> userMeasureEndTimeMapEntry : userSoundInfoMap.get(phone).getMeasureEndTime().entrySet()) {
|
|
|
- if(recordTime>userMeasureEndTimeMapEntry.getValue()){
|
|
|
-// LOGGER.info("评测时间:{}", recordTime);
|
|
|
+ if((recordTime - userSoundInfoMap.get(phone).getOffsetTime())>userMeasureEndTimeMapEntry.getValue()){
|
|
|
measureCompare(phone, userMeasureEndTimeMapEntry.getKey());
|
|
|
userSoundInfoMap.get(phone).getMeasureEndTime().remove(userMeasureEndTimeMapEntry.getKey());
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -269,20 +296,6 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
|
|
|
|
|
|
int totalCompareNum = userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex).size();
|
|
|
|
|
|
- //如果是第一小节,需要计算出录音与播放不同步导致的空白时间偏移量
|
|
|
- if(measureIndex==0){
|
|
|
- int hasPitchNum = 0;
|
|
|
- for (MusicPitchDetailDto recordInfo : userSoundInfoMap.get(phone).getRecordMeasurePithInfo()) {
|
|
|
- if(recordInfo.getFrequency()>0){
|
|
|
- hasPitchNum++;
|
|
|
- }
|
|
|
- if(hasPitchNum>3){
|
|
|
- userSoundInfoMap.get(phone).setOffsetTime(recordInfo.getTimeStamp());
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
for (MusicPitchDetailDto musicXmlInfo : userSoundInfoMap.get(phone).getMeasureXmlInfoMap().get(measureIndex)) {
|
|
|
int startTimeStamp = musicXmlInfo.getTimeStamp()-100 + userSoundInfoMap.get(phone).getOffsetTime();
|
|
|
int endTimeStamp = musicXmlInfo.getTimeStamp()+musicXmlInfo.getDuration()-100 + userSoundInfoMap.get(phone).getOffsetTime();
|
|
@@ -300,7 +313,7 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
|
|
|
if(recordInfo.getTimeStamp()<startTimeStamp||recordInfo.getTimeStamp()>endTimeStamp){
|
|
|
continue;
|
|
|
}
|
|
|
- LOGGER.info("{}频率({}-{}):{}, {}", recordInfo.getTimeStamp(), startTimeStamp, endTimeStamp, musicXmlInfo.getFrequency(), recordInfo.getFrequency());
|
|
|
+// LOGGER.info("{}频率({}-{}):{}, {}", recordInfo.getTimeStamp(), startTimeStamp, endTimeStamp, musicXmlInfo.getFrequency(), recordInfo.getFrequency());
|
|
|
compareNum++;
|
|
|
//如果在最低有效频率以下则跳过
|
|
|
if(recordInfo.getFrequency()<minValidFrequency&&musicXmlInfo.getFrequency()!=-1){
|