SlideShare a Scribd company logo
1 of 74
動画コンテンツにおいて、
バックグラウンドの音声との制御で
つまづいたところ
株式会社セプテーニ・オリジナル
嶽 雅也
動画コンテンツにおいて、
バックグラウンドの音声BGMとの制
御でつまづいたところ
株式会社セプテーニ・オリジナル
嶽 雅也
アジェンダ
• 自己紹介
• GANMA!の紹介
• BGMとの制御でつまづいたところ
• 動画の音声とBGMが同時に再生される
• BGMの再開が出来ない
• 最後に
自己紹介
• 株式会社セプテーニ・オリジナルの
嶽 雅也(だけ まさや)です
• Twitterアカウントは @masayadk1229です
• 「GANMA!」というオリジナルマンガ配信
アプリの開発に携わっています
GANMA!の紹介
オリジナルマンガ配信アプリ
GANMA!
• 累計800万ダウンロード
• 10代が今最も使っているアプリランキング9位
http://lab.appa.pe/2017-09/10s-app-
ranking2017.html
• AppStoreのレビューでは5
GooglePlayでも4.7の評価をキープ
本日の発表内容について
• GANMA!のトップ画面で再生される動画で、
BGMとの制御でつまづいたことについて、
お話します
BGMの定義
• iPhoneの「ミュージック」アプリなどで、
バックグラウンドで流す音声
ここから本題です
動画の音声とBGMが
同時に再生される
ある日
調査します!
(そんなことできるのだろうか)
動画の音声をONにしたら、
BGMをOFFにしたい
プロダクトオーナー
調査結果
• AVAudioSessionに
適切なカテゴリを設定することで解決
解説
AVAudioSessionとは
• 「AVAudioSession」は簡単に言えば
音声周りの制御を司るフレームワーク
です
• Audio Sessionプログラミングガイド
には日本語で「AVAudioSession」の
使い方が記載されています
• 以下の箇所を参考にしました
• P16 ~ P22
カテゴリの取り扱い
• P46 ~ P47
オーディオセッションのカテゴリと
モード
AVAudioSession
プログラミングガイド #1
AVAudioSession
プログラミングガイド #2
• こちらを読み解くのに、
音声入出力などで混乱したので、
苦労しました
• 説明に必要なので、次のスライドで
カテゴリの種類について紹介します
AVAudioSessionの
カテゴリーの種類
カテゴリー 音 声に割り込み
AVAudioSessionCategorySoloAmbient(default) ●
AVAudioSessionCategoryAmbient ✖︎
音声に割り込み
• 音声の割り込みが●なら、
BGMを停止して、
アプリの音声のみを流します
• 音声の割り込みが✖︎なら、
BGMと同時にアプリの音声が
流れます
音声に割り込み
• 音声の割り込みが●なら、
BGMを停止して、
アプリの音声のみを流します
→今回、設定したいのはこちら!
• 音声の割り込みが✖︎なら、
BGMと同時にアプリの音声が
流れます
AVAudioSessionの
カテゴリーの種類
カテゴリー 音 声に割り込み
AVAudioSessionCategorySoloAmbient(default) ●
AVAudioSessionCategoryAmbient ✖︎
改めて、調査結果
• AVAudioSessionに適切なカテゴリ
を設定することで解決
なぜ、動画の音声と
BGMが同時に再生され
たのか
デフォルト以外(Ambient)が
設定されていたのが原因
カテゴリー 音 声に割り込み
AVAudioSessionCategorySoloAmbient(default) ●
AVAudioSessionCategoryAmbient ✖︎
BGMの再開が
出来ない
次の日
BGMの停止できました!
音声をOFFにしたら、
BGMが停止されたところから再開させたい
調査します!
(ドキュメントに記述あったかな…)
調査した際に大きく
つまづきました
説明の都合上、
大きく3つに
分類して説明します
つまづいた点
① 実装方法の調査
② 実装
③ エラー原因の追究
つまづいた点
① 実装方法の調査
② 実装
③ エラー原因の追究
①実装方法の調査
調査結果
• BGMの停止/再開時に、
AVAudioSessionに
モードなどを設定する必要
ことで解決できそう
解説
BGMの停止時
• _
BGM停止時に設定する値
① カテゴリーのオプション
• interruptSpokenAudioAndMixWithOthers
② モード
• AVAudioSessionModeSpokenAudio
③ オーディオセッション
• 有効→setActive(true)
BGMの停止時
• _①
②
③
BGMの再開時
BGM再開時に設定する値
① オーディオセッション
• 無効→setActive(false)
② オーディオセッションのオプション
• notifyOthersOnDeactivation
BGMの再開時
①
②
コードサンプル
• iOS 10 Swift Programming Cookbook: Solutions and
Examples for iOS Apps
• 16.3 Enable Spoken AudioSessionsに
記載があります
調査時の苦労
• 検索のみでは実装方法を見つけることが
できませんでした
• Audio Sessionプログラミングガイドには
記載もありません(更新が2014年まで)
→AVAudioSessionのメソッドの定義を眺
めて、必要そうなメソッドを
探しました
つまづいた点
① 実装方法の調査
② 実装
③ エラー原因の追究
②実装
調査結果
• BGMの再開時に、
動画を停止する必要があった
解説
BGMの再開時
• ①実装方法の調査の実装では、
次のページで紹介するエラーが
発生して動作しませんでした
エラーログ
AVAudioSession.mm:1049:-
[AVAudioSession
setActive:withOptions:error:]:
Deactivating an audio session
that has running I/O.
All I/O should be stopped or
paused prior to deactivating
the audio session.
Google先生
I/Oを実行している
オーディオセッションを無効にします
オーディオセッションを無効にする前に
、すべてのI/Oを停止または一時停止す
る必要があります
BGM再開時に
音声が関係する動画などは
全て停止してください
BGMを再開する
処理のまとめ
1. 動画を停止する
2. BGM再開処理を行う
3. 動画を再開する
同じエラーが発生して
動かない
???
つまづいた点
① 実装方法の調査
② 実装
③ エラー原因の追究
③エラー原因の追究
試行錯誤の結果、、
動画停止後に
スリープしたら動いた
エラーの整理
• 動画が停止した直後だと、BGMの
再開処理でエラーが発生
• 動画を停止後にスリープしたら
BGMの再開処理でエラーが発生し
ない
動画の再生状態を
AVAudioSessionに
即座に通知できていない?
通知できる手段を探す
AVPlayer.rateが
使えそう!
AVPlayer.rateとは?
• 動画の現在の再生レートを
表すものです
• 0.0なら停止中、1.0なら再生中を
表します
AVAudioSessionについて
の割り込みの記載がある
動画の再生状態を通知できる
コード
BGMを再開する
処理のまとめ
1. 動画を停止する
2. AVAudioSessionに動画の停止を
通知
3. BGM再開処理を行う
4. 動画を再開する
BGMを再開する
処理のコード
最後に
• 音声と動画周り情報があまり出てこない
ので、実装するにあたって苦労します
• 今回、AVPlayer.rateを使って少し無理
矢理実装しました
• もし他の手段があったら、後でこっそり
懇親会でお話を聞かせてください
告知
弊社のカフェスペースを利用して、お酒や食事をし
ながら行う勉強会を継続的に実施するコミュニティ
iOS, DDD, Android, Scala, アーキテクチャetc…
今度の火曜日に
第3回があります!
• 第3回は、9/19(火)に分析基盤 Meetupを予定して
いますので、ご興味のある方はぜひご参加くだ
さい
• 新宿Geek Lounge#3 分析基盤 Meetup
• 先日実施された第2回の参加レポートはこちら
ご静聴
ありがとうございました
引用元
(Apple公式ドキュメント)
• Audio Sessionプログラミングガイド
• interruptSpokenAudioAndMixWithOthers
• AVAudioSessionModeSpokenAudio
• setActive
• notifyOthersOnDeactivation
引用元
(サンプルコード/ソースコード)
• iOS 10 Swift Programming Cookbook: Solutions
and Examples for iOS Apps
• ソースコード(Appleのフレームワーク)
• AVFoundation.AVAudio.AVAudioSession.swift
• AVFoundation.AVPlayer

More Related Content

What's hot

MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~torisoup
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCdisc99_
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールdcubeio
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。sasezaki
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホンYou_Kinjoh
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Masahito Zembutsu
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonadKouji Matsui
 
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitしたいまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitしたKouji Matsui
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 

What's hot (20)

MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitしたいまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 

動画コンテンツにおいて、BGMとの制御でつまづいたところ