我目前有一个环回程序,用于在 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 的音频。
任何人都可以帮助我或指出我正确的方向吗?