【问题标题】:Client-Server Based Audio Live Streaming in java using Socket使用 Socket 在 Java 中基于客户端-服务器的音频实时流式传输
【发布时间】:2017-01-08 18:56:12
【问题描述】:

给定的代码旨在使用 java 套接字在客户端和服务器之间进行实时音频流传输,但问题是当我运行这个项目时,客户端开始录制声音并将其发送到接收器(服务器)端。然后服务器缓冲接收到的声音但不同时播放。但是当客户端关闭时,服务器开始播放声音。请帮助我。我需要该服务器必须同时播放接收到的声音。

\客户端

import java.io.*;
import java.net.*;
import java.sound.sampled.*;
import org.apache.commons.io.IOUtils; 
public class ClientStream{ 
public ClientStream() throws IOException{
    isl.runListener();
}

private IncomingSoundListener isl = new IncomingSoundListener();    
AudioFormat format = getAudioFormat();
InputStream is;
Socket client;
String serverName = "192.168.2.8";
int port=3000;
boolean inVoice = true;


private AudioFormat getAudioFormat(){
    float sampleRate = 16000.0F;
    int sampleSizeBits = 16;
    int channels = 1;
    boolean signed = true;
    boolean bigEndian = false;

    return new AudioFormat(sampleRate, sampleSizeBits, channels, signed, bigEndian);
}
class IncomingSoundListener {
    public void runListener(){
        try{
            System.out.println("Connecting to server:"+serverName+" Port:"+port);
            client = new Socket(serverName,port); 
            System.out.println("Connected to: "+client.getRemoteSocketAddress());
            System.out.println("Listening for incoming audio.");
            DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class,format);
            SourceDataLine speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
            speaker.open(format);
            speaker.start();
            while(inVoice){
                is = client.getInputStream();
                byte[] data = IOUtils.toByteArray(is);  
                ByteArrayInputStream bais = new ByteArrayInputStream(data);
                AudioInputStream ais = new AudioInputStream(bais,format,data.length);
                int bytesRead = 0;
                if((bytesRead = ais.read(data)) != -1){
                    System.out.println("Writing to audio output.");
                    speaker.write(data,0,bytesRead);

   //                 bais.reset();
                }
                ais.close();
                bais.close();

            }
           speaker.drain();
           speaker.close();
           System.out.println("Stopped listening to incoming audio.");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
public static void main(String [] args) throws IOException{
        new ClientStream();
    }

}

\服务器

import java.io.*;
import java.net.*;
import java.sound.sampled.*;
public class ServerStream {
private OutgoingSoudnListener osl = new OutgoingSoudnListener();
boolean outVoice = true;
AudioFormat format = getAudioFormat();

private ServerSocket serverSocket;
Socket server;
private AudioFormat getAudioFormat() {
    float sampleRate = 16000.0F;
    int sampleSizeBits = 16;
    int channels = 1;
    boolean signed = true;
    boolean bigEndian = false;

   return new AudioFormat(sampleRate, sampleSizeBits, channels, signed, bigEndian);
}
public ServerStream() throws IOException{
    try{
        System.out.println("Creating Socket...");
        serverSocket = new ServerSocket(3000);
        osl.runSender();
    }catch(Exception e){
        e.printStackTrace();
    }
}
class OutgoingSoudnListener{
    public void runSender(){
        try{
            server = serverSocket.accept();
            System.out.println("Listening from mic.");
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            DataLine.Info micInfo = new DataLine.Info(TargetDataLine.class,format);
            TargetDataLine mic = (TargetDataLine) AudioSystem.getLine(micInfo);
            mic.open(format);
            System.out.println("Mic open.");
            byte tmpBuff[] = new byte[mic.getBufferSize()/5];
            mic.start();
            while(outVoice) {
                System.out.println("Reading from mic.");
                int count = mic.read(tmpBuff,0,tmpBuff.length);
                if (count > 0){
                    System.out.println("Writing buffer to server.");
                    out.write(tmpBuff, 0, count);
                }               
                }
            mic.drain();
            mic.close();
            System.out.println("Stopped listening from mic.");
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}
public static void main (String args[]) throws IOException{
    new ServerStream();

}

}

【问题讨论】:

    标签: java sockets audio


    【解决方案1】:

    客户端-服务器连接以及随后的Socket 基于 TCP 协议模型。 正如您可以在他们的文档中确认的那样。

    您寻求的是基于 UDP 的DatagramSocket,您可能会遭受包丢失的痛苦,但这就是事情的工作方式。这就是流媒体视频的工作原理,你得到一些,你失去一些。

    现在,您质疑本身,使用 TCP 协议实现时遇到的问题之一是 TCP 基于确认以保持通信同步,如果您的服务器或客户端未能确认,那么您可能会遇到因此,流会卡住。

    【讨论】:

    • 我没有得到,它如何帮助我使我的应用程序正常工作。你是在建议我使用 UDP。
    • 是的,我是。您应该使用 UDP 来建立流式传输通道。我还建议 TCP 中的 ack 可能会导致实时通信的一些延迟。请记住,在 TCP 中不会丢失任何数据包。
    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2020-11-16
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多