Я пытаюсь создать клиент и сервер Speex Voip. У меня есть основы и все нормально работает на локальной машине через UDP. Я использую JSpeex для переносимости. Я ищу советы по созданию клиента и сервера. Что вы думаете?
Библиотека JSpeex может кодировать только 320 байтов на вызов, поэтому пакеты, отправляемые на сервер, очень маленькие (в моем случае ~ 244 байта). Было бы лучше для клиента подождать, пока будет готово около 1 или 2 КБ закодированных данных, прежде чем отправлять или позволить серверу обрабатывать буферизацию пакетов?
Кроме того, было бы неплохо получить любую помощь по реализации буферизации данных.
Кое-что из того, что у меня есть, работает на локальном компьютере.
Клиент: Что вы думаете?
Библиотека JSpeex может кодировать только 320 байтов на вызов, поэтому пакеты, отправляемые на сервер, очень маленькие (в моем случае ~ 244 байта). Было бы лучше для клиента подождать, пока будет готово около 1 или 2 КБ закодированных данных, прежде чем отправлять или позволить серверу обрабатывать буферизацию пакетов?
Кроме того, было бы неплохо получить любую помощь по реализации буферизации данных.
Кое-что из того, что у меня есть, работает на локальном компьютере.
Клиент: Что вы думаете?
Библиотека JSpeex может кодировать только 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();
}
}
}