2010年4月4日日曜日

iPhoneアプリで簡単に効果音などを再生するには?

iPhoneアプリで音を再生するにはいくつも方法があるようで、正直迷う。

効果音など単純な音を再生する場合はできるだけ簡単な方法を選ぶべきだが、色々見たなかではAVAudioPlayerが便利で簡単そうだ。

例えばこのようにする。

//AVAudioPlayerの初期化と音再生
NSError *errPlayer;
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"sound" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *player = [AVAudioPlayer alloc];
[player initWithContentsOfURL:url error:&errPlayer];
if (errPlayer) {
  NSLog(@"AVAudioPlayer初期化失敗:%@\n", errPlayer);
}
[player prepareToPlay];
[player play];

これでメインバンドルのリソースにある「sound.wav」を再生できる。

一つ目のポイントはAVAudioPlayerの初期化時に「&errPlayer」をわたすことだ。「&」がポイント。ポインターってことかな?

もうひとつのポイントは、AVAudioPlayerを自分でallocしているので、後で適当なタイミングでreleaseしてやる必要があることだ。面倒なのでと思ってautoreleaseをつけて初期化するのを試したが、音が再生できなくなったのでこれはダメらしい。

このコードをコンパイルするには、AVFoundation.frameworkをリンクして、ヘッダーに「#import <AVFoundation/AVFoundation.h>」を加える必要がある。

AVAudioPlayerは単純とはいっても、ボリューム調整やループ再生、再生位置の指定、残り再生時間、メータリングなど、通常の音再生に必要なほとんどの機能を持っている。

リアルタイム性や音加工など、高度な処理が必要ないなら、やはりこれだろう。

10.04.12追記:
この方法はiPod再生時にiPodを勝手にフェードアウトして停止させてしまうことがわかった。これで都合がヨロシクない場合は、AudioToolboxを使う。
琴線探査: iPhoneアプリで簡単に効果音などを再生するには?(AudioToolbox編)

10.04.21追記:
iPodの再生と共存させるには、AudioSessionを使えばよいことがわかった。
琴線探査: iPhoneの標準カメラアプリのシャッター音の鳴り方と同様にアプリで効果音を鳴らすには?