4

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

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

设置音频方法:

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 台设备对其进行测试,结果如下:

银河 S3

  • 设置音频:~200ms
  • startRecording() : ~280ms

银河 S3 迷你

  • 设置音频:~10ms
  • startRecording() : ~290ms

银河连结

  • 设置音频:~10ms
  • startRecording() : ~235ms

缓冲区大小:

  • 连结:704
  • s3:1024
  • s3迷你:640

然而,只有来自银河系的数据是可用的。为了我的应用程序的目的,我必须能够尽快获得音频数据。使用当前值,只有 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

4

1 回答 1

5

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

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

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

于 2013-09-03T13:37:09.697 回答