Submit Search
Upload
動画コンテンツにおいて、BGMとの制御でつまづいたところ
•
Download as PPTX, PDF
•
1 like
•
4,277 views
Masaya Dake
Follow
iOSDC Japan 2017での発表資料 https://iosdc.jp/2017/node/1334
Read less
Read more
Internet
Report
Share
Report
Share
1 of 74
Download now
Recommended
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
MagicOnion入門
MagicOnion入門
torisoup
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
はじめてのPRD
はじめてのPRD
Takuya Oikawa
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
torisoup
Recommended
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
Takafumi ONAKA
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
Unity Technologies Japan K.K.
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
MagicOnion入門
MagicOnion入門
torisoup
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
はじめてのPRD
はじめてのPRD
Takuya Oikawa
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
torisoup
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
Riderはいいぞ!
Riderはいいぞ!
UnityTechnologiesJapan002
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
dcubeio
こわくない Git
こわくない Git
Kota Saito
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai
WebSocketのキホン
WebSocketのキホン
You_Kinjoh
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
C#でわかる こわくないMonad
C#でわかる こわくないMonad
Kouji Matsui
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
Kouji Matsui
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
More Related Content
What's hot
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
torisoup
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Yasuhiro Mawarimichi
Riderはいいぞ!
Riderはいいぞ!
UnityTechnologiesJapan002
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
dcubeio
こわくない Git
こわくない Git
Kota Saito
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
Etsuji Nakai
WebSocketのキホン
WebSocketのキホン
You_Kinjoh
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
C#でわかる こわくないMonad
C#でわかる こわくないMonad
Kouji Matsui
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
Kouji Matsui
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Shin Ohno
What's hot
(20)
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
Riderはいいぞ!
Riderはいいぞ!
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
こわくない Git
こわくない Git
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
C++ マルチスレッド 入門
C++ マルチスレッド 入門
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
WebSocketのキホン
WebSocketのキホン
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
C#でわかる こわくないMonad
C#でわかる こわくないMonad
いまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
動画コンテンツにおいて、BGMとの制御でつまづいたところ
1.
動画コンテンツにおいて、 バックグラウンドの音声との制御で つまづいたところ 株式会社セプテーニ・オリジナル 嶽 雅也
2.
動画コンテンツにおいて、 バックグラウンドの音声BGMとの制 御でつまづいたところ 株式会社セプテーニ・オリジナル 嶽 雅也
3.
アジェンダ • 自己紹介 • GANMA!の紹介 •
BGMとの制御でつまづいたところ • 動画の音声とBGMが同時に再生される • BGMの再開が出来ない • 最後に
4.
自己紹介 • 株式会社セプテーニ・オリジナルの 嶽 雅也(だけ
まさや)です • Twitterアカウントは @masayadk1229です • 「GANMA!」というオリジナルマンガ配信 アプリの開発に携わっています
5.
GANMA!の紹介
6.
オリジナルマンガ配信アプリ GANMA! • 累計800万ダウンロード • 10代が今最も使っているアプリランキング9位 http://lab.appa.pe/2017-09/10s-app- ranking2017.html •
AppStoreのレビューでは5 GooglePlayでも4.7の評価をキープ
7.
8.
本日の発表内容について • GANMA!のトップ画面で再生される動画で、 BGMとの制御でつまづいたことについて、 お話します
9.
BGMの定義 • iPhoneの「ミュージック」アプリなどで、 バックグラウンドで流す音声
10.
ここから本題です
11.
動画の音声とBGMが 同時に再生される
12.
ある日 調査します! (そんなことできるのだろうか) 動画の音声をONにしたら、 BGMをOFFにしたい プロダクトオーナー
13.
14.
調査結果 • AVAudioSessionに 適切なカテゴリを設定することで解決
15.
解説
16.
AVAudioSessionとは • 「AVAudioSession」は簡単に言えば 音声周りの制御を司るフレームワーク です • Audio
Sessionプログラミングガイド には日本語で「AVAudioSession」の 使い方が記載されています
17.
• 以下の箇所を参考にしました • P16
~ P22 カテゴリの取り扱い • P46 ~ P47 オーディオセッションのカテゴリと モード AVAudioSession プログラミングガイド #1
18.
AVAudioSession プログラミングガイド #2 • こちらを読み解くのに、 音声入出力などで混乱したので、 苦労しました •
説明に必要なので、次のスライドで カテゴリの種類について紹介します
19.
AVAudioSessionの カテゴリーの種類 カテゴリー 音 声に割り込み AVAudioSessionCategorySoloAmbient(default)
● AVAudioSessionCategoryAmbient ✖︎
20.
音声に割り込み • 音声の割り込みが●なら、 BGMを停止して、 アプリの音声のみを流します • 音声の割り込みが✖︎なら、 BGMと同時にアプリの音声が 流れます
21.
音声に割り込み • 音声の割り込みが●なら、 BGMを停止して、 アプリの音声のみを流します →今回、設定したいのはこちら! • 音声の割り込みが✖︎なら、 BGMと同時にアプリの音声が 流れます
22.
AVAudioSessionの カテゴリーの種類 カテゴリー 音 声に割り込み AVAudioSessionCategorySoloAmbient(default)
● AVAudioSessionCategoryAmbient ✖︎
23.
改めて、調査結果 • AVAudioSessionに適切なカテゴリ を設定することで解決
24.
なぜ、動画の音声と BGMが同時に再生され たのか
25.
デフォルト以外(Ambient)が 設定されていたのが原因 カテゴリー 音 声に割り込み AVAudioSessionCategorySoloAmbient(default)
● AVAudioSessionCategoryAmbient ✖︎
26.
BGMの再開が 出来ない
27.
次の日 BGMの停止できました! 音声をOFFにしたら、 BGMが停止されたところから再開させたい 調査します! (ドキュメントに記述あったかな…)
28.
29.
調査した際に大きく つまづきました
30.
説明の都合上、 大きく3つに 分類して説明します
31.
つまづいた点 ① 実装方法の調査 ② 実装 ③
エラー原因の追究
32.
つまづいた点 ① 実装方法の調査 ② 実装 ③
エラー原因の追究
33.
①実装方法の調査
34.
調査結果 • BGMの停止/再開時に、 AVAudioSessionに モードなどを設定する必要 ことで解決できそう
35.
解説
36.
BGMの停止時 • _
37.
BGM停止時に設定する値 ① カテゴリーのオプション • interruptSpokenAudioAndMixWithOthers ②
モード • AVAudioSessionModeSpokenAudio ③ オーディオセッション • 有効→setActive(true)
38.
BGMの停止時 • _① ② ③
39.
BGMの再開時
40.
BGM再開時に設定する値 ① オーディオセッション • 無効→setActive(false) ②
オーディオセッションのオプション • notifyOthersOnDeactivation
41.
BGMの再開時 ① ②
42.
コードサンプル • iOS 10
Swift Programming Cookbook: Solutions and Examples for iOS Apps • 16.3 Enable Spoken AudioSessionsに 記載があります
43.
調査時の苦労 • 検索のみでは実装方法を見つけることが できませんでした • Audio
Sessionプログラミングガイドには 記載もありません(更新が2014年まで) →AVAudioSessionのメソッドの定義を眺 めて、必要そうなメソッドを 探しました
44.
つまづいた点 ① 実装方法の調査 ② 実装 ③
エラー原因の追究
45.
②実装
46.
調査結果 • BGMの再開時に、 動画を停止する必要があった
47.
解説
48.
BGMの再開時 • ①実装方法の調査の実装では、 次のページで紹介するエラーが 発生して動作しませんでした
49.
エラーログ 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.
50.
Google先生 I/Oを実行している オーディオセッションを無効にします オーディオセッションを無効にする前に 、すべてのI/Oを停止または一時停止す る必要があります
51.
BGM再開時に 音声が関係する動画などは 全て停止してください
52.
BGMを再開する 処理のまとめ 1. 動画を停止する 2. BGM再開処理を行う 3.
動画を再開する
53.
同じエラーが発生して 動かない
54.
???
55.
つまづいた点 ① 実装方法の調査 ② 実装 ③
エラー原因の追究
56.
③エラー原因の追究
57.
試行錯誤の結果、、
58.
動画停止後に スリープしたら動いた
59.
エラーの整理 • 動画が停止した直後だと、BGMの 再開処理でエラーが発生 • 動画を停止後にスリープしたら BGMの再開処理でエラーが発生し ない
60.
動画の再生状態を AVAudioSessionに 即座に通知できていない?
61.
通知できる手段を探す
62.
AVPlayer.rateが 使えそう!
63.
AVPlayer.rateとは? • 動画の現在の再生レートを 表すものです • 0.0なら停止中、1.0なら再生中を 表します
64.
AVAudioSessionについて の割り込みの記載がある
65.
動画の再生状態を通知できる コード
66.
BGMを再開する 処理のまとめ 1. 動画を停止する 2. AVAudioSessionに動画の停止を 通知 3.
BGM再開処理を行う 4. 動画を再開する
67.
BGMを再開する 処理のコード
68.
最後に • 音声と動画周り情報があまり出てこない ので、実装するにあたって苦労します • 今回、AVPlayer.rateを使って少し無理 矢理実装しました •
もし他の手段があったら、後でこっそり 懇親会でお話を聞かせてください
69.
告知
70.
弊社のカフェスペースを利用して、お酒や食事をし ながら行う勉強会を継続的に実施するコミュニティ iOS, DDD, Android,
Scala, アーキテクチャetc…
71.
今度の火曜日に 第3回があります! • 第3回は、9/19(火)に分析基盤 Meetupを予定して いますので、ご興味のある方はぜひご参加くだ さい •
新宿Geek Lounge#3 分析基盤 Meetup • 先日実施された第2回の参加レポートはこちら
72.
ご静聴 ありがとうございました
73.
引用元 (Apple公式ドキュメント) • Audio Sessionプログラミングガイド •
interruptSpokenAudioAndMixWithOthers • AVAudioSessionModeSpokenAudio • setActive • notifyOthersOnDeactivation
74.
引用元 (サンプルコード/ソースコード) • iOS 10
Swift Programming Cookbook: Solutions and Examples for iOS Apps • ソースコード(Appleのフレームワーク) • AVFoundation.AVAudio.AVAudioSession.swift • AVFoundation.AVPlayer
Download now