Mirrativ tech blog

株式会社ミラティブの開発者(サーバサイドエンジニア,iOSエンジニア,Androidエンジニア,機械学習エンジニア,インフラエンジニア, etc...)によるブログです

【iOS】ゲームアプリの音声設計とミラティブの配信について

 こんにちは。エンジニアのshogo4405です。ゲーム開発会社様より、iOSで画面収録またはミラティブで配信をすると、SEは鳴るが、BGMが消える場合がある。技術的な仕様について教えてくださいと連絡をいただく場合があります。

 本エントリーでは、ミラティブの配信中にゲームのBGMが鳴らない現象について、ゲームアプリ側での回避方法の例をご紹介したいと思います。

はじめに

 ミラティブのライブ配信は、iOS11で導入されたReplayKitのAPIを利用して実現しています。iOS標準機能として画面収録と呼ばれています。画面収録の利用方法は、次の通りです。

  1. [設定.app] → [コントロールセンター] → [コントロールを追加] → [画面収録]を追加する[画像1]

  2. コントロールセンターを開き、新規登場した ◉ マークを長押しする。[画像2]

  3. [写真] を選び。収録を開始する。

 画面収録開始後に時計周辺が赤く変化すると思います。こちらの赤い部分をタップすることで画面収録の停止を行えます。画面収録停止後に、写真アプリの、カメラロールに今現在、撮影したデーターが入っていることが確認できます。

1 2 3
f:id:shogo4405:20210630133012p:plain:w200 f:id:shogo4405:20210630133030p:plain:w200 f:id:shogo4405:20210701105901p:plain:w200

Apple が推奨するゲームアプリの音声の振る舞い

 Audio Session Programming Guideによれば、ゲームアプリの推奨する音声の振る舞いとして以下のように規定があります。

  • Play app sound effects while allowing another app’s audio to play.
  • Play app soundtrack audio when other audio is not playing, otherwise allow the previous audio to play.
  • Always attempt to reactivate and resume playback of sound effects after an end interruption event.
  • Query the audio session’s secondaryAudioShouldBeSilencedHint property to determine if you should resume playback of your game’s

Sound Effects(SE)は、他のアプリで音声を再生している間でも再生する。Soundtrack audio(BGM) の再生は、他のアプリが音声を再生しているときには再生しないことが推奨されています。また、他のアプリが音声を再生しているか否かは、secondaryAudioShouldBeSilencedHint を利用して欲しいという言及があります。

画面収録時の振る舞い

f:id:shogo4405:20210701105901p:plain:w200:right さて、画面収録やミラティブで配信中の振る舞いについて説明していきます。前項で説明した、secondaryAudioShouldBeSilencedHintの値が、配信開始画面上でのマイクONの状態とマイクOFFの状態で挙動が分かれました。*1*2

  • マイクON
    • secondaryAudioShouldBeSilencedHint -> true
    • isOtherAudioPlaying -> true
  • マイクOFF
    • secondaryAudioShouldBeSilencedHint -> false
    • isOtherAudioPlaying -> false

 従いましてAudio Session Programming Guideに沿った実装している場合、マイクONで画面収録中は、SEは鳴るが、BGMは消えるということになります。なお、iOS側で制御状態にあるため、ミラティブアプリでの対応は困難でした。

むすびに

 SEは鳴るが、BGMが消える現象の回避方法についてです。こちらは、画面収録しているか否かを判定するためにiOS11で追加されたAPI。UIScreen.main.isCapturedの利用の案内をしており、UIScreen.main.isCaptured && AVAudioSession#secondaryAudioShouldBeSilencedHint を満たす場合に以下の条件を回避する提案をしております。

  • Play app soundtrack audio when other audio is not playing, otherwise allow the previous audio to play.

We are hiring!

 ミラティブでは、一緒にアプリを作ってくれるUnityエンジニアを募集中です!気軽にご連絡ください!

www.mirrativ.co.jp

*1:iOS11, 12, 13, 14でそれぞれ動作を検証した

*2:一部のアプリでは、isOtherAudioPlayingのプロパティを利用している可能性もあるので掲載しました