【问题标题】:How does AudioRecord buffer work/how to use itAudioRecord 缓冲区如何工作/如何使用它
【发布时间】:2013-06-06 18:55:29
【问题描述】:

我正在使用 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 参数中写入的位置。

谢谢!

【问题讨论】:

    标签: android buffer audiorecord


    【解决方案1】:

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

    如果您想读出整个缓冲区(50 毫秒),那么您需要传入一个数组(长度 >= 2205000)和一个 2205000 的 sizeInBytes。如果您只想要最近的 10 秒,那么您仍然有读取整个缓冲区,最近 10 秒将是返回的最后 441000 个字节。请注意,您不一定总是返回 2205000 个字节;如果您尝试以

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      相关资源
      最近更新 更多