В настоящее время у меня есть программа Loop back для тестирования аудио на устройствах 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, поэтому у меня есть кодирование (short lin [], int offset, byte enc [], int frames) и decode (методы byte enc [], short lin [], int frames) , но я не уверен, как их использовать для кодирования и декодирования аудио из AudioRecord и AudioTrack.
Может ли кто-нибудь помочь мне или указать мне правильное направление?