我目前有一个循环返回程序,用于在Android设备上测试音频。

它使用Audiorecord和Audiotrack从麦克风中录制PCM音频,并播放PCM Audio听筒。

这是代码:

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,byte enc [],int帧)解码(byte enc [],short lin [],int帧) 方法,但我不确定如何使用它们对Audiorecord和audiotrack的音频进行编码和解码。

谁能帮助我或指向正确的方向?

有帮助吗?

解决方案

改变你的 arec.read(buffer, 0, buffersize) 打电话使用 Bytebuffer read() 方法 AudioRecord.

一旦您将字节带入 ByteBuffer 对象,然后您只需插入g711实现编码的呼叫,然后使用 ByteBuffer.asShortBuffer() 将捕获的PCM数据输入编码器的方法。

这将解决您的最初问题,而无需介绍第三方库为您做这项工作。 (这个答案是针对遇到问题的未来人)。

我的问题是为什么?

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

遵循PCM-> g711(encode) - > g711(Decode) - > pcm的路径,实现无意义。您所做的只是引入不必要的处理和延迟。现在,如果您打算将编码的数据写入文件,而不是尝试通过耳朵片段播放,那将是另一个故事,但是您当前的代码似乎并不是对PCM数据的编码并不是很有用。

在此处介绍您自己的编解码器只有在将压缩语音数据写入文件(例如以压缩方式记录呼叫数据)或通过网络或其他内容发送的上下文中才有意义。

其他提示

我意识到这是一个很古老的帖子。您能使自己的G711工作吗?我自己的最初想法是使用编译的LIB为内核,并使用JNI称呼它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top