Помогите с созданием сервера и клиента Speex Voip

Я пытаюсь создать клиент и сервер 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();
            }
        }
    }

8
задан Xiphias3 26 September 2010 в 20:57
поделиться