AudioRecord和AudioTrack延迟

Jor*_*vol 7 audio android record audiorecord android-audiorecord

我正在尝试开发像iRig for android这样的应用程序,所以第一步是捕获麦克风输入并同时播放它.

我有它,但问题是我得到一些延迟,使这无法使用,如果我开始处理缓冲区,我担心它将完全无法使用.

我像这样使用audiorecord和audiotrack:

    new Thread(new Runnable() {
        public void run() {
            while(mRunning){
                mRecorder.read(mBuffer, 0, mBufferSize);
                //Todo: Apply filters here into the buffer and then play it modified
                mPlayer.write(mBuffer, 0, mBufferSize);         
                //Log.v("MY AMP","ARA");
            }
Run Code Online (Sandbox Code Playgroud)

并且以这种方式实现:

// ==================== INITIALIZE ========================= //
public void initialize(){

    mBufferSize = AudioRecord.getMinBufferSize(mHz, 
                AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                AudioFormat.ENCODING_PCM_16BIT);

    mBufferSize2 = AudioTrack.getMinBufferSize(mHz, 
                AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                AudioFormat.ENCODING_PCM_16BIT);

    mBuffer = new byte[mBufferSize];

    Log.v("MY AMP","Buffer size:" + mBufferSize);

    mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
                mHz,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT, 
                mBufferSize);

    mPlayer = new AudioTrack(AudioManager.STREAM_MUSIC,
                mHz,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT,
                mBufferSize2, 
                AudioTrack.MODE_STREAM);    

}
Run Code Online (Sandbox Code Playgroud)

你知道如何获得更快的反应吗?谢谢!

Sir*_*get 8

由于最小缓冲区大小,Android的AudioTrack\AudioRecord类具有高延迟.这些缓冲区大小的原因是为了最大限度地减少GC发生时的丢弃(在我看来,这是一个错误的决定,你可以优化自己的内存管理).

你想要做的是使用OpenSL,它可以从2.3获得.它包含用于流式音频的本机API.这是一些文档:http: //mobilepearls.com/labs/native-android-api/opensles/index.html

  • 这个答案错误地表明OpenSL具有低延迟.不要在OpenSL上浪费您的时间来获得低延迟音频.Android现在和很快就没有这种能力了.有关详细信息,请参阅以下问题:http://code.google.com/p/android/issues/detail?id = 3434 (2认同)