这是我正在处理的相关代码示例:
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
- 设置音频:~200 毫秒
- 开始录制():~280 毫秒
银河 S3 迷你
- 设置音频:~10 毫秒
- 开始录制():~290 毫秒
银河系
- 设置音频:~10 毫秒
- 开始录制():~235 毫秒
缓冲区大小:
- 关系:704
- s3: 1024
- s3 迷你:640
但是,只有来自星系枢纽的数据可用。 出于我的应用程序的目的,我必须能够尽快获取音频数据。使用当前值,只有 Nexus 在可接受的时间内。
S3 mini 可能看起来很快,因为它只比 Nexus 多一点,但是前 ~200 毫秒的样本被列为 0,因此它不可用。
根据我对收集到的数据进行分析后的理解,S3 和 S3 mini 上的音频似乎以某种方式被过滤,因为由此产生的 FFT 更加干净,低频声音总是不那么明显。 以下是 S3mini 和 Galaxy Nexus 录制音频的示例:
最佳答案
如果您请求一个长缓冲区,那么您必须等待操作系统以当前采样率填充它。如果您请求的采样率不是硬件 ADC 正在运行的采样率,那么您必须额外等待重采样器滤波器延迟。不同的 Android 设备和操作系统版本可能支持不同的最小缓冲区大小和 native 硬件采样率。
隐藏延迟的一种技术是在应用程序的生命周期中更早地开始录制,并在应用程序需要它们之前不断丢弃音频样本。这样就没有启动开销。
补充:在某些设备/操作系统版本上,数据可能真的以某种硬件采样率(例如 4096,44.1k 或 48kHz)被捕获到更长的操作系统驱动程序缓冲区中,并且只有在其中几个缓冲区被填充后,才会转换到另一个采样率,并切成更短的请求缓冲区长度,使用音频命令开始向应用程序发送数据。要绕过,如果可能的话,您可能需要修改操作系统并编写您自己的 ADC 驱动程序。但请尝试使用更高的采样率(44.1k 或 48k)并首先请求更短的缓冲区。
关于Android AudioRecord 初始化延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18590225/