首页 > 解决方案 > 如何在不使用双簧管库的情况下同时实现音频录制和播放的最小延迟?

问题描述

我正在使用 audioRecord 和 audioTrack 录制和播放音频,工作正常但有延迟。经过一番研究,我只发现了有关双簧管库(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();
}

标签: androidaudiotrackaudiorecordlow-latency

解决方案


推荐阅读