我想知道你们是否对此有解决方案:
我想录制并保存10秒的音频缓冲区(必须为10秒),但最后录制的秒数只有10秒!
例如我录制了十秒钟,然后覆盖了最初录制的几秒钟,并在末尾添加了一个新的!
我的第一个想法是一个圆形缓冲区,开始指针在其中移动!
我的问题不是循环缓冲区,问题出在如何将音频样本处理到缓冲区中!让我理解有点棘手!和思想,还是您需要进一步的封杀?

(可能是英语不好,愚蠢的自动纠正)

前谢谢!

最佳答案

在此示例假定使用AudioRecord

 short[] myCircularBuffer = new short[samplingRate * lengthInSeconds];
 int bufPos = 0;

 AudioRecord audioRecord = ...

 audioRecord.startRecording();
 while (!finish_condition) {
     int cnt = audioRecord.read(myCircularBuffer, bufPos, myCircularBuffer.length - bufPos);
     if (cnt < 0) break; // some error was
     bufPos += cnt;
     if (bufPos >= myCircularBuffer.length) bufPos -= myCircularBuffer.length;
     // *
 }

// *-此时,您的缓冲区有两个部分,分别为10秒,从bufPos到(myCircularBuffer.length-1)(包括两端),然后从0到(bufPos-1)(包括两端)。

注意,当记录刚刚开始时,缓冲区将包含未擦除的先前数据(最初为零),因此最好在缓冲区未完全填充时进行处理。例如:
boolean bufferWrapped = false;
while (...) {
    ...
    if (bufPos >= myCirculatBuffer.length) {
       bufPos -= myCirculatBuffer.length;
       bufferWrapped = true;
    }
}

最后,仅当bufferWrapped == true时,才需要使用尾部(从bufPos到尾部)

关于java - 循环录音,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31403696/

10-12 06:08