AudioRecord和AudioTrack延迟AudioRecord、AudioTrack

由网友(只等待丶非懂爱)分享简介:我试图开发类似的IRIG为Android的aplication,所以第一步是捕捉麦克风输入,并在同一时间玩。I'm trying to develop an aplication like iRig for android, so the first step is to capture the mic input...

我试图开发类似的IRIG为Android的aplication,所以第一步是捕捉麦克风输入,并在同一时间玩。

I'm trying to develop an aplication like iRig for android, so the first step is to capture the mic input and play it at the same time.

我有,但问题是,我得到一些延迟,使这个不可用的,如果我开始处理缓冲区恐怕会完全无法使用。

I have it, but the problem is that i get some latency that makes this unusable, and if I start processing the buffer i'm afraid it will get totally unusable.

我用audiorecord和audiotrack是这样的:

I use audiorecord and audiotrack like this:

    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");
            }

而inicialization是这样的:

And the inicialization this way:

// ==================== 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);    

}

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

do you know how to get a faster response? Thanks!

推荐答案

Android的AudioTrack AudioRecord类具有很高的延迟,由于最小缓冲区大小。 之所以这些缓冲区大小是尽量减少降低时GC的根据谷歌(这在我看来是一个错误的决定,您可以优化自己的内存管理)的发生。

Android's AudioTrackAudioRecord classes have high latency due to minimum buffer sizes. The reason for those buffer sizes is to minimize drops when GC's occur according to Google (which is a wrong decision in my opinion, you can optimize your own memory management).

您想要做的是使用OpenSL,可从2.3。它包含了音频流本地API。 下面是一些文档: http://mobilepearls.com/labs/native-android-api/opensles/index.html

What you want to do is use OpenSL, which is available from 2.3. It contains native APIs for streaming audio. Here's some docs: http://mobilepearls.com/labs/native-android-api/opensles/index.html

阅读全文

相关推荐

最新文章