我想知道你们是否有解决方案: 我想录制并保持10秒的音频缓冲区(剂量必须为10),但仅记录最后10秒的音频! 防爆。我录制了十秒钟,然后第一个录制的秒数被覆盖,一个新的One被添加到最后! 我的第一个是循环缓冲区,开始指针只是移动! 我的问题不是循环缓冲区,问题在于如何处理音频样本到缓冲区!我理解它有点棘手!而且,你还需要进一步的表达吗?
(可能是糟糕的英语,愚蠢的自动纠正)
预先谢谢!
答案 0 :(得分:0)
您可以每十秒钟录制两个音频文件并重复使用最后一个(因为您还有另外10秒的记录,但您不需要这样做)。当用户停止记录时,您将当前记录与先前记录的文件的最后一个(10-6)秒组合起来,即6秒。我现在无法想到任何其他事情。然而,实施起来却很棘手,但我相信它可以做到。
答案 1 :(得分:0)
此处示例假设使用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至end)