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:
メソッドがループ内で呼び出されるたびにバッファが上書きされていますか? 私はこのようなことにとても慣れていません...どうすればファイル全体を再生できますか?
これを機能させることができない場合、複数SKScene
の で音楽 (2 つの異なるファイル) を再生する良い方法は何ですか?