java - 如何刷新 AudioRecord 对象中的缓冲区?

标签 java android audio media

我正在尝试从我的 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/

相关文章:

java - Spring mvc ajax 文件上传导致 415(不支持的媒体类型)

java - 从 jTDS JDBC 驱动程序迁移到 Microsoft JDBC

java - 如何在 Maven 构建中查找峰值内存使用情况

android - 请将 AdActivity 的主题设置为@android :style/Theme. Translucent 以启用透明背景插屏广告

android - Chrome 地址栏未隐藏在滚动条上

java - Android 应用程序 : Facebook LoginManager gives me "publish_actions" permission but app never goes through callbackManager callback( Facebook SDK 4. 18.0)?

android - 消除音量信封重新触发点击 - Android 上的 Jsyn

ios - 如何快速显示计量值?

java - 使用java反射调用spring bean

javascript - IE8 的音频标签替代方案