AVPlayerやAVAudioPlayerなどで音声再生や動画再生の実装をする場合デフォルトのままだとアプリをバックグラウンドへ移行したりスリープをした時に再生が自動で停止します。
以下の実装を行うことで再生を継続させることができます。
簡単な手順でOKです。
手順1
- プロジェクトファイルを開く
- メニュー -> Editor -> Add Capability -> Background Modesを選択
- Audio, AirPlay, and Picture in PictureのチェックマークをONにする
手順2
プロジェクト内の任意の場所に以下のコードを書きます
// アプリ初期化時等
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
} catch _ {
NSLog("audio session set category failure")
}
// 音声、動画再生時
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch _ {
NSLog("audio session active failure")
}
注意点として、上記の実装をしているともし別のアプリで音声を再生している場合
上記のsetActiveが呼び出された時点で別アプリの音声再生が停止します。
なのでsetActiveは自分のアプリでの音声再生を開始する時点で呼ぶのが望ましいです。
他アプリの音声再生を停止せずに再生する方法
AVAudioSessionのsetCategory時にoptionを設定します
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback,
options: [AVAudioSession.CategoryOptions.mixWithOthers])
} catch _ {
NSLog("audio session set category failure")
}
上記はmixWithOthersを指定しましたが、duckOthersというのも存在します
違いは
- mixWithOthers → 他アプリの音声の音量を下げない
- duckOthers → 他アプリの音声の音量を下げる
場面に応じて使い分けましょう!
他のoption
- allowBluetooth → 音声再生時にはこのoption指定は無視される(bluetoothイヤホンを利用できるようになるとかそういうものではない)
- defaultToSpeaker → イヤホンやヘッドセットを利用しない場合にいわゆる電話の耳を当てる部分から音が出るのがデフォルトになっているが、それをスピーカーから音が出る状態にするoption
公式ドキュメント:
AVAudioSession
終わりです
Brewus,Inc.
株式会社ブリューアス
https://brewus.co.jp