Как я могу получить минимальную задержку при записи и воспроизведении звука одновременно, не используя Oboe Library? - PullRequest
0 голосов
/ 19 сентября 2019

Я записываю и воспроизводю аудио с использованием audioRecord и audioTrack, работает нормально, но с задержкой.После некоторых исследований я нашел кое-что об Oboe Library (OpenSl и Aaudio).Я хочу максимально увеличить задержку, которую можно уменьшить с помощью audioRecord и audioTrack, но я не знаю, возможно ли это.Это часть моего кода:

protected void recordAndPlay() {
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

    final int bufferSizeIn = AudioRecord.getMinBufferSize(freq,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

    final int bufferSizeOut = AudioTrack.getMinBufferSize(freq,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT);

    audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION/*MediaRecorder.AudioSource.MIC*/, freq,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSizeIn);

    audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, freq,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSizeOut,
            AudioTrack.MODE_STREAM);

    buffer = new short[bufferSizeIn];//buffer de amostras
    audioRecord.startRecording(); //começa a captar a voz
    Log.i("", "Audio Recording started");
    audioTrack.play(); //começa a transmitir a voz
    Log.i("", "Audio Playing started");
    Rthread = new Thread(new Runnable() {
        public void run() {
            while (true) {
                try {
                    audioRecord.read(buffer, 0, bufferSizeIn);
                    audioTrack.write(buffer,0,bufferSizeIn);
                } catch (Throwable t) {
                    Log.e("Error", "Read write failed");
                    t.printStackTrace();
                }
            }
        }
    });
    Rthread.start();
}
...