我的目标是在GSM / UMTS /
LTE网络中建立一键通聊天应用程序;最初,我想使用多播地址和对等网络而不会使服务器过载。不幸的是,经过深入的调查,我发现GSM / UMTS /
LTE网络中不允许组播,因此我必须使用服务器来退回VoIP数据包。我不太喜欢这种解决方案,因为我必须使服务器超载,但是没有找到更好的解决方案。如果您有替代解决方案,将非常感激…
因此,我必须将VoIP从Android客户端发送到服务器(PC),反之亦然。服务器采用Java语言,必须先接收VoIP数据包,然后再将VoIP数据包发送到其他N个客户端。服务器是VoIP数据包的保镖。
我开发了代码,但是没有用;我没有任何错误,只是我的VoIP服务非常差:我松了很多东西,听到的声音非常杂乱……错误在哪里?我想它应该在服务器代码中;服务器只是获取数据包并重新发送它们,而不知道它们是RTP上的VoIP。
如下请见
预先谢谢你,福斯托
//用于将VOIP发送到服务器的ANDROID代码
//Attribute definition
private static final AudioCodec myAudioCodec_COSTANTE = AudioCodec.PCMU ;
private static final int myAudioGroupTX_COSTANTE = AudioGroup.MODE_NORMAL ;
private static final int myAudioGroupRX_COSTANTE = AudioGroup.MODE_NORMAL ;
private static final int myRtpStreamTX_COSTANTE = RtpStream.MODE_SEND_ONLY ;
private static final int myRtpStreamRX_COSTANTE = RtpStream.MODE_RECEIVE_ONLY ;
private static final int myAudioManagerTX_COSTANTE = AudioManager.MODE_IN_COMMUNICATION;
private static final int myAudioManagerRX_COSTANTE = AudioManager.MODE_IN_COMMUNICATION;
//Method called for VoIP trasmission
myAudioStream = new AudioStream(localClientIP);
myAudioGroup = new AudioGroup();
myAudioManager = (AudioManager) myContext.getSystemService(Context.AUDIO_SERVICE);
myAudioGroup.setMode(myAudioGroupTX_COSTANTE);
myAudioStream.join(null);
myAudioStream.setCodec(myAudioCodec_COSTANTE);
myAudioStream.setMode(myRtpStreamTX_COSTANTE);
myAudioStream.associate(ipaddress_Server, port_Server)
myAudioStream.join(myAudioGroup);
myAudioManager.setMode(myAudioManagerTX_COSTANTE);
myAudioManager.setSpeakerphoneOn(false);
myAudioManager.setMicrophoneMute(false);
// JAVA服务器代码,用于接收来自ANDROID的VOIP并将其重新发送给服务器
DatagramSocket datagramSocket_RX_VoIP= new DatagramSocket();
DatagramSocket datagramSocket_TX_VoIP= new DatagramSocket();
int unicast_port_TX_VoIP = 5000 ;
String unicast_ip_TX_VoIP = "192.168.0.3";
Thread t = new Thread(new Runnable() {
public void run() {
try {
DatagramPacket myPacket;
while (true) {
myPacket = ManagePacket.initializePacket(); //Function to prepare the packe ; the problem is not here!!!
datagramSocket_RX_VoIP.receive(myPacket);
InetAddress ppp = InetAddress.getByName(unicast_ip_TX_VoIP);
myPacket.setAddress(ppp);
myPacket.setPort( unicast_port_TX_VoIP ) ;
datagramSocket_TX_VoIP.send(myPacket);
}
} catch (Exception ex) {
log.debug("Exception: " + ex.getMessage(), ex);
}
}
});
t.start();