点对点音频在Android上呼叫:语音中断和延迟(接收数据包的延迟)增加

我正在尝试在Android上建立Peer to Peer音频调用。 我使用Android手机和平板电脑进行通信,但收到大约40个数据包后,手机几乎停止接收数据包,然后突然收到一些数据包并播放它们等等,但这个等待时间增加了。 类似地,平板电脑最初接收数据包并播放它们但延迟增加并且语音在一段时间后开始崩溃,好像某些数据包丢失一样。 有什么想法导致这个问题……

这是应用程序的代码…我只是在两个设备上运行它时,在RecordAudio类中给出发送者和接收者的IP地址。

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 { @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 { @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's 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); } } } 

通过网络发送语音时,如果频率为8000以上,我就会遇到麻烦。 44100听起来很可怕。 那可能就是我的情况。

另一个困难是,使用UDP很难说数据包到达的顺序。我已经看到一个实现将它们放回正确的顺序,但我现在找不到它。