简体   繁体   English

将音频(WAV)发送到Web并使用Java中的套接字播放

[英]Send Audio (WAV) to web and play using sockets in Java

I have been stuck on this for awhile, and I have scoured the internet, and can't find any solutions. 我已经坚持了一段时间,并且搜寻了互联网,找不到任何解决方案。 Pretty much I am trying to send a wav, using https://github.com/mrniko/netty-socketio . 我几乎正在尝试使用https://github.com/mrniko/netty-socketio发送wav。 I do this by converting the WAV to binary (after reading it in) and then pushing it to the front end using the socket 为此,我将WAV转换为二进制文件(在读入之后),然后使用套接字将其推到前端

The issue lays that the data is sent, it is converted to a blob, but the blob won't play, the browser siting a Uncaught (in promise) DOMException: Failed to load because no supported source was found. 问题在于,已发送数据,将其转换为Blob,但是该Blob无法播放,浏览器将其定位为Uncaught(承诺)DOMException:无法加载,因为未找到受支持的源。 error. 错误。

Any ideas? 有任何想法吗? There are multiple possible points of failure, but I can't figure it out. 可能存在多个故障点,但我无法弄清楚。

Server.JAVA 服务器.JAVA

File file = new File("src/main/resources/test.wav");
    AudioInputStream in;
    try{
        try{
            in = AudioSystem.getAudioInputStream(file);
        }catch (IOException e) {
            System.out.println("Audio io error");
            e.printStackTrace();     
            return;
        }
    }catch (UnsupportedAudioFileException e) {
        System.out.println("Bad Audio File error");
        e.printStackTrace();
        return;
    }
    //CONVERT TO BYTE ARRAY
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int nRead;
    byte[] data = new byte[16384];
    try{
        while ((nRead = in.read(data, 0, data.length)) != -1) {
          buffer.write(data, 0, nRead);
        }
    }catch (java.io.IOException e) {
        System.out.println("Can't read into buffer");
        e.printStackTrace();
        return;
    }

    final byte[] audio = buffer.toByteArray();
    //SERVER
    Configuration config = new Configuration();
    config.setHostname("localhost");
    config.setPort(9092);
    config.setMaxFramePayloadLength(1024 * 1024);
    config.setMaxHttpContentLength(1024 * 1024);

    final SocketIOServer server = new SocketIOServer(config);

    server.addEventListener("updateCoordinates", byte[].class, new DataListener<byte[]>() {
        @Override
        public void onData(SocketIOClient client, byte[] data, AckRequest ackRequest) {
            //System.out.println("Just gonna send it");
            client.sendEvent("sound", audio);
        }
    });

    server.start();

    Thread.sleep(Integer.MAX_VALUE);

    server.stop();

Client.js Client.js

var socket =  io.connect('http://localhost:9092');

socket.emit('updateCoordinates');

socket.on('sound', function(file) {
    console.log(file)
    console.log("recieved");
    var arrayBuffer = new Uint8Array(file).buffer;
    console.log(arrayBuffer);
    var blob = new Blob([arrayBuffer], {type : 'audio/wav'});
    console.log(blob);
    const audioUrl = URL.createObjectURL(blob);
    const audio = new Audio(audioUrl);
    audio.play();

});

Alright. 好的。 I figured it out. 我想到了。 The AudioSystem strips the wav of important metadata, so the front end could not read it. AudioSystem剥离了重要的元数据,因此前端无法读取它。 Updated code for the server working is 服务器工作的更新代码为

Path path = Paths.get("src/main/resources/test.wav");
    final byte[] audio;
    try{
      audio  = Files.readAllBytes(path);
    }
    catch (IOException e) {
            System.out.println("Audio io error");
            e.printStackTrace();     
            return;
        }
    //SERVER
    Configuration config = new Configuration();
    config.setHostname("localhost");
    config.setPort(9092);
    config.setMaxFramePayloadLength(1024 * 1024);
    config.setMaxHttpContentLength(1024 * 1024);

    final SocketIOServer server = new SocketIOServer(config);

    server.addEventListener("updateCoordinates", byte[].class, new DataListener<byte[]>() {
        @Override
        public void onData(SocketIOClient client, byte[] data, AckRequest ackRequest) {
            //System.out.println("Just gonna send it");
            client.sendEvent("sound", audio);
        }
    });

    server.start();

    Thread.sleep(Integer.MAX_VALUE);

    server.stop();
}

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

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