AudioRecord缓冲区如何工作/如何使用它

时间:2013-06-06 18:55:29

标签: android buffer audiorecord

我正在玩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],0,1000)时是否在内部处理?这会给我最后1000个样本,前1000个样本吗?第二个参数(偏移量)偏移它在readData参数中写入的位置,据我所知。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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