Android 录音和音轨延迟

Android 录音和音轨延迟,android,audio,record,audiorecord,android-audiorecord,Android,Audio,Record,Audiorecord,Android Audiorecord,我正在尝试为android开发一个类似iRig的应用程序,所以第一步是捕获麦克风输入并同时播放 我有它,但问题是我有一些延迟,这使得它不可用,如果我开始处理缓冲区,我担心它会变得完全不可用 我使用的录音带和音轨如下: new Thread(new Runnable() { public void run() { while(mRunning){ mRecorder.read(mBuffer, 0, mBufferSi

我正在尝试为android开发一个类似iRig的应用程序,所以第一步是捕获麦克风输入并同时播放

我有它,但问题是我有一些延迟,这使得它不可用,如果我开始处理缓冲区,我担心它会变得完全不可用

我使用的录音带和音轨如下:

    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");
            }
这种非专业化的方式:

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

}
您知道如何获得更快的响应吗?
谢谢

我的第一个建议是建议将AudioTrack初始化为静态模式,而不是流媒体模式,因为静态模式的延迟明显较小。但是,静态模式更适合于完全存储在内存中的短声音,而不是从其他地方捕获的声音。但就像一个猜测,如果你将AudioTrack设置为静态模式,并将输入音频的离散块提供给它会怎么样


如果你想更严格地控制音频,我建议你看看Android版的OpenSL ES。学习曲线将更加陡峭,但您可以获得更细粒度的控制和更低的延迟。

Android的AudioTrack\AudioRecord类由于最小的缓冲区大小而具有较高的延迟。 根据谷歌的说法,这些缓冲区大小的原因是为了在GC发生时最小化下降(在我看来,这是一个错误的决定,您可以优化自己的内存管理)

您要做的是使用OpenSL,它可以从2.3版获得。它包含用于流式音频的本机API。 以下是一些文档:

只是一个想法,但您不应该阅读正如mSparks指出的那样,流式处理应该使用较小的读取大小:您不需要读取完整的缓冲区来流式处理数据

int read = mRecorder.read(mBuffer, 0, 256); /* Or any other magic number */
if (read>0) {
    mPlayer.write(mBuffer, 0, read);  
}
这将大大减少您的延迟。如果mHz为44100,并且您的单声道配置为256,则延迟将不小于1000*256/44100毫秒=~5.8毫秒。 256/44100是从采样到秒的转换,因此乘以1000可以得到毫秒。
问题在于播放器的内部实现。您无法从java控制这一点。希望这对某人有所帮助:)

顺便说一下,一半的Android市场运行的是2.2或更高版本。不想混淆视听——也只是对谷歌安卓平台提供的新“解决方案”反复只对现有市场的一半有用感到沮丧,通常除了手机制造商的贪婪之外,没有其他原因。这个答案是错误的,认为OpenSL具有低延迟。不要在OpenSL上浪费时间,以获得低延迟音频。Android现在和不久的将来都没有这种能力。请参阅以下问题了解详细信息:Paul,你看到你链接的问题的日期了吗?这是过时的。他们在安卓2.3中处理了这个问题。现在情况如何?如何使用录音和音轨获得更快的响应?你是如何解决这个问题的?我也有类似的问题,请看我的问题