2010-03-10 61 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

相关问题