2016-04-29 105 views
2

我正在嘗試構建麥克風應用程序,麥克風的聲音直接由揚聲器播放。問題是聽到的聲音有延遲。代碼如下。有沒有辦法避免這種延遲?我聽說我們可以通過在c/C++中添加本機代碼來避免這種情況,然後從java中調用它。可能嗎?如果是這樣如何?麥克風對揚聲器直接流應用程序的音頻延遲Android

public class MainActivity extends AppCompatActivity { 
    boolean isRecording; 
    AudioManager am; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     Record record = new Record(); 
     record.run(); 

    } 
    public class Record extends Thread 
    { 

     static final int bufferSize = 200000; 
     final short[] buffer = new short[bufferSize]; 
     short[] readBuffer = new short[bufferSize]; 

     public void run() { 
      isRecording = true; 
      android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
      int buffersize = AudioRecord.getMinBufferSize(11025,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 
      AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,buffersize); 
      AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM); 
      am.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL); 
      atrack.setPlaybackRate(11025); 
      byte[] buffer = new byte[buffersize]; 
      arec.startRecording(); 
      atrack.play(); 
      while(isRecording) { 
       arec.read(buffer, 0, 
         buffersize); 
       atrack.write(buffer, 0, 
         buffer.length); 
      } 
      arec.stop(); 
      atrack.stop(); 
      isRecording = false; 
     } 
    } 
} 
+0

什麼是'buffersize'出來是? – jaket

回答

1

那麼你可以試試這個庫調用superpowered,聲稱具有低延遲的音頻,而不是寫你自己的本地代碼。 希望這對你有用。該源也可在git集線器上使用。

相關問題