Как воспроизвести звук из потока TCP в Java

Есть еще одно приложение, которое записывает необработанный файл wav в этот сокет. Клиент запускается и начинает слушать песню, которая играет в данный момент.

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

Я получаю javax.sound.sampled.UnsupportedAudioFileException: не удалось получить входной аудиопоток из входного потока

Документ об AudioSystem.getAudioInputStream: «Получает входной аудиопоток из предоставленного входного потока. Поток должен указывать на допустимые данные аудиофайла».

Как воспроизвести звук из TCP-потока? Учитывая, что клиент не мог начать слушать музыку с самого начала.


person CelinHC    schedule 10.10.2011    source источник
comment
Вам нужно добавить больше деталей. Есть много разных способов, по которым это может не сработать. Вы слышите статические помехи? Вообще ничего? Вы получаете какие-то исключения?   -  person MusiGenesis    schedule 11.10.2011
comment
@MusiGenesis Обновлено! Спасибо!   -  person CelinHC    schedule 11.10.2011


Ответы (2)


Открытие AudioInputStream не воспроизводит звук, исходящий из этого потока. Вам нужно открыть клип, чтобы воспроизводить звук, исходящий из потока. Я совсем не эксперт, но вы должны научиться это делать, прочитав руководство по Java.

person JB Nizet    schedule 10.10.2011

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();
        }
    }
}

Обратитесь к этому проекту, чтобы узнать о рабочем проекте потоковой передачи звука TCP: https://github.com/sam016/J-Mic-Stream-Over-Socket/blob/master/Edit%2000/SockMicClient/src/av/Client.java

Обратитесь к этому конкретному файлу, чтобы получить представление о том, как использовать поток TCP для воспроизведения звука: https://github.com/sam016/J-Mic-Stream-Over-Socket/blob/master/Edit%2000/SockMicClient/src/av/Client.java

person sam    schedule 01.11.2016