2010-03-10 66 views
4

我目前有一個Loop回程序,用於在Android設備上測試音頻。Android - 如何將我自己的音頻編解碼器添加到AudioRecord?

它使用AudioRecord和AudioTrack從麥克風錄製PCM音頻並將PCM音頻播放到耳機中。

下面是代碼:

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); 

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

          atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, 
              11025, 
              AudioFormat.CHANNEL_CONFIGURATION_MONO, 
              AudioFormat.ENCODING_PCM_16BIT, 
              buffersize, 
              AudioTrack.MODE_STREAM); 


          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); 
          } 
      } 
    } 

所以你可以在創建AudioTrack的看到和AudioRecord編碼是通過提供的AudioFormat但只允許16位或8位PCM。

我現在有我自己的G711編解碼器實現,我希望能夠對來自Mic的音頻進行編碼並將其解碼爲EarPiece,所以我有encode(short lin [],int offset,byte enc [ ],int幀)decode(byte enc [],short lin [],int frames)方法,但我不確定如何使用它們來編碼和解碼來自AudioRecord和AudioTrack的音頻。

任何人都可以幫助我或指向正確的方向嗎?

+0

嗨唐納,你可以更新這個問題與你做的最終實施,請求?我已經好幾天嘗試在G711中進行編碼/解碼,但沒有成功。如果我們能看到你是怎麼做的,那會是太棒了......我遇到了很多與這個問題有關的問題。謝謝 – 2014-04-25 07:16:19

+0

嗨胡安,恐怕我不再有最終的解決方案了,這是我長期留下的一個項目的一部分,不再有或者不能記住解決方案的代碼,致歉。 – 2014-05-28 15:31:46

回答

1

更改arec.read(buffer, 0, buffersize)致電Bytebufferread()方法從AudioRecord

將字節放入ByteBuffer對象後,您可以插入G711編碼實現調用,並使用ByteBuffer.asShortBuffer()方法將捕獲的PCM數據放入編碼器。

這將解決您的第一個問題,而無需引入第三方庫來爲您完成這項工作。 (這個答案適用於將來遇到問題的人)。

我的問題是爲什麼?

在上面的代碼中,您從麥克風捕獲PCM數據,並將其直接寫入緩衝區進行播放。

在您的實施中,沿着PCM→G711(編碼)→G711(解碼)→PCM的路徑沒有任何意義。你所做的只是引入不必要的處理和延遲。現在,如果您要將編碼數據寫入文件,而不是嘗試通過耳機播放它,這將是一個不同的故事,但是您的當前代碼對PCM數據進行編碼似乎並不實用。

在這裏介紹自己的編解碼器只有在將壓縮語音數據寫入文件(例如以壓縮方式記錄通話數據)或通過網絡發送文件的情況下才有意義。

0

我意識到這是一個很老的帖子。你能否讓自己的G711工作?我最初的想法是使用爲內核編譯的lib並使用JNI來調用它。

+0

請對這類問題的原始問題發表評論。在獲得更多細節之前不要創建答案。祝你好運!:) – 2012-09-19 07:18:26

+0

嗨克里斯,我確實只是使用第三方庫來實現這一點。 – 2012-09-19 08:53:32

相關問題