Одноранговый голосовой вызов в Android без sip

Я разрабатываю приложение, которое позволяет пользователю совершать голосовые вызовы в локальной сети (WI-FI) путем потоковой передачи необработанного аудиопотока PCM. но я не могу воспроизвести полученную звуковую дорожку

вот мой код приемника:

   private AudioTrack speaker;



    public void startReceiving() {

        Thread receiveThread = new Thread (new Runnable() {

            @Override
            public void run() {

                try {

                    DatagramSocket socket = new DatagramSocket(1127);
                    Log.d("VR", "Socket Created");


                    byte[] buffer = new byte[256];


                    //minimum buffer size. need to be careful. might cause problems. try setting manually if any problems faced
                    int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

                    speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,minBufSize,AudioTrack.MODE_STREAM);


                    speaker.play();
                    while(status==true) {
                        try {


                            DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
                            socket.receive(packet);
                            Log.d("VR", "Packet Received");

                            //reading content from packet
                            buffer=packet.getData();
                            Log.d("VR", "Packet data read into buffer");

                            //sending data to the Audiotrack obj i.e. speaker
                            speaker.write(buffer, 0, minBufSize);
                            Log.d("VR", "Writing buffer content to speaker");

                        } catch(IOException e) {
                            Log.e("VR","IOException");
                        }
                    }
                    speaker.play();

                } catch (SocketException e) {
                    Log.e("VR", "SocketException");
                }


            }

        });
        receiveThread.start();
    }

и вот мой код отправителя:

public void startStreaming()
{
    Thread streamThread = new Thread(new Runnable(){
        @Override
        public void run()
        {
            try{

                DatagramSocket socket = new DatagramSocket();
                Log.d("VS", "Socket Created");

                byte[] buffer = new byte[minBufSize];

                Log.d("VS", "Buffer created of size " + minBufSize);


                Log.d("VS", "Address retrieved");
                recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize);
                Log.d("VS", "Recorder initialized");


                recorder.startRecording();


                InetAddress IPAddress = InetAddress.getByName("192.168.0.101");
                byte[] sendData = new byte[1024];
                byte[] receiveData = new byte[1024];


                while (status==true)
                {
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 1127);
                    socket.send(sendPacket);
                }

            } catch(UnknownHostException e) {
                Log.e("VS", "UnknownHostException");
            } catch (IOException e) {
                Log.e("VS", "IOException");
                e.printStackTrace();
            }


        }

    });
    streamThread.start();
}

Я не могу использовать SIP, это просто потоковое аудио. может ли кто-нибудь помочь мне с этим, пожалуйста

Благодарю.


person Ak-    schedule 07.04.2015    source источник


Ответы (1)


У вас есть две проблемы:

  1. Ваш поток получателя, похоже, не воспроизводится... он всегда находится в цикле и никогда не достигает Speaker.play().
  2. Ваш отправляющий поток никогда не отправляет никаких данных... Например:

    recorder.read(sendData, 0, sendData.length);
    
person msj121    schedule 14.04.2015
comment
Привет, msj121, я получаю байты, которые будут отображаться при печати журналов, но, похоже, я получаю одни и те же данные, я имею в виду 2B03F5, что-то вроде этого (но они отображают одни и те же данные снова и снова в цикле). и я проверил своего отправителя, реализовав java-приемник, и это сработало. с небольшими лагами и перекрытиями. - person Ak-; 16.04.2015
comment
и есть ли какое-то правильное размещение, которое я мог бы сделать для Speaker.play? - person Ak-; 16.04.2015
comment
В настоящее время спикер.плей перед циклом правильный, тот, что после, бесполезен. Я думаю, что все остальное выглядит правильно. Попробуйте удалить любые сообщения из журнала, они замедлят ваш поток и могут вызвать пробелы. Также вам может понадобиться попытаться увеличить приоритет потока, если это не сработает. Также, пожалуйста, отметьте как ответ, если то, что я говорю, правильно для репутации и для помощи другим. - person msj121; 17.04.2015
comment
Я попробую это и вернусь к вам. кстати, спасибо за поддержку, и я опубликую полное решение. - person Ak-; 17.04.2015
comment
Спасибо. Это помогло, с помощью нескольких проб и ошибок с частотой дискретизации и размером буфера я смог запустить его. - person Ak-; 21.04.2015
comment
Приятно знать! Удачи, получить правильный размер буфера иногда может быть сложно, для звука я заметил, что меньшие размеры буфера, кажется, становятся более быстрыми и с меньшими задержками, но это сложно. - person msj121; 22.04.2015
comment
Да, действительно, и даже полоса пропускания также имеет значение. Потоковая передача аудио без SIP может быть хорошей идеей для связи нескольких узлов, но если у нас более 10 клиентов, SIP имеет решающее значение для поддержания соединения и управления потоком данных. - person Ak-; 22.04.2015
comment
CodeMan › Можно ли использовать SIP между клиентами без SIP-сервера? - person Jasper; 19.10.2015
comment
да. Но тогда вам нужно будет вручную передать информацию SIP, например, электронное письмо, скопировать и вставить ее. - person msj121; 20.10.2015