Android 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迷你

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

Galaxy Nexus

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

缓冲区大小:

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

然而,只有来自银河系的数据是可用的。为了我的应用程序,我必须能够尽快获得音频数据。根据当前值,只有Nexus在可接受的时间内。

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

据我所知,在分析了收集的数据后,S3和S3 mini上的音频似乎以某种方式被过滤了,因为得到的FFT要干净得多,低频声音总是不那么明显。以下是S3mini和Galaxy Nexus录制的音频示例:

http://img41.imageshack.us/img41/4177/ox7h.pngS3迷你

http://img690.imageshack.us/img690/8717/iya6.pngGalaxy Nexus

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

隐藏延迟的一种技术是在应用程序生命周期的早期开始录制,并不断丢弃音频样本,直到应用程序需要为止。这样就没有启动开销。

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

最新更新