iOSでサウンドの再生をしたい。
でもいろいろな再生方法があって、ややこしいので整理しておく。
公式ドキュメント:Core Audioの概要
なお、OSXでしか扱えないものは割愛している。iOS特化。
CoreAudioアーキテクチャ
iOSでは、オーディオまわりの機能はCoreAudioというアーキテクチャにまとめられている。
iOSのCoreAudioは5つののフレームワークから成り、各フレームワークにはサービスと呼ばれる各種機能が入っていたりいなかったり。
- AVFoundation.framework
- AVAudioPlayerクラス(サービスに分類)
- AudioToolbox.framework
- Audio Converter Services
- Audio File Services
- Audio File Stream Services
- Audio Format Services
- Audio Processing Graph Services
- Audio Queue Services
- Audio Session Services(iOS7.0から非推奨)
- System Sound Services
- AudioUnit.framework
- Audio Unit Services
- OpenAL.framework
- OpenAL(サービスに分類)
- CoreAudio.framework
フレームワーク概要
AVFoundation.framework
iOS専用のフレームワーク(OSXでは使えない)。
これだけObjective-Cインターフェイス。
オーディオの再生と録音を行う。ビデオも扱える。
AudioToolbox.framework
オーディオファイルの再生や録音、フォーマット変換などを行う。
サイズの大きいデータを少しずつ分割して読み込みながら再生する、ストリーミング再生もできる。
普通にサウンドを扱うだけならこれで十分。
AudioUnit.framework
「オーディオユニット」と呼ばれるオーディオ処理用のプラグインを使用するためのインターフェースを提供する。
任意長のサウンド再生や複数サウンドの同時再生など、低レベルな制御を行う。
凝ったことをしようとしたらこれを使わないといけない。
OpenAL.framework
オープンソースのクロスプラットフォームAPI、OpenALを使用するためのフレームワーク。
3Dサウンドが扱えたりする。ゲームとの親和性が高い。
CoreAudio.framework
すべてのCore Audioのサービスに共通のデータ型や、ハードウェアとのやり取りに使用する低レベルのAPI。
サウンド再生関連サービス概要
サウンドが再生できるサービスはこちら。お手軽順(OpenALの位置が難しいとこだけど)。
- System Sound Services(AudioToolbox.framework)
- AVAudioPlayerクラス(AVFoundation.framework)
- Audio Queue Services(AudioToolbox.framework)
- OpenAL(OpenAL.framework)
- Audio Unit Services(AudioUnit.framework)
System Sound Services(AudioToolbox.framework)
一番お手軽だけど機能がかなり限られる。
その名の通りシステムサウンド向け。
- 30秒以下のサウンドファイルを再生する
- リニアPCMまたはIMA4(IMA/ADPCM)フォーマット / .caf、.aif、.wav
- 複数同時再生不可
- ボリューム制御不可
- ループ不可
AVAudioPlayerクラス(AVFoundation.framework)
おそらく大抵の場合はこれで機能的には事足りると思う。
- ファイルだけでなくメモリバッファからのサウンド再生も可能
- 任意の長さのサウンドの再生が可能
- 複数同時再生可
- ボリューム制御可
- ループ可
- サウンドファイル内での特定の位置へのシークが可能
- .aif, .caf, .mp3, .aac, .m4a, .mp4, .wav
以降、AVAudioPlayerクラスと同じことはできるみたい。
Audio Queue Services(AudioToolbox.framework)
- 再生したいデータアプリケーション側で用意したバッファに入れ、それをキューにためていくと順次再生してくれる方式
- ストリーミング再生だったり、長いオーディオファイルの部分部分を任意の順番で再生だったりに向いている
OpenAL(OpenAL.framework)
- 以下の3つの要素からなる
- Buffer: オーディオデータを管理
- Source: Bufferにあるデータを使って音を発生させるオブジェクト。3次元空間に配置する
- Listener: Sourceの発生させた音を聞き取るオブジェクト。3次元空間に配置する
- SourceとListenerの位置関係によって、3次元的な音の再生が可能(ドップラー効果やパンニングなど)
- 再生開始までのタイムラグが少ない(低レイテンシ)ので、ゲームのように画面表示と同期させて音を鳴らしたいときなどによい。
Audio Unit Services(AudioUnit.framework)
- 一番ハードウェアに近い低レベルAPI
- こちらも低レイテンシで再生が可能
- 「オーディオユニット」という、オーディオデータに対して特定の処理を行うプラグインがあり、これを好きなようにつなげていくことで、再生時のオーディオデータの捌き方をカスタマイズできるイメージ。