2012-10-30 40 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