3

我正在尝试从我的 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();
}

当然,我无法找到关于 what startRecording(), read(), and stop()do 的详细文档,以了解他们实际谈论缓冲区的位置。似乎没有任何方法可以调用来告诉我缓冲区中是否有样本。或者让我进行一个读取所有现有缓冲区的 read() 调用:我需要指定要读取的样本数,并且我的调用将阻塞,直到这些样本存在。

我很想有人告诉我这是在哪里更真实地记录下来。但几乎一样好,只要告诉我如果我真的想在一个非常准确确定的开始时间启动麦克风我应该怎么做。

4

2 回答 2

1

在这种情况下,源代码可能比文档更有帮助。大多数 Android 的媒体类都是原生代码的薄包装。例如,method 方法简单地调用JNIstartRecording()android_media_AudioRecord_start(),而 JNI 层又调用start()原生AudioRecord 实例。除此之外,它还与硬件驱动程序交互,AudioFlinger并最终与硬件驱动程序交互。硬件延迟几乎肯定会因设备而异,并且组件通常不是为高精度工作而设计的。

话虽如此,如果您可以对运行应用程序的硬件做出一些假设,那么阅读上面链接的本机代码可能会有所帮助。如果您愿意编写一些 C++ (JNI) 代码,您可以通过操作AudioRecord. 祝你好运!

于 2012-10-31T00:11:42.010 回答
0

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

有关详细信息,请参阅文档

于 2016-10-09T20:48:14.870 回答