我正在尝试从我的 Android 设备上的麦克风获取非常准确的定时录音。我的想法是这样的
while (true) {
audioRecord.startRecording();
sleep(0,nanoSeconds);
audioRecord.flush();
audioRecord.read(buf, 0, numSamples);
}
但是AudioRecord
没有flush()
方法。所以也许我应该做
while (true) {
sleep(0,nanoSeconds);
audioRecord.startRecording();
audioRecord.read(buf, 0, numSamples);
audioRecord.stop();
}
当然,我找不到足够详细的文档说明 startRecording()
、read()
和 stop()
做了什么他们实际上谈论缓冲区的地方。似乎没有任何方法可以告诉我缓冲区中是否有样本。或者让我调用 read() 来读取所有现有缓冲区:我需要指定要读取的样本数,我的调用将阻塞,直到这些样本存在。
我希望有人能告诉我哪里有更真实的记录。但几乎一样好,只要告诉我如果我真的想在非常准确确定的开始时间启动麦克风我应该怎么做。
最佳答案
在这种情况下,源代码可能比文档更有帮助。 Android 的大多数媒体类都是 native 代码的薄包装。 startRecording()
method方法,例如,简单地调用 android_media_AudioRecord_start()
在 JNI 层中,它依次调用原生 AudioRecord instance 上的 start()
.除此之外,它还与 AudioFlinger
接口(interface)最后是硬件驱动程序。硬件延迟几乎肯定会因设备而异,并且组件通常不是为高精度工作而设计的。
话虽如此,如果您可以对您的应用程序将在其上运行的硬件做出一些假设,那么通读上面链接的 native 代码可能会有所帮助。如果您愿意编写一些 C++ (JNI) 代码,则可以通过操作 AudioRecord
的实例来访问音频缓冲区。祝你好运!
关于java - 如何刷新 AudioRecord 对象中的缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148995/