बनाने में सहायता करें मैं एक स्पीक्स वीओआईपी क्लाइंट और सर्वर बनाने की कोशिश कर रहा हूं। मेरे पास मूल बातें हैं और यह यूडीपी पर स्थानीय मशीन पर ठीक काम कर रही है। मैं पोर्टेबिलिटी के लिए जेएसपेक्स का उपयोग कर रहा हूं। मैं ग्राहक और सर्वर बनाने के सुझावों की तलाश में हूं। आपके क्या विचार हैं?एक स्पीक्स वीओआईपी सर्वर और क्लाइंट
जेएसपेक्स लाइब्रेरी केवल 320 बाइट प्रति कॉल एन्कोड कर सकती है ताकि सर्वर पर भेजे गए पैकेट छोटे (मेरे मामले में ~ 244 बाइट्स) हो। क्या ग्राहक के लिए इंतजार करना बेहतर होगा जब तक कि एन्कोडेड डेटा के लगभग 1 या 2 केबी तैयार नहीं हो जाते हैं या सर्वर को पैकेट बफरिंग करने से पहले तैयार करते हैं?
इसके अलावा, डेटा बफरिंग को कार्यान्वित करने के तरीके पर कोई भी मदद अच्छी होगी।
मेरे पास जो कुछ है वह स्थानीय मशीन पर काम करता है।
ग्राहक:
public void run() {
int nBytesToRead = (m_inputAudioFormat.getFrameSize() * 160);
int nAvailable = 0;
byte[] abPCMData = new byte[nBytesToRead];
byte[] abSpeexData = null;
UserSpeexPacket userSpeexPacket = new UserSpeexPacket("Xiphias3", "TheLounge", null, 0);
while (m_captureThread != null) {
nAvailable = m_line.available();
if (nAvailable >= nBytesToRead) {
int nBytesRead = m_line.read(abPCMData, 0, nBytesToRead);
if (nBytesRead == -1) break;
if (nBytesRead < nBytesToRead)
Arrays.fill(abPCMData, nBytesRead, abPCMData.length, (byte) 0);
abSpeexData = createSpeexPacketFromPCM(abPCMData, 0, abPCMData.length);
//DatagramPacket packet = new DatagramPacket(abSpeexData, 0, abSpeexData.length, m_connection.getInetAddress(), m_nServerPort);
userSpeexPacket.setSpeexData(abSpeexData);
userSpeexPacket.incrementPacketNumber();
DatagramPacket packet = UserSpeexPacket.userSpeexPacketToDatagramPacket(m_connection.getInetAddress(), m_connection.getPort(), userSpeexPacket);
try {
m_connection.send(packet);
}
catch(IOException iox) {
System.out.println("Connection to server lost: " + iox.getMessage());
break;
}
}
}
closeLine();
disconnect();
}
public byte[] createSpeexPacketFromPCM(byte[] abPCMData, int nOffset, int nLength)
{
byte[] abEncodedData = null;
m_speexEncoder.processData(abPCMData, nOffset, nLength);
abEncodedData = new byte[m_speexEncoder.getProcessedDataByteSize()];
m_speexEncoder.getProcessedData(abEncodedData, 0);
return abEncodedData;
}
सर्वर:
DatagramPacket packet = new DatagramPacket(new byte[2048], 0, 2048);
byte[] abPCMData = null;
long lPrevVolPrintTime = 0;
while (m_bServerRunning) {
try {
m_serverSocket.receive(packet);
//System.out.println("Packet size is " + packet.getData().length);
//System.out.println("Got packet from " + packet.getAddress().getHostAddress());
//abPCMData = decodeSpeexPacket(packet.getData(), 0, packet.getLength());
UserSpeexPacket usp = UserSpeexPacket.datagramPacketToUserSpeexPacket(packet);
abPCMData = decodeSpeexPacket(usp.getSpeexData(), 0, usp.getSpeexData().length);
m_srcDataLine.write(abPCMData, 0, abPCMData.length);
if (System.currentTimeMillis() >= (lPrevVolPrintTime + 500)) {
//System.out.println("Current volume: " + AudioUtil.getVolumeLevelForPCM22050Hz16Bit1Channel(abPCMData, 0, abPCMData.length));
lPrevVolPrintTime = System.currentTimeMillis();
}
}
catch (IOException iox) {
if (m_bServerRunning) {
System.out.println("Server socket broke: " + iox.getMessage());
stopServer();
}
}
}
आपके इनपुट के लिए धन्यवाद। मुझें यह पसंद है! – Xiphias3