Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOS/AndroidのRTMPプレーヤーを改善した話+α
Search
Shumpei Urabe
June 28, 2018
Technology
4
3.3k
iOS/AndroidのRTMPプレーヤーを改善した話+α
Streaming Conference #3
https://streaming-lab.connpass.com/event/90574/
Shumpei Urabe
June 28, 2018
Tweet
Share
More Decks by Shumpei Urabe
See All by Shumpei Urabe
AIを活用した放送技術スタートアップの制作現場改革について
yaminoma
0
15k
動画配信技術について
yaminoma
2
1.6k
Multimedia Security Topics
yaminoma
0
2.4k
コロナ禍でのライブストリーミングの変化とテレビ放送の規格について
yaminoma
0
1.1k
今日から分かる Android Audioの全て
yaminoma
0
460
Apple Low-Latency HLSを使った 超低遅延配信について
yaminoma
4
5k
今日から分かる AVAudioEngineの全て
yaminoma
4
6.2k
Cross Platform Video Player
yaminoma
0
500
PHPとRustを組み合わせて音声ファイルをエンコードする話
yaminoma
0
3.6k
Other Decks in Technology
See All in Technology
「O(n log(n))のパフォーマンス」の意味がわかるようになろう
dhirabayashi
0
200
DDD x Microservice Architecture : Findy Architecture Conf 2025
syobochim
9
2.7k
pmconf 2025 大阪「生成AI時代に未来を切り開くためのプロダクト戦略:圧倒的生産性を実現するためのプロダクトサイクロン」 / The Product Cyclone for Outstanding Productivity
yamamuteki
2
1.5k
JavaScript パーサーに using 対応をする過程で与えたエコシステムへの影響
baseballyama
1
110
【M3】攻めのセキュリティの実践!プロアクティブなセキュリティ対策の実践事例
axelmizu
0
170
重厚長大企業で、顧客価値をスケールさせるためのプロダクトづくりとプロダクト開発チームづくりの裏側 / Developers X Summit 2025
mongolyy
0
160
なぜThrottleではなくDebounceだったのか? 700並列リクエストと戦うサーバーサイド実装のすべて
yoshiori
13
4.8k
事業状況で変化する最適解。進化し続ける開発組織とアーキテクチャ
caddi_eng
1
3k
プロジェクトの空気を読んで開発してくれるPerlのAIツールがほしい
kfly8
2
110
社内外から"使ってもらえる"データ基盤を支えるアーキテクチャの秘訣/登壇資料(飯塚 大地・高橋 一貴)
hacobu
PRO
0
2.7k
国産クラウドを支える設計とチームの変遷 “技術・組織・ミッション”
kazeburo
4
4.5k
AIを前提に、業務を”再構築”せよ IVRyの9ヶ月にわたる挑戦と未来の働き方 (BTCONJP2025)
yueda256
1
790
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
4.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.8k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Site-Speed That Sticks
csswizardry
13
970
BBQ
matthewcrist
89
9.9k
Transcript
iOS/Androidの RTMPプレーヤーを 改善した話+α Streaming Conference #3 2018.06.28 Shumpei URABE Mirrativ,
Inc. © 2018 Mirrativ, Inc. STRICTLY CONFIDENTIAL
自己紹介 ◆ 占部 竣平 ◆ 大学4年生 ◆ 福岡在住 ◆ ミラティブでは主に研究開発を行っている
99
99 起動 タイトル設定 配信開始 *音声はマイクによる集音 *スマホ単体での配信は iOS11 または Android5.0 以上対応
わずか数タップ! スマホだけでゲーム実況ができる! ゲーム側へのSDKの導入等は一切不要です 3 Mirrativとは?
99 ゲームを中心に置いた「コミュニケーション空間」 出典: https://goo.gl/ZORdR0, https://goo.gl/BJxk1m + 4 コンセプト=友達の家でドラクエやってる感じ
Mirrativの構成 ◆ Mirrativでは、配信サーバにWowza Streaming Engine を使っている ◆ 配信者はPCまたはMirrativアプリ(iOS/Android)から RTMPを使って配信を行う ◆
視聴者も基本的にはRTMPを使う ◆ 一部はトランスコードを行い、HTTP Live Streamingで 配信も行っている(iOSのモバイル視聴時など) 99
コラボ機能 ◆ Mirrativでは、配信者と視聴者で音声通話ができるコラボ 機能が実装されているが、ここにはWebRTCを使っている ◆ iOS/Androidともにlibwebrtcを使っているが、一部変更 を加えている ◆ Acoustic Echo
Canceller(AEC)を使うと音声の 出力をガッツリ止めてしまうため無効化 ◆ 音量が下がってしまうのを防ぐために入力側は Remote I/O、出力側はVoice Processing I/Oを 使っている 99
Mirrativアプリの紹介 ◆ Mirrativのアプリでは、アプリ単体から配信を行っている ◆ 配信する場合、iOSはReplayKit(HaishinKit)、Android の場合はMediaProjectionを使っている ◆ https://github.com/shogo4405/HaishinKit.swift ◆ iOSアプリはStreaming
Conference #2でshogoさん が発表したオープンソースなライブラリを社内でも使っ てます! 99
視聴プレーヤーの話 ◆ Mirrativで使っている視聴プレーヤーは以下の通り ◆ iOS ◆ RTMPは内製のライブラリ ◆ HLSはAVFoundation ◆
Android ◆ RTMP, HLSともに内製のライブラリ 99
最近の悩み ◆ トラフィックを減らしたい(重要) ◆ 遅延を減らしたい 99
トラフィックを減らす ◆ Mirrativは多くのユーザーにご利用頂いているため、トラ フィックのコストがとてもかかっている ◆ そのため、なんとか削減したいと考えた ◆ まず最初にエンコード設定を見直したが、現在の設定でも マシンリソースなどを考えると結構限界に近い 99
トラフィックを減らす ◆ 次に考えたのがMirrativのユーザーを調べていると、バッ クグラウンド視聴者が結構多い ◆ 現在はバックグラウンド時に映像と音声の両方を流してい るが、映像部分は必要ない ◆ そのため、映像を流さずに音声だけを流せばいい 99
receiveVideo ◆ RTMPのNetStream CommandsにはreceiveVideoというコマ ンドがある ◆ 映像を再生する場合はtrue, 再生しない場合はfalseを送ること で、サーバ側から映像のパケットを止めることができる ◆
receiveVideoはNetStream Play()を呼び出す前、または呼び 出した後に使うことができる ◆ Wowza側でMP3でトランスコードしてバックグラウンド時に切 り換える手法も考えたが圧倒的に楽なのはこっちだった 99 Field Name Type Command Name String Transaction ID Number Command Object Null Bool Flag Boolean
ハマったところ ◆ NetStream Play()の直前にreceiveVideo()を送るとダ メ ◆ たまにreceiveVideo()送ったときに接続が途切れること があるので再接続処理が必要になる ◆ 映像と音声の同期をしないといけないので大変だった
99
HLSの遅延対策 ◆ MirrativのHLSクライアントは一番最新のセグメントファ イルを読み込むようにしている ◆ しかし、iOSの場合はAVFondationを使っているため、一 番古いセグメントから読み込む(通常の挙動) ◆ そこで、EXT-X-START:TIME-OFFSETというタグを使 って再生位置を意図的に調整するWowzaのPluginを作っ
た ◆ セグメントが3秒のとき、EXT-X-START:TIME- OFFSET=-3.00にすると一番最新から再生できる 99
まとめ ◆ トラフィック減ったよ ◆ 遅延も若干少なくなったよ ◆ これらの改善は来月くらいには本番にリリースされるよ ◆ ミラティブでは一緒にサービスを支えてくれるエンジニア を募集してます!
99