Java Android-如何将我自己的音频编解码器添加到AudioRecord?

Java Android-如何将我自己的音频编解码器添加到AudioRecord?,java,android,audio,encode,codec,Java,Android,Audio,Encode,Codec,我目前有一个在Android设备上测试音频的环回程序 它使用AudioRecord和AudioTrack从麦克风录制PCM音频,并通过耳机播放PCM音频 代码如下: public class Record extends Thread { static final int bufferSize = 200000; final short[] buffer = new short[bufferSize]; short[] readB

我目前有一个在Android设备上测试音频的环回程序

它使用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编解码器实现,我希望能够对麦克风中的音频进行编码,并将其解码到听筒中,因此我有编码(短lin[],int offset,字节enc[],int frames)解码(字节enc[],短lin[],int frames)方法,但我不确定如何使用它们对录音和音轨中的音频进行编码和解码


有谁能帮我或给我指出正确的方向吗?

我意识到这是一篇很老的帖子。你能让自己的G711正常工作吗?我自己最初的想法是使用为内核编译的lib,并使用JNI来调用它。

将您的
arec.read(buffer,0,buffersize)
调用更改为使用
Bytebuffer
read()
方法

将字节放入
ByteBuffer
对象后,您只需插入encode的G711实现调用,并使用
ByteBuffer.asShortBuffer()
方法将捕获的PCM数据放入编码器

这将解决您最初的问题,而无需引入第三方库来为您完成这项工作。(这个答案适用于未来遇到这个问题的人)

我的问题是为什么

在上面的代码中,您从麦克风捕获PCM数据,并将其直接写入缓冲区进行播放

在您的实现中,遵循PCM->G711(编码)->G711(解码)->PCM的路径没有任何意义。您所做的只是引入不必要的处理和延迟。现在,如果您打算将编码数据写入一个文件,而不是试图通过耳机播放它,那将是一个不同的故事,但是您当前的代码似乎对编码PCM数据没有真正的用处


在这里介绍您自己的编解码器只有在将压缩语音数据写入文件(例如以压缩方式记录通话数据)或通过网络或其他方式发送时才有意义。

请对此类问题的原始问题发表评论。在了解更多细节之前,不要创建答案。祝你好运!:)嗨,克里斯,我确实使用了第三方库来实现这一点。嗨,多纳尔,你能用你所做的最终实现来更新这个问题吗?几天来,我一直试图在G711中编码/解码,但没有成功。如果我们能看到你是怎么做的,那就太好了……我在这个问题上遇到了很多问题。谢谢Shi Juan,恐怕我已经没有最终的解决方案了,这是我早已离开的一个项目的一部分,我不再有或能够记住解决方案的代码,抱歉。