Peer to Peer Audio Call on Android: voice breaks and delays (packet reception delay) increase

I am trying to install Peer to Peer to call sound on Android. I used an Android phone and tablet for communication, but after receiving about 40 packets, the phone almost stops receiving packets, and then suddenly receives several packets and plays them and so on, but this waiting time increases. Similarly, the tablet initially receives packets and plays them, but the lag increases, and the voice begins to collapse after a while, as if some packets were lost. Any idea that causes this problem ...

This is the code for the application ... I just pass the ip address of the sender and receiver in the RecordAudio class when it runs on two devices.

public class AudioRPActivity extends Activity implements OnClickListener { DatagramSocket socketS,socketR; DatagramPacket recvP,sendP; RecordAudio rt; PlayAudio pt; Button sr,stop,sp; TextView tv,tv1; File rf; boolean isRecording = false; boolean isPlaying = false; int frequency = 44100; int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; int audioEncoding = AudioFormat.ENCODING_PCM_16BIT; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView)findViewById(R.id.text1); tv1 = (TextView)findViewById(R.id.text2); sr = (Button)findViewById(R.id.sr); sp = (Button)findViewById(R.id.sp); stop = (Button)findViewById(R.id.stop); sr.setOnClickListener(this); sp.setOnClickListener(this); stop.setOnClickListener(this); stop.setEnabled(false); try { socketS=new DatagramSocket(); socketR=new DatagramSocket(6000); } catch(SocketException se) { tv.setText(se.toString()); finish(); } } public void onClick(View v) { if(v == sr) record(); else if(v == sp) play(); else if(v == stop) stopPlaying(); } public void play() { stop.setEnabled(true); sp.setEnabled(false); pt = new PlayAudio(); pt.execute(); } public void stopPlaying() { isRecording=false; isPlaying = false; stop.setEnabled(false); } public void record() { stop.setEnabled(true); sr.setEnabled(false); rt = new RecordAudio(); rt.execute(); } private class PlayAudio extends AsyncTask<Void,String,Void> { @Override protected Void doInBackground(Void... arg0) { isPlaying = true; int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding); byte[] audiodata = new byte[bufferSize]; try { AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,frequency,channelConfiguration, audioEncoding,4*bufferSize,AudioTrack.MODE_STREAM); audioTrack.setPlaybackRate(frequency); audioTrack.play(); while(isPlaying) { recvP=new DatagramPacket(audiodata,audiodata.length); socketR.receive(recvP); audioTrack.write(recvP.getData(), 0, recvP.getLength()); } audioTrack.stop(); audioTrack.release(); } catch(Throwable t) { Log.e("Audio Track","Playback Failed"); } return null; } protected void onProgressUpdate(String... progress) { tv1.setText(progress[0].toString()); } protected void onPostExecute(Void result) { sr.setEnabled(true); sp.setEnabled(true); } } private class RecordAudio extends AsyncTask<Void,String,Void> { @Override protected Void doInBackground(Void... arg0) { isRecording = true; try { int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding); AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency,channelConfiguration ,audioEncoding,4*bufferSize); byte[] buffer = new byte[bufferSize]; audioRecord.startRecording(); int r=0; while(isRecording) { int brr = audioRecord.read(buffer,0,bufferSize); sendP=new DatagramPacket(buffer,brr,InetAddress.getByName("sender's/receiver ip"),6000); socketS.send(sendP); publishProgress(String.valueOf(r)); r++; } audioRecord.stop(); audioRecord.release(); } catch(Throwable t) { Log.e("AudioRecord","Recording Failed...."); } return null; } protected void onProgressUpdate(String... progress) { tv.setText(progress[0].toString()); } protected void onPostExecute(Void result) { sr.setEnabled(true); sp.setEnabled(true); } } } 
+4
source share
1 answer

I had problems sending voice over the network if there was nothing but 8000 for the frequency. 44100 sounded awful. It could only be for my situation.

Another difficulty is that with UDP it is hard to tell what order packets are coming from. I saw an implementation that returns them in the correct order, but I cannot find it right now.

+1
source

Source: https://habr.com/ru/post/1414544/


All Articles