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
PRO
June 28, 2018
Technology
4
2.7k
iOS/AndroidのRTMPプレーヤーを改善した話+α
Streaming Conference #3
https://streaming-lab.connpass.com/event/90574/
Shumpei Urabe
PRO
June 28, 2018
Tweet
Share
More Decks by Shumpei Urabe
See All by Shumpei Urabe
AIを活用した放送技術スタートアップの制作現場改革について
yaminoma
PRO
0
11k
動画配信技術について
yaminoma
PRO
1
920
Multimedia Security Topics
yaminoma
PRO
0
1.6k
コロナ禍でのライブストリーミングの変化とテレビ放送の規格について
yaminoma
PRO
0
840
今日から分かる Android Audioの全て
yaminoma
PRO
0
320
Apple Low-Latency HLSを使った 超低遅延配信について
yaminoma
PRO
3
3.8k
今日から分かる AVAudioEngineの全て
yaminoma
PRO
4
5.1k
Cross Platform Video Player
yaminoma
PRO
0
370
PHPとRustを組み合わせて音声ファイルをエンコードする話
yaminoma
PRO
0
2.7k
Other Decks in Technology
See All in Technology
Cracking the KubeCon CfP
inductor
2
250
生産性向上チームの紹介
cybozuinsideout
PRO
1
870
競技としてのKaggle、役に立つKaggle
yu4u
3
1.2k
TechFeed Experts Night#27 〜 フロントエンドフレームワーク最前線 (Svelte)
baseballyama
1
500
ここが嬉しいABAC ここが辛いよABAC #再解説+補足編
masahirokawahara
1
270
プロトタイピングによる不確実性の低減 / Reducing Uncertainty through Prototyping
ohbarye
5
380
MapLibreとAmazon Location Service
dayjournal
1
150
ChatworkのSRE部って実は 半分くらいPlatform Engineering部かもしれない
saramune
0
160
Hands-on Gemini, the Google DeepMind LLM
meteatamel
1
110
ChatGPT for IT Service Management (IT Pro)
dahatake
7
1.6k
検証を通して見えてきたTiDBの性能特性
lycorptech_jp
PRO
6
3.8k
20分で完全に理解するGrafanaダッシュボード
hamadakoji
3
610
Featured
See All Featured
A better future with KSS
kneath
231
16k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
125
32k
Bash Introduction
62gerente
604
210k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
659
120k
RailsConf 2023
tenderlove
4
540
From Idea to $5000 a Month in 5 Months
shpigford
377
45k
Testing 201, or: Great Expectations
jmmastey
28
6.4k
Design by the Numbers
sachag
274
18k
What's new in Ruby 2.0
geeforr
337
31k
KATA
mclloyd
15
12k
How STYLIGHT went responsive
nonsquared
92
4.8k
Designing on Purpose - Digital PM Summit 2013
jponch
110
6.5k
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