【问题标题】:How do I flush buffer in AudioRecord object?如何刷新 AudioRecord 对象中的缓冲区?
【发布时间】:2012-10-30 23:18:43
【问题描述】:

我正在尝试从我的 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() 调用:我需要指定要读取的样本数量,并且我的调用将阻塞,直到这些样本存在。

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

【问题讨论】:

    标签: java android audio media


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      详情请参阅documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-21
        • 2010-09-20
        • 1970-01-01
        • 2015-08-10
        • 2021-09-03
        • 2012-11-09
        • 1970-01-01
        相关资源
        最近更新 更多