2012-10-30 41 views
3

我想从我的android设备上的麦克风获得非常准确的定时录音。我的想法是像如何在AudioRecord对象中刷新缓冲区?

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()调用,读取所有现有的缓冲区:我需要指定要读取的样本数,并且我的调用将阻塞,直到这些样本存在。

我很乐意有人向我展示这是更真实的文件。但几乎一样好,只要告诉我,如果我真的想让麦克风以非常准确的开始时间开始,我该怎么做。

回答

1

在这种情况下,源代码可能比文档更有帮助。大多数Android的媒体类都是围绕本机代码的简单包装。例如,startRecording() method方法简单地在JNI层中调用android_media_AudioRecord_start(),该JNI层继而在本地AudioRecord instance上调用start()。除此之外,它还与AudioFlinger以及最终的硬件驱动程序接口。不同设备之间的硬件延迟几乎肯定会有所不同,而且这些组件通常不是针对高精度工作而设计的。这就是说,如果你可以对你的应用程序运行的硬件做一些假设,那么通过上面链接的本地代码来阅读可能会有所帮助。如果您愿意编写一些C++(JNI)代码,则可以通过操纵AudioRecord的实例来访问音频缓冲区。祝你好运!

0

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

查看详情documentation