如何在AudioRecord对象中刷新缓冲区?

时间:2012-10-30 23:18:43

标签: java android audio media

我正在尝试从Android设备上的麦克风获得非常准确的定时录音。我的想法就像是

while (true) {
  audioRecord.startRecording();
  sleep(0,nanoSeconds);
  audioRecord.flush();
  audioRecord.read(buf, 0, numSamples);
}

flush()没有AudioRecord方法。所以也许我应该做

while (true) {
  sleep(0,nanoSeconds);
  audioRecord.startRecording();
  audioRecord.read(buf, 0, numSamples);
  audioRecord.stop();
}

当然,我无法找到有关startRecording()read()stop()的详细信息,以及他们实际谈论缓冲区的详细信息。似乎没有任何方法可以调用哪个方法告诉我缓冲区中是否有样本。或者让我做一个read()调用,它读取所有现有的缓冲区:我需要指定要读取的样本数,我的调用将阻塞,直到这些样本存在。

我希望有人能够向我展示更真实记录的内容。但几乎同样好,只要告诉我如果我真的想要在一个非常精确确定的开始时间启动麦克风,我应该怎么做。

2 个答案:

答案 0 :(得分:1)

在这种情况下,源代码可能比文档更有帮助。大多数Android的媒体类都是本机代码的薄包装。例如,startRecording() method方法只是调用JNI图层中的android_media_AudioRecord_start(),而后者又会调用本地AudioRecord instance上的start()。除此之外,它与AudioFlinger以及最终的硬件驱动程序接口。硬件延迟几乎肯定会因设备而异,并且组件通常不是为高精度工作而设计的。

话虽如此,如果您可以对运行应用程序的硬件做出一些假设,那么阅读上面链接的本机代码可能会有所帮助。如果您习惯编写一些C ++(JNI)代码,则可以通过操作AudioRecord的实例来访问音频缓冲区。祝你好运!

答案 1 :(得分:0)

从API级别24开始,您可以在捕获管道中可用的最早点调用AudioRecord.getAudioTimestamp()以获取帧传递信息。因此,您可以比较开始录制后的时间戳,看它们是否因睡眠间隔而不同。

有关详细信息,请参阅documentation