简体   繁体   English

如何从javascript发送音频blob到java spring服务器?

[英]How to send audio blob from javascript to java spring server?

I'm recording some audio data in my javascript client using RecordRTC . 我正在使用RecordRTC在我的javascript客户端录制一些音频数据。 I want to send this audio data to my Spring RestController via WebSockets . 我想通过WebSockets将这个音频数据发送到我的Spring RestController

After recording I have a blob object in my javascript client: Blob {size: 65859, type: "audio/webm"} 录制后我在我的javascript客户端中有一个blob对象: Blob {size: 65859, type: "audio/webm"}

I tried to convert this blob to an ArrayBuffer object using FileReader which looks like this ArrayBuffer {} byteLength: 65859 我尝试使用FileReader将此blob转换为ArrayBuffer对象,看起来像这个ArrayBuffer {} byteLength: 65859

My javascript code where I send the ArrayBuffer looks like this: 我发送ArrayBuffer的javascript代码如下所示:

    const reader = new FileReader();
    reader.addEventListener( 'loadend', () => {
        console.log( 'readerResult', reader.result );
        this.stompClient.send( "/app/hello", {}, reader.result );
    } );

    this.recorder.stopRecording(() => {
        const blob = this.recorder.getBlob();
        reader.readAsArrayBuffer( blob );
        console.log( "blob", blob );
    } );

My WebSocket endpoint in my Spring Boot application looks like this: 我的Spring Boot应用程序中的WebSocket端点如下所示:

@MessageMapping("/hello")
public void stream(byte[] input) throws Exception {
    System.out.println("incoming message ...");
    System.out.println(input);
    System.out.println(input.length);
}

And this is the console output: 这是控制台输出:

incoming message ...
[B@6142acb4
20

The bytearray in my server contains only 20 bytes, which looks like only metadata are transfered? 我的服务器中的bytearray只包含20个字节,看起来只有元数据被传输?

How can I transfer the recorded Blob to my Spring server and create a (webm) file of it? 如何将录制的Blob传输到我的Spring服务器并创建它的(webm)文件? Do I have to change the parameter of my endpoint? 我是否必须更改端点的参数?

I would suggest you to create base64 string for your audio blob using below code: 我建议你使用下面的代码为你的音频blob创建base64字符串:

 var reader = new FileReader();
 var base64data;
 reader.readAsDataURL(blob); 
 reader.onloadend = function() {
      base64data = reader.result;                
      console.log(base64data);
  }

You will get base64 string like this : 你会得到这样的base64字符串:

data:audio/webm;base64,T2dnUwACAAAAAAAAAAAyzN3N....

Now in your backend change your stream method code to this: 现在在您的后端将您的流方法代码更改为:

@MessageMapping("/hello")
public void stream(String base64Audio) throws Exception {
        System.out.println("incoming message ...");
        Decoder decoder = Base64.getDecoder();
        byte[] decodedByte = decoder.decode(base64Audio.split(",")[1]);
        FileOutputStream fos = new FileOutputStream("MyAudio.webm");
        fos.write(decodedByte);
        fos.close();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM