修改
我能够通过在for循环结束时添加audioFileB.framePosition = 0;
来阻止 readIntoBuffer 返回false。但是,现在看起来bufferB只包含来自最终 readIntoBuffer 调用的音频(我的不完整循环)。有没有人知道为什么我的缓冲区在每次readIntoBuffer调用后丢弃以前加载到它的数据?
原始问题:
我有两个AVAudioFiles, audioFileA 和 audioFileB ,其中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。关于如何实现这一目标的任何想法?