0

编辑:

通过在我的 for 循环末尾添加,我能够防止readIntoBuffer返回 false 。audioFileB.framePosition = 0;但是,现在看起来 bufferB 仅包含来自最终readIntoBuffer调用的音频(我的不完整循环)。有谁知道为什么我的缓冲区在每次 readIntoBuffer 调用后丢弃以前加载到其中的数据?

原始问题:

我有两个 AVAudioFile,audioFileAaudioFileB,其中 A 的持续时间比 B 长(可能是好几倍)。我想创建两个足够大的 AVAudioPCMBuffers 来保存 audioFileA,用 audioFileA 的数据填充其中一个,并一遍又一遍地用 audioFileB 的数据填充另一个,直到缓冲区已满。换句话说,第二个缓冲区应该包含 audioFileB 中音频的“循环”。这是我的尝试:

AVAudioFile *audioFileA = ...
AVAudioFile *audioFileB = ...
AVAudioPCMBuffer * bufferA = [[AVAudioPCMBuffer alloc] audioFileA.processingFormat frameCapacity:(AVAudioFrameCount)audioFileA.length];
AVAudioPCMBuffer * bufferB = [[AVAudioPCMBuffer alloc] audioFileB.processingFormat frameCapacity:(AVAudioFrameCount)audioFileA.length];
NSError *bufferAError;
NSError *bufferBError;
BOOL bufferASuccess;
BOOL bufferBSuccess;

int timesLarger = audioFileA.length / audioFileB.length;
int remainder = audioFileA.length % audioFileB.length;
for (int i = 0; i < timesLarger; i++) {
    bufferBSuccess = [audioFileB readIntoBuffer:bufferB frameCount:(AVAudioFrameCount)audioFileB.length error:&bufferBError];
    if (!bufferBSuccess || bufferBError != NULL) {
        break;
    }
}
// once we're done appending all of the complete loops (if any) then add the remaining audio to the end of the buffer
if (bufferBSuccess && bufferBError == NULL) {
    bufferBSuccess = [audioFileB readIntoBuffer:bufferB frameCount:(AVAudioFrameCount)remainder error:&bufferBError];
}

问题是[audioFileB readIntoBuffer:bufferB frameCount:(AVAudioFrameCount)audioFileB.length error:&bufferBError]当它被多次调用时返回 false 。关于我如何做到这一点的任何想法?

4

0 回答 0