如何不间断地发送数据?

如何不间断地发送数据?

问题描述:

我想从我的Android应用程序发送rtp音频数据。如何不间断地发送数据?

我目前可以发送一个RTP包与下面的代码,我也有另一个类,扩展线程侦听和接收RTP包。

我的问题是我如何持续发送更新的缓冲区通过数据包有效载荷而不阻塞接收线程?

public void run() { 

    isRecording = true; 
    android.os.Process.setThreadPriority 
      (android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

    int buffersize = AudioRecord.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    Log.d("BUFFERSIZE","Buffer size = " + buffersize); 

    arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 
      8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, 
      buffersize); 

    short[] readBuffer = new short[80]; 
    byte[] buffer = new byte[160]; 

    arec.startRecording(); 
    while(arec.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING){ 
     int frames = arec.read(readBuffer, 0, 80); 

     @SuppressWarnings("unused") 
     int lenghtInBytes = codec.encode(readBuffer, 0, buffer, frames); 

     RtpPacket rtpPacket = new RtpPacket(); 
     rtpPacket.setV(2); 
     rtpPacket.setX(0); 
     rtpPacket.setM(0); 
     rtpPacket.setPT(0); 
     rtpPacket.setSSRC(123342345); 
     rtpPacket.setPayload(buffer, 160); 

     try {  
      rtpSession2.sendRtpPacket(rtpPacket); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (RtpException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

所以,当我在一个设备上发送和接收另一个我得到体面的声音,但是当我发送和接收两个我得到破音像其轮流发送和接收音频。

我有一种感觉,它可能是做的while循环?它可能在那里循环而不让其他任何东西运行?

+1

在不同线程中发送和侦听,或者在侦听套接字上设置超时。因此,您可以在非常短的时间内监听数据是否可用,然后再次发送缓冲区。 – MrSnowflake 2010-03-19 11:14:47

+0

我目前有两个独立的子类来监听和发送,这两个子类都扩展了Thread,发送和监听在run()方法中完成。然后,我通过调用start()来启动线程类,但它们似乎仍然彼此阻塞而不是并排运行 – 2010-03-19 12:28:08

+0

例如,如果我有一个设备发送,并且一个音频发送和接收正常,但是如果我同时拥有这两个设备发送和接收音频是停止开始和不连贯 – 2010-03-19 14:11:50

要在不阻塞执行线程的情况下发送数据,Android的最佳实践需要使用Android手册中描述的AsyncTask。异步方法将在您的应用程序的后台执行,完成后,您的调用方类将接收通过异步任务获得的数据。