圆形录音

时间:2015-07-14 10:10:56

标签: java android audio recording

我想知道你们是否有解决方案: 我想录制并保持10秒的音频缓冲区(剂量必须为10),但仅记录最后10秒的音频! 防爆。我录制了十秒钟,然后第一个录制的秒数被覆盖,一个新的One被添加到最后! 我的第一个是循环缓冲区,开始指针只是移动! 我的问题不是循环缓冲区,问题在于如何处理音频样本到缓冲区!我理解它有点棘手!而且,你还需要进一步的表达吗?

(可能是糟糕的英语,愚蠢的自动纠正)

预先谢谢!

2 个答案:

答案 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)