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

今だから!Amazon CloudFront 徹底活用
今だから!Amazon CloudFront 徹底活用今だから!Amazon CloudFront 徹底活用
今だから!Amazon CloudFront 徹底活用Yasuhiro Araki, Ph.D
 
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Web Services Japan
 
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜Amazon Web Services Japan
 
WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browsermganeko
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Toshiaki Maki
 
ストリーミングのげんざい
ストリーミングのげんざいストリーミングのげんざい
ストリーミングのげんざいTetsuya Morimoto
 
Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習西岡 賢一郎
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Yahoo!デベロッパーネットワーク
 
プロダクトオーナー2.0
プロダクトオーナー2.0プロダクトオーナー2.0
プロダクトオーナー2.0toshihiro ichitani
 
Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!zaki4649
 
20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon CognitoAmazon Web Services Japan
 
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~Hinemos
 
開発者におくるサーバーレスモニタリング
開発者におくるサーバーレスモニタリング開発者におくるサーバーレスモニタリング
開発者におくるサーバーレスモニタリングAmazon Web Services Japan
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)Trainocate Japan, Ltd.
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
フロントからバックエンドまで - WebAssemblyで広がる可能性
フロントからバックエンドまで - WebAssemblyで広がる可能性フロントからバックエンドまで - WebAssemblyで広がる可能性
フロントからバックエンドまで - WebAssemblyで広がる可能性IIJ
 

What's hot (20)

今だから!Amazon CloudFront 徹底活用
今だから!Amazon CloudFront 徹底活用今だから!Amazon CloudFront 徹底活用
今だから!Amazon CloudFront 徹底活用
 
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
 
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜Gaming on aws 〜ゲームにおけるAWS最新活用術〜
Gaming on aws 〜ゲームにおけるAWS最新活用術〜
 
Epic Online Services でできること
Epic Online Services でできることEpic Online Services でできること
Epic Online Services でできること
 
WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browser
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
 
GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)
 
ストリーミングのげんざい
ストリーミングのげんざいストリーミングのげんざい
ストリーミングのげんざい
 
Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習Amazon SageMakerでカスタムコンテナを使った学習
Amazon SageMakerでカスタムコンテナを使った学習
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
 
プロダクトオーナー2.0
プロダクトオーナー2.0プロダクトオーナー2.0
プロダクトオーナー2.0
 
Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!Bapp Storeを調べてみたよ!
Bapp Storeを調べてみたよ!
 
20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito
 
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~
Docker管理もHinemosで! ~監視・ジョブ機能を併せ持つ唯一のOSS「Hinemos」のご紹介~
 
開発者におくるサーバーレスモニタリング
開発者におくるサーバーレスモニタリング開発者におくるサーバーレスモニタリング
開発者におくるサーバーレスモニタリング
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
フロントからバックエンドまで - WebAssemblyで広がる可能性
フロントからバックエンドまで - WebAssemblyで広がる可能性フロントからバックエンドまで - WebAssemblyで広がる可能性
フロントからバックエンドまで - WebAssemblyで広がる可能性
 

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