How to play sound from tcp stream in java

被刻印的时光 ゝ 提交于 2019-12-02 13:09:04

问题


There is another app that writes raw wav file on this socket. The client starts and begins listening to the song which is currently playing.

Socket clientSocket = new Socket("localhost", 9595);
AudioInputStream stream = AudioSystem.getAudioInputStream(clientSocket.getInputStream());

I get javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream

Doc about AudioSystem.getAudioInputStream: "Obtains an audio input stream from the provided input stream. The stream must point to valid audio file data."

How to play sound from a TCP stream? Considering the client could not start listening from beginnig of the music.


回答1:


Opening an AudioInputStream doesn't play the sound coming from this stream. You need to open a Clip to play the sound coming from the stream. I'm not an expert at all, but you should learn how to do it by reading the Java tutorial.




回答2:


import javax.sound.sampled.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class Client {

    public static int PORT = 3000;

    SourceDataLine _speaker;
    InputStream _streamIn;
    Socket _server;
    String _serverName = "127.0.0.1";
    boolean _running = true;

    public Client(String serverName) throws IOException,LineUnavailableException {
        this._serverName = serverName;
        init();
    }

    private void init() throws LineUnavailableException{
        //  specifying the audio format
        AudioFormat _format = new AudioFormat(8000.F,// Sample Rate
                16,     // Size of SampleBits
                1,      // Number of Channels
                true,   // Is Signed?
                false   // Is Big Endian?
        );

        //  creating the DataLine Info for the speaker format
        DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class, _format);

        //  getting the mixer for the speaker
        _speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
        _speaker.open(_format);
    }

    public void Start() {
        try {
            System.out.println("Connecting to server @" + _serverName + ":" + PORT);

            //  creating the socket and connect to the server
            _server = new Socket(_serverName, PORT);
            System.out.println("Connected to: " + _server.getRemoteSocketAddress());

            //  gettting the server stream
            _streamIn = _server.getInputStream();

            _speaker.start();

            byte[] data = new byte[8000];
            System.out.println("Waiting for data...");
            while (_running) {

                //  checking if the data is available to speak
                if (_streamIn.available() <= 0)
                    continue;   //  data not available so continue back to start of loop

                //  count of the data bytes read
                int readCount= _streamIn.read(data, 0, data.length);

                if(readCount > 0){
                    _speaker.write(data, 0, readCount);
                }
            }

            //honestly.... the control never reaches here.
            _speaker.drain();
            _speaker.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Refer to this project for a working TCP audio streaming project: https://github.com/sam016/J-Mic-Stream-Over-Socket/blob/master/Edit 00/

Refer to this specific file to get an idea on how to use TCP stream to play audio: https://github.com/sam016/J-Mic-Stream-Over-Socket/blob/master/Edit%2000/SockMicClient/src/av/Client.java



来源:https://stackoverflow.com/questions/7718602/how-to-play-sound-from-tcp-stream-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!