2010-11-23 10 views
1

私は再生したい音の束を持っています。今はAVAudioPlayerを使用しています。ユーザーがボタンをクリックすると、新しいサウンドが開始されます。 AVAudioPlayerのurlプロパティは読み取り専用です。私はむしろ、新しいサウンドを鳴らすたびにオブジェクトを解放して再割り当てする必要はありません。これを行う最善の方法は何でしょうか?私は使用する必要がある別のクラスがありますか?iphoneで一度に1つずつ異なるサウンドを再生する最も良い方法は?

+0

私はAVAudioPlayersの配列を各サウンドに1つずつ作成することを考えていますが、それは過度のようです。 – Marty

答えて

1

サウンドを再生する最も簡単な方法は、Playing UI Sound Effects or Invoking Vibration Using System Sound Servicesです。基本的にはAudioServicesCreateSystemSoundID()とAudioServicesPlaySystemSound()を呼び出します。システムサウンドを作成することは、比較的高価であり、それはAudioServicesDisposeSystemSoundID(に配置されていますとき、再生は停止します)とにかく、あなたは実際にそれらをキャッシュしたい:

  • アプリの起動(または多分サウンドが再生されて1回目)でそれらを作成します。サウンドファイル名でキー入力されたNSDictionaryにそれらを保持し、NSValueにサウンドIDを格納することができます。
  • 気になる場合は、アプリが終了したとき、バックグラウンドになっているとき、またはメモリ警告時に処分することができます。

"システムサウンド"でサポートされているサウンドフォーマットはほとんどありません。リンゴはIMA4(afconvert -f caff -d ima4 input.file output.cafと、場合によっては-c 1)をお勧めします。

これは、一度に1つのサウンドを気にしない限り、短いサウンドを再生するのに非常にぴったりです(既に再生中のサウンドを再生すると再生を再開します)。私はそれがカーネルによって直接演奏されているのではないかと推測しています(あなたのアプリケーションが終了したときに再生を継続させるフラグを設定することができます)。 はAVAudioPlayerが再生するサウンドとミックスすることがあります。

+0

これに私の自発的な反応は、hm ...私はAppleがちょうど良いものを達成するために失敗したと思う 'シンプルなものは単純で複雑なものが可能でなければならない'べきである。しかし、たぶん普遍的なwavebuffer +ミキサーのソリューションがありますか? –

+0

これは、私が難しい方法を見ていないのが一番簡単な方法ですか? – Marty

+0

@Henrik Erlandsson確かに、オーディオは概念的にシンプルですが、高性能オーディオAPIは、処理するハードウェアコーデック。カーネルにPCMや単に圧縮されたオーディオを再生するように頼むことは、完璧に賢明であり、オーバーヘッドは最小限に抑えられるはずですが、カーネル内のMP3デコーダは望ましくありません。 –

関連する問題