Android 录音缓冲区如何工作/如何使用

Android 录音缓冲区如何工作/如何使用,android,buffer,audiorecord,Android,Buffer,Audiorecord,我正在使用Android AudioRecord库,试图让应用程序不断地从audioBuffer读取数据。我认为要让我的应用程序正常工作,我需要更好地理解如何使用构造函数初始化缓冲区 例如,如果我初始化一个新的AudioRecord对象: recorder = new AudioRecord(AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 2205000);

我正在使用Android AudioRecord库,试图让应用程序不断地从audioBuffer读取数据。我认为要让我的应用程序正常工作,我需要更好地理解如何使用构造函数初始化缓冲区

例如,如果我初始化一个新的AudioRecord对象:

recorder = new AudioRecord(AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 2205000); //50 seconds worth
在应用程序中,我希望在这里初始化的缓冲区中保留最后50秒的数据,但我希望定期提取最后10秒的数据(如果满足条件,则提取整个50秒)

首先,据我所知,
recorder.read(short readData[…)
函数将内部缓冲区的一部分复制到我传入的数组(?)中

我猜内部缓冲区是某种环形缓冲区,那么我如何知道最后一个样本是什么?或者当我调用
recorder.read(short readData[1000],01000)
?这会给我最后1000个样本,前1000个样本?第二个参数(offset)据我所知,它在readData参数中写入的偏移量


谢谢!

当您调用
recorder.read(…)
函数时,sizeInBytes参数指定要从内部缓冲区读取多少字节,从缓冲区中尚未读取的最旧数据开始。offsetInBytes参数指代传入的数组,而不是内部缓冲区

如果要读取整个缓冲区(50ms),则需要传入一个数组(长度>=2205000)并且大小为2205000字节。如果您只需要最近10秒,那么您仍然需要读取整个缓冲区,最近10秒将是返回的最后441000字节。请注意,您不一定总是返回2205000字节;如果您尝试以<50毫秒的间隔读取此数量的数据,则n每次读取时,您只需获取可用的任何数据。但最新的数据将始终位于返回的数据的末尾