Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOS/AndroidのRTMPプレーヤーを改善した話+α

 iOS/AndroidのRTMPプレーヤーを改善した話+α

Shumpei Urabe
PRO

June 28, 2018
Tweet

More Decks by Shumpei Urabe

Other Decks in Technology

Transcript

  1. iOS/Androidの
    RTMPプレーヤーを
    改善した話+α
    Streaming Conference #3
    2018.06.28
    Shumpei URABE
    Mirrativ, Inc.
    © 2018 Mirrativ, Inc.
    STRICTLY CONFIDENTIAL

    View Slide

  2. 自己紹介
    ◆ 占部 竣平
    ◆ 大学4年生
    ◆ 福岡在住
    ◆ ミラティブでは主に研究開発を行っている
    99

    View Slide

  3. 99
    起動 タイトル設定 配信開始
    *音声はマイクによる集音 *スマホ単体での配信は iOS11 または Android5.0 以上対応
    わずか数タップ! スマホだけでゲーム実況ができる!
    ゲーム側へのSDKの導入等は一切不要です
    3
    Mirrativとは?

    View Slide

  4. 99
    ゲームを中心に置いた「コミュニケーション空間」
    出典: https://goo.gl/ZORdR0, https://goo.gl/BJxk1m

    4
    コンセプト=友達の家でドラクエやってる感じ

    View Slide

  5. Mirrativの構成
    ◆ Mirrativでは、配信サーバにWowza Streaming Engine
    を使っている
    ◆ 配信者はPCまたはMirrativアプリ(iOS/Android)から
    RTMPを使って配信を行う
    ◆ 視聴者も基本的にはRTMPを使う
    ◆ 一部はトランスコードを行い、HTTP Live Streamingで
    配信も行っている(iOSのモバイル視聴時など)
    99

    View Slide

  6. コラボ機能
    ◆ Mirrativでは、配信者と視聴者で音声通話ができるコラボ
    機能が実装されているが、ここにはWebRTCを使っている
    ◆ iOS/Androidともにlibwebrtcを使っているが、一部変更
    を加えている
    ◆ Acoustic Echo Canceller(AEC)を使うと音声の
    出力をガッツリ止めてしまうため無効化
    ◆ 音量が下がってしまうのを防ぐために入力側は
    Remote I/O、出力側はVoice Processing I/Oを
    使っている
    99

    View Slide

  7. Mirrativアプリの紹介
    ◆ Mirrativのアプリでは、アプリ単体から配信を行っている
    ◆ 配信する場合、iOSはReplayKit(HaishinKit)、Android
    の場合はMediaProjectionを使っている
    ◆ https://github.com/shogo4405/HaishinKit.swift
    ◆ iOSアプリはStreaming Conference #2でshogoさん
    が発表したオープンソースなライブラリを社内でも使っ
    てます!
    99

    View Slide

  8. 視聴プレーヤーの話
    ◆ Mirrativで使っている視聴プレーヤーは以下の通り
    ◆ iOS
    ◆ RTMPは内製のライブラリ
    ◆ HLSはAVFoundation
    ◆ Android
    ◆ RTMP, HLSともに内製のライブラリ
    99

    View Slide

  9. 最近の悩み
    ◆ トラフィックを減らしたい(重要)
    ◆ 遅延を減らしたい
    99

    View Slide

  10. トラフィックを減らす
    ◆ Mirrativは多くのユーザーにご利用頂いているため、トラ
    フィックのコストがとてもかかっている
    ◆ そのため、なんとか削減したいと考えた
    ◆ まず最初にエンコード設定を見直したが、現在の設定でも
    マシンリソースなどを考えると結構限界に近い
    99

    View Slide

  11. トラフィックを減らす
    ◆ 次に考えたのがMirrativのユーザーを調べていると、バッ
    クグラウンド視聴者が結構多い
    ◆ 現在はバックグラウンド時に映像と音声の両方を流してい
    るが、映像部分は必要ない
    ◆ そのため、映像を流さずに音声だけを流せばいい
    99

    View Slide

  12. 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

    View Slide

  13. ハマったところ
    ◆ NetStream Play()の直前にreceiveVideo()を送るとダ

    ◆ たまにreceiveVideo()送ったときに接続が途切れること
    があるので再接続処理が必要になる
    ◆ 映像と音声の同期をしないといけないので大変だった
    99

    View Slide

  14. HLSの遅延対策
    ◆ MirrativのHLSクライアントは一番最新のセグメントファ
    イルを読み込むようにしている
    ◆ しかし、iOSの場合はAVFondationを使っているため、一
    番古いセグメントから読み込む(通常の挙動)
    ◆ そこで、EXT-X-START:TIME-OFFSETというタグを使
    って再生位置を意図的に調整するWowzaのPluginを作っ

    ◆ セグメントが3秒のとき、EXT-X-START:TIME-
    OFFSET=-3.00にすると一番最新から再生できる
    99

    View Slide

  15. まとめ
    ◆ トラフィック減ったよ
    ◆ 遅延も若干少なくなったよ
    ◆ これらの改善は来月くらいには本番にリリースされるよ
    ◆ ミラティブでは一緒にサービスを支えてくれるエンジニア
    を募集してます!
    99

    View Slide