3
9

More than 3 years have passed since last update.

iOSアプリで音楽や動画のバックグラウンド再生の実装方法(他アプリ音声を停止しないやり方も)

Posted at

AVPlayerやAVAudioPlayerなどで音声再生や動画再生の実装をする場合デフォルトのままだとアプリをバックグラウンドへ移行したりスリープをした時に再生が自動で停止します。
以下の実装を行うことで再生を継続させることができます。

簡単な手順でOKです。

手順1

  1. プロジェクトファイルを開く
  2. メニュー -> Editor -> Add Capability -> Background Modesを選択
  3. Audio, AirPlay, and Picture in PictureのチェックマークをONにする

スクリーンショット 2020-08-24 19.18.08.png

手順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

3
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
9