Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

iOSのオーディオまわり(CoreAudio)まとめ

More than 5 years have passed since last update.

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
  • こちらも低レイテンシで再生が可能
  • 「オーディオユニット」という、オーディオデータに対して特定の処理を行うプラグインがあり、これを好きなようにつなげていくことで、再生時のオーディオデータの捌き方をカスタマイズできるイメージ。
Kta-M
fusic
個性をかき集めて、驚きの角度から世の中をアップデートしつづける。
https://fusic.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away