Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
470
Apple Low-Latency HLSを使った 超低遅延配信について
yaminoma
4
5.1k
今日から分かる AVAudioEngineの全て
yaminoma
4
6.2k
Cross Platform Video Player
yaminoma
0
510
PHPとRustを組み合わせて音声ファイルをエンコードする話
yaminoma
0
3.6k
Other Decks in Technology
See All in Technology
AWS Security Agentの紹介/introducing-aws-security-agent
tomoki10
0
210
学習データって増やせばいいんですか?
ftakahashi
2
330
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.4k
多様なデジタルアイデンティティを攻撃からどうやって守るのか / 20251212
ayokura
0
440
Kiro Autonomous AgentとKiro Powers の紹介 / kiro-autonomous-agent-and-powers
tomoki10
0
440
Debugging Edge AI on Zephyr and Lessons Learned
iotengineer22
0
180
MLflowで始めるプロンプト管理、評価、最適化
databricksjapan
1
210
因果AIへの招待
sshimizu2006
0
970
re:Inventで気になったサービスを10分でいけるところまでお話しします
yama3133
1
120
Kubernetes Multi-tenancy: Principles and Practices for Large Scale Internal Platforms
hhiroshell
0
120
エンジニアとPMのドメイン知識の溝をなくす、 AIネイティブな開発プロセス
applism118
4
1.2k
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
690
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Thoughts on Productivity
jonyablonski
73
5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Embracing the Ebb and Flow
colly
88
4.9k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Designing for humans not robots
tammielis
254
26k
4 Signs Your Business is Dying
shpigford
186
22k
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