【问题标题】:Sending audio recording from browser to Server Java with byte []使用字节 [] 将音频记录从浏览器发送到服务器 Java
【发布时间】:2024-01-24 00:50:01
【问题描述】:

我一直在尝试将录制的音频发送到如下所示的控制器方法:

JS

$scope.convertBlobToArrayBuffer = function (audioBlob) {
    var fileReader = new FileReader();
    fileReader.onload = function() {
            $scope.saveRecordingToServer( this.result );
    };
    fileReader.readAsArrayBuffer(audioBlob);
}

$scope.saveRecordingToServer = function (audioArrayBuffer) {
    var bytes = new Uint8Array(audioArrayBuffer);
    $http({
        method: 'POST',
        url: '/upload',
        data: { data: bytes }
    }).then(function (data) {
            console.log(data);
        }, function (error) {
            console.log('Call failed with error: ', error);
        }
    );
}

Java:

@PostMapping("/upload")
@ResponseBody
public void upload(@RequestBody byte[] bytearray) throws UnsupportedAudioFileException {
    String fileName ="test"+new Date().getTime()+".wav";
    String filePath = rootLocation + fileName;

    try {
        InputStream b_in = new ByteArrayInputStream(bytearray);
        AudioFormat format = new AudioFormat(48000, 16, 1, true, false);
        AudioInputStream stream = new AudioInputStream(b_in, format,
                bytearray.length);
        File file = new File(filePath);
        AudioSystem.write(stream,javax.sound.sampled.AudioFileFormat.Type.WAVE, file);
        System.out.println("File saved: " + file.getName() + ", bytes: "
                + bytearray.length);

    } catch (IOException ex) {
        System.err.println(ex);
    }
}

最初我尝试发送 arraybuffer,结果是一个空白的 wav 文件。 然后我将其更改为 Uint8Array。有了这个,我得到了一个带有一些噪音的 wav 文件。此外,我的录音是大约 10 秒的音频,而 wav 文件的长度超过 2 分钟。

【问题讨论】:

    标签: javascript java audio-recording


    【解决方案1】:

    尝试使用 Base64 编码的字符串将 byte[] 发送到服务器。我没有使用 Spring MVC,所以不能说它是如何处理这个问题的,但是对于 Jersey 和 Jackson,Base64 编码格式是默认用于与 REST API 进行 byte[] 通信的默认格式。

    【讨论】:

    • 如果您可以向我发送对您有帮助的代码参考。你是怎么做到的,你的 java 方法签名是什么?
    • 我不知道很多角度,所以不会深入探讨。此链接将帮助您使用客户端代码link
      对于服务器端代码,将您的方法更改为将 "application/json" 作为内容类型和方法,如
      public void upload(@RequestBody Data data) throws UnsupportedAudioFileException
      其中数据是一个简单的 POJO一个字段byte[] bytes
    • js 链接没有任何可接受的答案,您建议哪种方法?
    • 我建议这样做function _arrayBufferToBase64( buffer ){ var binary = ''; var bytes = new Uint8Array( buffer ); var len = bytes.byteLength; for (var i = 0; i < len; i++) { binary += String.fromCharCode( bytes[ i ] ); } return window.btoa( binary ); } 你已经在做var bytes = new Uint8Array(audioArrayBuffer);,只需使用那些bytes 并在之后实现上述代码以获得你的字节的base64 表示。
    最近更新 更多