5

我目前有一个环回程序,用于在 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 编解码器实现,我希望能够对来自麦克风的音频进行编码并将其解码到 EarPiece,所以我有encode(short lin[], int offset, byte enc[], int frames)decode(byte enc[], short lin[], int frames)方法,但我不确定如何使用它们来编码和解码来自 AudioRecord 和 AudioTrack 的音频。

任何人都可以帮助我或指出我正确的方向吗?

4

2 回答 2

2

更改您的arec.read(buffer, 0, buffersize)调用以使用Bytebuffer read()来自 的方法AudioRecord

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

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

我的问题是为什么?

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

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

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

于 2013-04-20T16:19:55.033 回答
0

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

于 2012-09-18T16:58:56.250 回答