1

ユーザーがテストを受けているときにサウンドを再生するiPhoneアプリがあります。遅延があるときにサウンドが初めて再生される場合を除いて、うまく機能します。サウンドをメモリにロードすると仮定します。サウンドをプリロードするにはどうすればよいですか? サウンドのコードは次のとおりです。

- (void)doBuzz:(id)sender {
SystemSoundID buzzsoundID;
NSString *buzzsoundFile = [[NSBundle mainBundle]
                           pathForResource:@"buzz" ofType:@"caf"];

AudioServicesCreateSystemSoundID((CFURLRef)
                                 [NSURL fileURLWithPath:buzzsoundFile]
                                 , &buzzsoundID);
AudioServicesPlaySystemSound(buzzsoundID);

}

4

3 に答える 3

2

AVAudioPlayerセットアップして再利用できる を見てください。しかし、もっと重要なことは、セットアップ時に、サウンドをメモリにプリロードする「再生の準備」を指示できることです。つまり、実際にプレーヤーに再生するように指示すると、すぐに再生されます。AVAudioPlayer便利なことに、最近、オブジェクトを作成して返す何かのためにこのメソッドを書きました。

+(AVAudioPlayer *)playerForFile:(NSString *)ファイル名
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"caf"];
    NSURL *url = [NSURL fileURLWithPath:filePath];
    NSData *soundData = [NSData dataWithContentsOfURL:url];
    NSError *エラー = nil;
    AVAudioPlayer *player = [[[AVAudioPlayer alloc] initWithData:soundData エラー:&error] autorelease];
    もし(エラー)
        NSLog(@"%@ のプレイヤー作成エラー: %@", fileName, [エラーのローカライズされた説明]);

    return (error ? nil : player);
}

アプリのどこかで、次のようにプレーヤー オブジェクトをセットアップできます。

AVAudioPlayer *buzzSoundPlayer = [MyClass playerForFile:@"buzz"];
if (buzzSoundPlayer) {
    [buzzsoundPlayer prepareToPlay];
}

音を鳴らしたいとき:

[buzzSoundPlayer setCurrentTime:0];
[buzzSoundPlayer play];

サウンドの再生が終了すると、「現在の時間」が最後になるため、再生するたびに現在の時間を 0、つまりサウンド ファイルの先頭に設定する必要があります。したがって、それを再生するための後続のリクエストは何も再生しません。そのため、現在の時刻を最初に戻します。

プレーヤーにもをセットアップしdelegateて、サウンドの再生が終了したときにデリゲート メソッドを介して通知を受け取ることができます。または、現在の時刻を 0 にリセットすることもできます。

AVAudioPlayer、およびについてAVFoundationは、Apple のドキュメントですべて読むことができます。

于 2012-10-24T19:35:11.813 に答える
-1

を使用してサウンドをプリロードしperformSelectorInBackground:@selector(<SELECTOR>)ます。

また、実際にタッチするのではなく、アプリケーションの開始時またはその前のどこかにファイルをロードすることもできます。

于 2012-10-24T18:53:03.047 に答える