2

UIButtonを押したときに再生するために、タップ音を追加しようとしています。これまでに2つの方法を試しましたが、期待したほどうまくいった方法はありませんでした。

  1. 単純なSystemSoundsを使用してみましたが、ユーザーがオーディオの音量を制御できない(または非常に制限されている)ため、これらは醜い解決策です。

  2. また、次の形式でAVAudioPlayerを試しました(ViewControllerのinitメソッドで呼び出されます)。

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient 
                                           error:nil];
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    [[AVAudioSession sharedInstance] setDelegate:self];
    
    NSString *filePath = [[NSBundle mainBundle] 
                         pathForResource: @"button_pushed"
                                  ofType: @"wav"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: filePath];
    self.buttonPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                                               error: nil];
    [buttonPlayer prepareToPlay];
    [buttonPlayer setDelegate: self];
    

この2番目の方法は、最初の方法よりもはるかにうまく機能しているように見えました。特に、次のステートメントでサウンドを呼び出した場合:

    if (self.clickPlayer.playing) {
        [self.clickPlayer stop];
        self.clickPlayer.currentTime = 0;
        [self.clickPlayer play];
    }
    else {
        [self.clickPlayer play];
    }

上記により、ボタンを繰り返し押したときに非常に高速な応答が得られました。ちなみに、私のアプリでは応答時間が速いことが不可欠ですが、残念ながら、この2番目の方法は失敗します。

アプリケーションを約10秒間アイドル状態にすると、最初のサウンドのロードにかなりの遅延が発生します(その後、高速になり、再び応答します)。それだけでなく、ボタンが押されるのを遅らせます。この遅延は非常に小さいですが(おそらく1秒未満)、残念ながら、アプリケーションのユーザビリティに影響を与えます。まるでサウンドの割り当てが自動的に解除され、しばらく使用しないたびに初期化するか、メモリに入れる必要があるかのようです。

サウンドを常に利用可能に保ち、ボタンサウンドを実装するための遅延または別の、おそらく単純な方法を回避するための回避策はありますか?

さらにいくつかの情報:1。ARCを使用しています2. IBを使用していません3.現在、オーディオデリゲートメソッドは実装されていません4.他のアプリケーションからバックグラウンドでオーディオを再生する機能は重要です5.遅延が発生しましたiPhone5の場合; だから、私はそれがそれほど強力でないデバイスでどれくらいかかるか想像することができるだけです...

4

2 に答える 2

1

私はこの問題を解決するために、小さな.wavファイルを無音で継続的に起動する「空白の」プレーヤーを作成し、AVPlayerを存続させました。これはおそらく最も洗練されたソリューションではありませんが、プログラムのパフォーマンスに影響を与えないように見えますが、機能します。これがあなたがする必要があることです:

  1. 0.1秒の長さのサイレント.wavファイルを作成します(小さいほど良い)。

  2. そのためのプレーヤーを初期化します:

    NSString *filePath = [[NSBundle mainBundle] pathForResource: @"silence"
                                                         ofType: @"wav"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: filePath];
    silencePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL
                                                           error: nil];
    [silencePlayer prepareToPlay];
    [silencePlayer setDelegate: self];
    
  3. 次に、1秒ごとに発火させます。

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                             target:self
                                           selector:@selector(repeatSilence)
                                           userInfo:nil
                                            repeats:YES];
    
  4. 最後に、呼び出されたメソッド(-(void)repeatSilence {})を作成して、サウンドを再生します。

    if (self.silencePlayer.playing) {
        [self.silencePlayer stop];
        self.silencePlayer.currentTime = 0;
        [self.silencePlayer play];
    }
    else {
        [self.silencePlayer play];
    }
    
于 2013-01-05T10:13:10.790 に答える
0

完全にはわかりませんが、パスのNSDataを作成してに変更[[AVAudioPlayer alloc] initWithContentsOfURLすると、より速くなりません[[AVAudioPlayer alloc] initWithDataか?

于 2013-01-05T03:26:48.427 に答える