Android AudioRecord初始化延迟

时间:2013-09-03 10:43:02

标签: android audio delay fft audiorecord

以下是我正在处理的相关代码的示例:

AudioRecord recorder = setupAudio();
recorder.startRecording();

SetupAudio方法:

public AudioRecord setupAudio() {

        AudioRecord recorder;

        minBufferSizeInBytes = AudioRecord.getMinBufferSize(
                RECORDER_SAMPLERATE, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT);

        Log.e("MoverAudio","BufferSize: " + minBufferSizeInBytes);

        recorder = new AudioRecord(MediaRecorder.AudioSource.CAMCORDER,
                RECORDER_SAMPLERATE, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, minBufferSizeInBytes);

        return recorder;
    }

RECORDER_SAMPLERATE = 8000;

我试图找出是否有办法改善初始化所需的时间。

目前正在测试3台设备,结果如下:

Galaxy S3

  • setupAudio:~200ms
  • startRecording():~280ms

Galaxy S3 mini

  • setupAudio:~10ms
  • startRecording():〜290ms

Galaxy Nexus

  • setupAudio:~10ms
  • startRecording():~235ms

BufferSizes:

  • Nexus:704
  • s3:1024
  • s3 mini:640

但是,只有来自galaxy nexus的数据才可用。 出于我的应用目的,我必须能够尽快获得音频数据。使用当前值,只有Nexus在可接受的时间内。

S3 mini可能看起来很快,因为它只需要比Nexus多一点,但是前200毫秒的样本被列为0,所以它不可用。

根据我所理解的分析收集的数据后,S3和S3 mini上的音频似乎以某种方式过滤,看到生成的FFT更加干净,低频声音总是不那么明显。 以下是S3mini和Galaxy Nexus录制音频的示例:

http://img41.imageshack.us/img41/4177/ox7h.png S3 Mini

http://img690.imageshack.us/img690/8717/iya6.png Galaxy Nexus

1 个答案:

答案 0 :(得分:4)

如果您请求长缓冲区,则必须等待操作系统以当前采样率填充它。如果您请求的采样率不是硬件ADC的运行速率,那么您还必须等待重采样器滤波器延迟。不同的Android设备和操作系统版本可能支持不同的最小缓冲区大小和本机硬件采样率。

隐藏延迟的一种方法是在应用程序的生命周期中提前开始录制,并在应用程序需要之前不断丢弃音频样本。然后没有启动开销。

补充:在某些设备/操作系统版本中,数据可能会以某种硬件采样率(例如4096,44.1k或48kHz)被捕获到更长的OS驱动程序缓冲区中,并且只有在填充了几个缓冲区后才能转换到另一个采样率,并切断到较短的请求缓冲区长度,音频命令开始向应用程序发送数据。要绕过,即使可能,您可能需要修改操作系统并编写自己的ADC驱动程序。但尝试使用更高的采样率(44.1k或48k)并首先请求更短的缓冲区。