0

編集:

for ループの最後に追加することで、 readIntoBufferが false を返すのを防ぐことができました。audioFileB.framePosition = 0;ただし、現在、 bufferB には最後のreadIntoBuffer呼び出し (私の不完全なループ) からのオーディオのみが含まれているようです。各 readIntoBuffer 呼び出しの後に、以前にバッファにロードされたデータをバッファが破棄する理由を知っている人はいますか?

元の質問:

私は 2 つの AVAudioFiles、audioFileAaudioFileBを持っています。ここで、A は B よりも長い持続時間 (おそらく数倍) を持っています。audioFileA を保持するのに十分な大きさの 2 つの AVAudioPCMBuffers を作成し、そのうちの 1 つに audioFileA のデータを入力し、もう 1 つに audioFileB のデータをバッファがいっぱいになるまで何度も入力したいと考えています。つまり、2 番目のバッファーには、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