如何多次将AVAudioFile读入同一个AVAudioPCMBuffer?

时间:2017-09-25 18:34:43

标签: ios objective-c avaudioengine avaudioplayernode avaudiofile

修改

我能够通过在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。关于如何实现这一目标的任何想法?

0 个答案:

没有答案