我一直試圖在我的SpriteKit遊戲中播放音樂,並使用AVAudioPlayerNode
類來通過AVAudioPCMBuffer
s來播放音樂。每次我導出我的OS X項目時,它都會崩潰,並給我一個關於音頻播放的錯誤。在過去的24小時內,我的頭撞牆後,我決定重新觀看WWDC session 501(見54:17)。我對此問題的解決方案是演示者使用的方法,即將緩衝區的幀分成更小的片段以分解正在讀取的音頻文件。音樂文件AVAudioPCBuffer
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:
方法時,緩衝區是否被覆蓋?我很喜歡這個東西......我怎麼才能讓整個文件播放?
如果我不能得到這個工作,跨多個SKScene
s播放音樂(2個不同的文件)的好方法是什麼?