Я пытался воспроизвести музыку в своей игре SpriteKit и использовал для этого класс AVAudioPlayerNode
через AVAudioPCMBuffer
s. Каждый раз, когда я экспортировал свой проект OS X, он зависал и выдавал ошибку, связанную с воспроизведением звука. Бившись головой о стену последние 24 часа, я решил пересмотреть сессию WWDC. 501 (см. 54:17). Моим решением этой проблемы было то, что использовал докладчик, а именно разбить кадры буфера на более мелкие части, чтобы разбить читаемый аудиофайл.
NSError *error = nil;
NSURL *someFileURL = ...
AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading: someFileURL commonFormat: AVAudioPCMFormatFloat32 interleaved: NO error:&error];
const AVAudioFrameCount kBufferFrameCapacity = 128 * 1024L;
AVAudioFramePosition fileLength = audioFile.length;
AVAudioPCMBuffer *readBuffer = [[AvAudioPCMBuffer alloc] initWithPCMFormat: audioFile.processingFormat frameCapacity: kBufferFrameCapacity];
while (audioFile.framePosition < fileLength) {
AVAudioFramePosition readPosition = audioFile.framePosition;
if (![audioFile readIntoBuffer: readBuffer error: &error])
return NO;
if (readBuffer.frameLength == 0) //end of file reached
break;
}
Моя текущая проблема заключается в том, что проигрыватель воспроизводит только последний кадр, прочитанный в буфер. Музыка, которую я играю, длится всего 2 минуты. По-видимому, это слишком долго, чтобы просто читать в буфер напрямую. Буфер перезаписывается каждый раз, когда внутри цикла вызывается метод readIntoBuffer:
? Я такой нуб в этом деле... как я могу воспроизвести весь файл?
Если я не могу заставить это работать, как можно воспроизвести музыку (2 разных файла) на нескольких SKScene
?