1

SpriteKit ゲームで音楽を再生しようとしていて、AVAudioPlayerNodeクラスを使用してAVAudioPCMBuffers. 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 つの異なるファイル) を再生する良い方法は何ですか?

4

1 に答える 1