如何解决从服务器到android接收UDP数据包
所以我正在创建一个流媒体应用程序。将有两个客户端(Android设备)和一个服务器(java服务器)。现在,客户端1 (Android A)正在使用DataGramSocket
将音频数据包发送到服务器,我已经对自己进行了测试,一切都很好。但是现在的问题是,我不知道如何将音频数据包从服务器发送到客户端2 (Android B)进行播放。我已经尝试了几种方法,但无济于事。好吧,我知道我可以直接将音频数据包从Android A直接发送到Android B,但是我不想这样做,因为这不是必需的流程。
Server.java:
import java.io.ByteArrayInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.sourceDataLine;
public class Server {
AudioInputStream audioInputStream;
static AudioInputStream ais;
static AudioFormat format;
static boolean status = true;
static int port = 50005;
static int cport = 50005;
static int sampleRate = 16000;
static int buffSize = 1280;
static InetAddress client_dest;
static DatagramSocket clientsocket;
public static void main(String args[]) throws Exception {
System.out.println("Server started...");
DatagramSocket serverSocket = new DatagramSocket(port);
clientsocket = new DatagramSocket();
client_dest = InetAddress.getByName("10.90.79.50");
byte[] receiveData = new byte[1280];
// ( 1280 for 16 000Hz and 3584 for 44 100Hz (use AudioRecord.getMinBufferSize(sampleRate,channelConfig,audioFormat) to get the correct size)
/*
AudioFormat(float sampleRate,int sampleSizeInBits,int channels,boolean signed,boolean bigEndian)*/
format = new AudioFormat(sampleRate,16,1,true,false);
while (status == true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
serverSocket.receive(receivePacket);
ByteArrayInputStream baiss = new ByteArrayInputStream(
receivePacket.getData());
ais = new AudioInputStream(baiss,format,receivePacket.getLength());
// A thread solve the problem of chunky audio
new Thread(new Runnable() {
@Override
public void run() {
stream(receivePacket.getData());
// toSpeaker(receivePacket.getData());
}
}).start();
}
}
public static void toSpeaker(byte soundbytes[]) {
try {
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,format);
SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(format);
FloatControl volumeControl = (FloatControl) sourceDataLine.getControl(FloatControl.Type.MASTER_GAIN);
volumeControl.setValue(volumeControl.getMaximum());
sourceDataLine.start();
sourceDataLine.open(format);
sourceDataLine.start();
System.out.println("format? :" + sourceDataLine.getFormat());
sourceDataLine.write(soundbytes,soundbytes.length);
// System.out.println(soundbytes.toString());
sourceDataLine.drain();
sourceDataLine.close();
} catch (Exception e) {
System.out.println("Not working in speakers...");
e.printstacktrace();
}
}
public static void stream(byte soundbytes[]) {
try {
DatagramPacket packet;
//putting soundbytes in the packet
packet = new DatagramPacket (soundbytes,soundbytes.length,client_dest,cport);
clientsocket.send(packet);
System.out.println(packet.toString());
} catch (Exception e) {
e.printstacktrace();
System.out.println("IOException");
}
}
}
我正在使用stream()
函数将数据包从服务器发送回客户端2(Android B),但是我不知道我的(Android B)如何从服务器接收数据包,或者我错了我正在使用DataGramSocket
来接收数据包。因此,如果有其他选择,我准备尝试一下。
注意:我正在本地进行测试。 Java服务器在我的网络上,它已成功从客户端1接收音频数据包,但主要问题是我无法将这些数据包发送回客户端2(Android B)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。