はじめに
動画を再生する画面の実装にあたり、バックグラウンドで流している音楽等のサウンドに干渉した場合の調整方法に調べました。
環境
Xcode15
内容
アプリのバックグラウンド再生されているオーディオのコントロールには、AVAudioSession
を使うことで実現できる。
AVAudioSession
でiOSのオーディオセッションの管理ができ、アプリがどのようにオーディオを扱うかをシステムに伝えることができる。
import AVFoundation
func configureAudioSession() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.playback, mode: .default)
try audioSession.setActive(true)
} catch {
print("Audio Session configuration failed.")
}
}
setCategory
セッションカテゴリを設定することで一連のオーディオ動作を定義することができる。
Category
は必須で必要。Mode
, RouteSharingPolicy
, CategoryOptions
を設定することでより細かい定義ができる
func setCategory(
_ category: AVAudioSession.Category,
mode: AVAudioSession.Mode,
policy: AVAudioSession.RouteSharingPolicy,
options: AVAudioSession.CategoryOptions = []
) throws
AVAudioSession.Category
ambient
サウンドの再生が主要ではないアプリのカテゴリ
他のアプリの音声が自分の音声と混ざる
サイレントスイッチを使用すると、音声が聞こえなくなる
multiRoute
オーディオ データの個別のストリームを同時に異なる出力デバイスにルーティングするためのカテゴリ
playAndRecord
VoIP(Voice over Internet Protocol)アプリなど、音声の録音(入力)と再生(出力)を行うカテゴリ
サイレントスイッチを設定もしくは画面をロックした状態でもオーディオは継続される
playback
録音された音楽やその他のサウンドを再生するためのカテゴリ
サイレントスイッチを設定し画面をロックした状態でもオーディオは継続される
record
再生音声を消音しながら音声を録音するカテゴリ
セッションがアクティブである限り、システム上のすべての出力を無音にする効果がる
予期しないサウンドが再生されるのを防ぐ必要がなければ、playAndRecord
を使う
電話やアラームなど、ミキシング不可能なオーディオセッションの中断を防ぐことはできない
soloAmbient
デフォルトのカテゴリ
画面ロックとサイレントスイッチによって消音される
ミキシングを許可するには、ambient
を使う
setActive
指定されたオプションを使用してアプリのオーディオセッションをアクティブまたは非アクティブにできる。
他のオーディオセッションの方が優先順位が高く(電話など)、どちらのオーディオセッションもミキシングを許可していない場合、セッションのアクティブ化には失敗する。
func setActive(
_ active: Bool,
options: AVAudioSession.SetActiveOptions = []
) throws
自分のアプリのオーディオセッションを停止したことを、システムが他のアプリに通知することを示すオプション
setActive
にfalseを渡してオーディオセッションを非アクティブにする時のみ使うオプション
おわりに
ドキュメントを読むとユースケースごとに細かな設定ができそうな印象でした。
デフォルト値と必須な設定項目を把握したらあとはユースケースごとに調整するのが良さそうです。
参考