From ee333d64a7cd49df676dee9e2a9ee06e872ee3f9 Mon Sep 17 00:00:00 2001 From: cph Date: Thu, 10 Oct 2024 19:30:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E4=BB=A3=E7=A0=81=E5=89=A9?= =?UTF-8?q?=E4=BD=99=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chrome-plugin-easemusic/content.css | 14 ++-- chrome-plugin-easemusic/content.js | 67 ++++++++++--------- .../cph/musicbackend/aspect/LoginAspect.java | 2 +- .../controller/MusicController.java | 2 +- .../src/main/resources/application.yaml | 10 +-- 5 files changed, 49 insertions(+), 46 deletions(-) diff --git a/chrome-plugin-easemusic/content.css b/chrome-plugin-easemusic/content.css index a3b5d4e..24337f3 100644 --- a/chrome-plugin-easemusic/content.css +++ b/chrome-plugin-easemusic/content.css @@ -3,13 +3,13 @@ position: fixed; top: 10%; right: 0; - width: 25%; - height: 90%; + width: 15%; + height: 50%; background: white; border: 1px solid #ccc; z-index: 9999; display: none; - box-shadow: 0 0 10px rgba(0,0,0,0.1); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); overflow: hidden; pointer-events: auto; } @@ -42,7 +42,8 @@ cursor: pointer; font-size: 20px; transition: background-color 0.3s; - flex: 1; /* 让按钮平均分配空间 */ + flex: 1; + /* 让按钮平均分配空间 */ } #ease-music-player button:hover { @@ -57,7 +58,8 @@ /* 如果需要,可以为关闭按钮添加特定样式 */ #ease-music-close { - background-color: #f44336; /* 红色背景 */ + background-color: #f44336; + /* 红色背景 */ } #ease-music-close:hover { @@ -69,4 +71,4 @@ background-color: #f0f0f0; padding: 2.5px; font-size: 7px; -} +} \ No newline at end of file diff --git a/chrome-plugin-easemusic/content.js b/chrome-plugin-easemusic/content.js index 3210a33..2d7b095 100644 --- a/chrome-plugin-easemusic/content.js +++ b/chrome-plugin-easemusic/content.js @@ -61,25 +61,17 @@ function toggleRecording() { } function startRecording() { - console.log('startRecording function called'); // 添加这行来调试 + console.log('startRecording function called'); audioChunks = []; - // 创建一个新的 AudioContext,设置采样率为 16000Hz - const audioContext = new (window.AudioContext || window.webkitAudioContext)({ - sampleRate: 16000 - }); - - // 创建一个 MediaStreamDestination - const destination = audioContext.createMediaStreamDestination(); - - // 获取页面中所有的 audio 和 video 元素 - const mediaElements = document.querySelectorAll('audio, video'); + navigator.mediaDevices.getUserMedia({ audio: true }) + .then(stream => { + const audioContext = new (window.AudioContext || window.webkitAudioContext)({ + sampleRate: 16000 + }); - mediaElements.forEach(element => { - if (element.captureStream) { - // 捕获媒体元素的音频流 - const stream = element.captureStream(); const source = audioContext.createMediaStreamSource(stream); + const destination = audioContext.createMediaStreamDestination(); // 创建一个 ScriptProcessorNode 用于重采样 const bufferSize = 4096; @@ -107,26 +99,26 @@ function startRecording() { source.connect(scriptNode); scriptNode.connect(destination); - } - }); - // 创建 MediaRecorder - mediaRecorder = new MediaRecorder(destination.stream); + mediaRecorder = new MediaRecorder(destination.stream); - mediaRecorder.ondataavailable = event => { - audioChunks.push(event.data); - }; - - mediaRecorder.onstop = () => { - const audioBlob = new Blob(audioChunks, { type: 'audio/webm' }); - convertToWav(audioBlob).then(wavBlob => { - sendAudioToServer(wavBlob); - }); - }; + mediaRecorder.ondataavailable = event => { + audioChunks.push(event.data); + }; - mediaRecorder.start(); + mediaRecorder.onstop = () => { + const audioBlob = new Blob(audioChunks, { type: 'audio/webm' }); + convertToWav(audioBlob).then(wavBlob => { + sendAudioToServer(wavBlob); + }); + }; - console.log('Recording started, actual sample rate:', audioContext.sampleRate); + mediaRecorder.start(); + console.log('Recording started, actual sample rate:', audioContext.sampleRate); + }) + .catch(error => { + console.error('Error accessing microphone:', error); + }); } function stopRecording() { @@ -148,16 +140,21 @@ function convertToWav(webmBlob) { fileReader.onload = function (event) { const audioData = event.target.result; + console.log('音频数据大小:', audioData.byteLength, '字节'); audioContext.decodeAudioData(audioData, function (buffer) { + console.log('音频解码成功,采样率:', buffer.sampleRate); const wavBlob = audioBufferToWav(buffer); resolve(wavBlob); }, function (e) { - reject('音频解码失败'); + console.error('音频解码失败:', e); + // 如果解码失败,我们可以尝试直接发送原始的 WebM 数据 + resolve(new Blob([audioData], { type: 'audio/webm' })); }); }; fileReader.onerror = function (error) { + console.error('文件读取失败:', error); reject('文件读取失败'); }; @@ -262,8 +259,12 @@ function writeFloat32(output, offset, input) { function sendAudioToServer(audioBlob) { const formData = new FormData(); var timestamp = Date.parse(new Date()); - formData.append('audio', audioBlob, timestamp + '.wav'); + const fileName = audioBlob.type === 'audio/wav' ? `${timestamp}.wav` : `${timestamp}.webm`; + formData.append('audio', audioBlob, fileName); + console.log('发送到服务器的文件类型:', audioBlob.type); + console.log('文件大小:', audioBlob.size, '字节'); + fetch('https://app102.acapp.acwing.com.cn/api/uploadAudio', { method: 'POST', mode: 'cors', diff --git a/musicBackend/src/main/java/com/cph/musicbackend/aspect/LoginAspect.java b/musicBackend/src/main/java/com/cph/musicbackend/aspect/LoginAspect.java index 8fd17cf..a31303a 100644 --- a/musicBackend/src/main/java/com/cph/musicbackend/aspect/LoginAspect.java +++ b/musicBackend/src/main/java/com/cph/musicbackend/aspect/LoginAspect.java @@ -63,7 +63,7 @@ public Object doAroundService(ProceedingJoinPoint joinPoint) throws Throwable { if(ipAddress == null){ userMapper.insert(user); List musics = musicMapper.selectList(new QueryWrapper() - .like("url", "https://app102.acapp.acwing.com.cn").last("limit 10").orderByDesc("id")); + .like("url", "https://app102.acapp.acwing.com.cn").last("limit 20").orderByDesc("id")); user.setMusics(musics); userMapper.addDefaultMusics(user, new Date()); UserContext.setCurrentUser(user); diff --git a/musicBackend/src/main/java/com/cph/musicbackend/controller/MusicController.java b/musicBackend/src/main/java/com/cph/musicbackend/controller/MusicController.java index b481864..f355af1 100644 --- a/musicBackend/src/main/java/com/cph/musicbackend/controller/MusicController.java +++ b/musicBackend/src/main/java/com/cph/musicbackend/controller/MusicController.java @@ -119,7 +119,7 @@ public Object recongnizeMusic(@RequestParam("audio") MultipartFile file) { File destFile = new File(dir.getAbsolutePath() + File.separator + fileName); file.transferTo(destFile); Map resultMap = acrCloudUtil.recongizeByFile(dir.getAbsolutePath() + File.separator + fileName); - musicMapper.insert(new Music().setArtist(resultMap.get("artist")).setTitle(resultMap.get("title"))); + if(resultMap.containsKey("artist") && resultMap.containsKey("title")) musicMapper.insert(new Music().setArtist(resultMap.get("artist")).setTitle(resultMap.get("title"))); return resultMap; // return MusicRecUtil.recongnizeFile(dir.getAbsolutePath() + File.separator + fileName); diff --git a/musicBackend/src/main/resources/application.yaml b/musicBackend/src/main/resources/application.yaml index dfd9c42..7686d0f 100644 --- a/musicBackend/src/main/resources/application.yaml +++ b/musicBackend/src/main/resources/application.yaml @@ -34,14 +34,14 @@ mybatis-plus: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mapper-locations: classpath:mybatis/*.xml # -#file: -# upload: -# path: /root/nginx/share/nginx/media/ -# url: https://app102.acapp.acwing.com.cn/media/ file: upload: - path: D://audio// + path: /root/nginx/share/nginx/media/ url: https://app102.acapp.acwing.com.cn/media/ +#file: +# upload: +# path: D://audio// +# url: https://app102.acapp.acwing.com.cn/media/ logging: level: