wowzaを用いた配信基盤 takusuta tech conf01
TRANSCRIPT
を用いた配信基盤
Kazuhiro Ota@ciela
1
自己紹介
大田 かずひろ
@ciela
㈱サイバーエージェント所属
ゆとりサーバサイドアプリエンジニア
アメーバピグでHadoopとかいじってました
takusutaには各サービスで共通の配信基盤担
当として関わってます
2
今日のおはなし
takusutaで利用している共通配信基盤の中でも Wowza Streaming Engine という
プロダクトについて私が得た知見を出来る限りお伝えします。
3
共通配信基盤
4
共通配信基盤の役割
利用サービス
採用技術
配信開始フロー
共通配信基盤
現在稼働中の生配信に特化した3サービスの配信部分を共通化したシステム。
❏ 動画・音声の配信・視聴
❏ 配信サーバの管理
❏ 配信ストリームの管理
❏ 各種APIの提供
5
利用サービス
6
❏ takusuta❏ https://takusuta.com/
❏ ライブ動画加工フィルターで楽しむ個人配信サービス
❏ アメスタ
❏ http://studio.ameba.jp/
❏ 有名人・芸能人に特化した高画質生配信サービス
❏ ラジ生?
❏ https://radio-nama.com/
❏ 音声のみのお手軽なネットラジオ配信サービス
主な使用技術
❏ 配信サーバ❏ Wowza Streaming Engine on EC2❏ RTMPでストリームを待ち受け
❏ 各サービスごとにクラスタを分割して疎な配置を行ってます
❏ CDN❏ CloudFront❏ HLSをキャッシュする配信視聴側のエンドポイント
❏ APIサーバ❏ Go on EC2❏ 各サービスに共通配信基盤の情報を提供
❏ ストリーム・配信サーバ管理DB❏ MongoDB on EC2
❏ アーカイブストレージ❏ S3❏ ElasticTranscoderによるHLSトランスコード済みのストリームデータを格納
7
ライブ配信時(生配信時)①
8
Wowza
API
宅スタAPI配信基盤
CloudFront
DB
takusuta配信者
takusuta視聴者
配信した〜い
新規配信用にトークン払い出して配信サーバ教えて〜
すいてる配信サーバ教えて〜
ライブ配信時(生配信時)②
9
Wowza
API
takusutaAPI配信基盤
CloudFront
DB
takusuta配信者
takusuta視聴者
トークンと接続する配信サーバだよ〜
xxxというトークンで配信サーバ01に繋ぐよう伝えて〜
配信サーバ01がすいてるよ〜
ライブ配信時(生配信時)③
10
Wowza
API
takusutaAPI配信基盤
CloudFront
DB
takusuta配信者
takusuta視聴者
01さん、配信開始するよ〜これトークンね〜
HLSをCloudFrontにキャッシュさせるよ〜
ライブ配信視聴した〜い
VOD配信時(アーカイブ配信)
11
配信基盤
CloudFront
takusuta視聴者
S3過去配信視聴した〜い
HLSをキャッシュさせるよ〜
その他の機能
❏ 配信終了後のMP4ファイルをS3にアップロードしてアーカイブ
❏ S3にアップロードされたファイルをVOD用にトランスコード
❏ サービスごとに必要なタイミングで通知を送信
12
配信準備からVOD変換までワークフロー形式で処理を行っています。
次の発表で詳しくご説明いたします。
WowzaStreaming Engine
13
プロダクトの簡単な説明
付随するクラウドサービスとプレイ
ヤーアプリケーション
主要アドオン紹介
Wowza Streaming Engine
14
❏ Wowza Media Systems が開発・販売している動画ストリーミングサーバ
❏ ‘1510現在最新版は4.3
❏ Adobe Media Server (Flash Media Server) 互換
❏ カスタマイズ可能
❏ 設定やアドオンでもある程度の自由度はもたせられる
❏ プラグインの自作も可能
❏ アダプティブビットレート機能
❏ 回線環境ごとに予め決めておいた
ビットレート・解像度で視聴できる
サポートプロトコルなど
❏ 対応プロトコル
❏ RTMP
❏ RTSP
❏ HLS
❏ MPEG-DASH
❏ SmoothStreaming
❏ など
❏ 対応コーデック
❏ H.264
❏ H.265
❏ AAC
❏ など
❏ 対応ファイルフォーマット
❏ MP4
❏ MP3
❏ FLV
❏ など
15
Wowza Streaming Cloud❏ マネージドなクラウドストリーミングサービス
❏ もちろん自分でサーバを用意する必要はなし
❏ 時間指定で配信を開始・停止できるスケジューリング機能
16
Wowza GoCoderWowzaサーバに対して簡単な配信を試すこ
とができる純正のネイティブアプリ
❏ iOS❏ Android
1年ほど前に無料になりました
17
Transcoderアドオン
18
❏ 設定可能項目❏ ビデオビットレート
❏ オーディオビットレート
❏ 画面解像度
❏ フレームレート
❏ コーデック
❏ など
ライブ配信ストリームをリアルタイムに複数のビットレートや
フォーマットへの変換を行うアドオン。
アダプティブビットレートが簡単に実現できる、
既にWowzaに組み込み済みの有料アドオン。
Transcoderアドオン
19
予めテンプレートを用意し、 Stream Name Group というリソース単位にまとめておくことで
アダプティブビットレートに簡単に対応することが可能。
この例では
❏ 360p❏ 160p
という2つのトランスコードプリセットが有効で
❏ [ストリーム名 ]_all というName Groupで 360p, 160p 両方❏ [ストリーム名 ]_mobile というName Groupで 160p のみ
がアダプティブビットレートとして利用できる
もちろん他のプリセットも有効であれば ABR対象になります
その他の有料アドオン
❏ nDVRアドオン
❏ ライブ配信時の追っかけ再生やポーズを VODライクに行うことができる
❏ DRMアドオン
❏ 配信コンテンツに対しての保護をかけることができる
2つともTranscoderアドオン同様有料であり既にWowzaに組み込み済み。
20
設定とカスタマイズ
21
Application設定
Transcoderアドオン設定
プラグインの開発と種類
共通配信基盤における役割
❏ RTMPでアプリケーションからの配信を待ち受け
❏ HLSでCloudFrontを介した視聴を待ち受け
❏ 配信開始・終了のトークン認証
❏ 配信開始・終了時の各サービスへの通知
❏ 各配信サーバごとの接続数をDBに更新
❏ 配信期限の過ぎたストリームの切断
❏ 配信の強制切断
❏ 配信ビットレートのロギング
22
アプリケーション設定
アプリケーションとはWowzaでライブ配信を行う際に作成する設定の単位。
共通配信基盤では各サービスごとに1アプリケーションを割り当てている。
以下、共通で施している設定。
❏ アプリケーション種別❏ LiveHTTPOrigin
❏ 配信プロトコル❏ RTMP
❏ 視聴プロトコル❏ HLS
❏ 利用するアドオン❏ Transcoderアドオン
❏ ストリーム全録画をONに❏ すべての配信ストリームがローカルに MP4で保存される
23
プラグイン開発
デフォルトの状態でできることは基本的な配信・録画・視聴のみ。
配信の開始・終了をフックしたり、何らかの処理を定期実行させるにはJavaでのプラグイ
ン開発が必要。
具体的には以下のような処理はプラグイン開発で補うことになりました。
❏ 配信開始・終了時のトークン認証
❏ 配信開始・終了時のサービスへの通知
❏ DB上の各サーバごとの接続数レコードの更新
❏ 配信期限の過ぎたストリームの切断
❏ 配信の強制切断
❏ 配信ビットレートのロギング
24
プラグイン開発
現在配信基盤で稼働しているプラグインの大まかな種別。
(私が勝手にこう呼んでるだけです)
❏ イベントフック型❏ 配信開始時のトークン認証
❏ 配信開始時の通知送信
❏ 配信途中切断時のクリーンアップ
❏ 常駐ワーカー型❏ 数秒毎の配信ストリームそれぞれのビットレートロギング
❏ 数秒毎のサーバの接続数の確認と DBレコードの更新
❏ 1分毎の配信期限切れストリームの切断
❏ HTTPエンドポイント型❏ 配信中のストリームの強制切断
25
イベントフック型ユーザの配信状態に伴う処理を定義できる。
まずは ModuleBase というクラスを拡張しストリームが再生された際
(onStreamCreate)にストリームオブジェクトにストリームのリスナインターフェイスであ
る IMediaStreamListener3 を実装・登録することになる。
利用できる主なフックは
❏ ストリーム配信開始時❏ onPublish
❏ ストリーム配信終了時❏ onUnPublish
❏ AMFデータ送信時❏ onMetaData
など。 26
常駐ワーカー型
主にWowzaサーバの状態を確認したりタイマーで自動処理を行うために
基本的にJavaのExecutorFrameworkを利用してスレッドを常駐させています。
Executorの立ち上げにはWowzaサーバ自体の立ち上がりをフックしています。
具体的には IServerNotify3 というインターフェイスを実装することで
❏ サーバインスタンス初期化
❏ onServerInit❏ サーバインスタンス破棄開始
❏ onServerShutdownStart❏ サーバインスタンス破棄開始
❏ onServerShutdownComplete
などのタイミングをフックすることができます。27
HTTPエンドポイント型
自作機能をWebアプリケーションとして提供できます。
HTTPProvider2Base というクラスを拡張し、onHTTPRequest メソッドを実装することで
任意の処理を記述することができます。
その後設定ファイルに作成したクラスのFQDNとパスパターンを追記することでエンドポ
イントが利用可能になります。
28
プラグイン開発
❏ インストールしたWowza自体のライブラリ(Jar)を参照して開発していくスタイル
❏ SDKというには少々荒っぽい
❏ Eclipse用のプロジェクト雛形は提供されてるけどビルドツールは Ant
❏ 結局自前でGradle化してJarをリポジトリにアップしたりした
❏ ドキュメントがあまり書かれてない
❏ オブジェクトやスレッドのライフサイクルがわからない
❏ なぜかPDFで配布
❏ FAQ兼ねているフォーラムで検索・尋ねたほうが早いことも
❏ プラグインのサンプル集が配られてるのが救い
❏ Java1.4とかその時代のコードが沢山残ってたりするけど
29
サーバ情報と簡単なメトリクス紹介
takusutaサーバ情報
サーバリソースの使われ方
30
takusuta Wowzaサーバ情報
現在takusutaで利用しているWowzaサーバインス
タンス情報は下記の通り。
❏ EC2インスタンス
❏ c3.2xlarge x 5
❏ ディスク
❏ EBS gp2 100GB
❏ OS
❏ CentOS7
❏ ファイルシステム
❏ xfs
31
さらにWowza実行Java環境は下記の通り。
❏ Java
❏ Oracle JDK
❏ ヒープサイズ
❏ Production Levelを選択
❏ 10GB
❏ GC
❏ Concurrent Mark-Sweep GC
takusuta Transcoder設定
❏ トランスコード先のStream種類❏ 1Mbps 288x512 px ❏ 300kbps 288x512 px❏ 200kbps 216x384 px❏ 100kbps 90x160 px
❏ アダプティブビットレート用のStream Name Group❏ All
❏ 全て
❏ high❏ 1Mbps, 300kbps
❏ mid❏ 300kbps, 200kbps
❏ low❏ 100kbps
32
サーバリソースの使われ方
❏ 配信側ネットワーク帯域❏ 同時配信本数・配信ビットレートによる
❏ 現在takusutaでは1台あたりピーク帯で約 350〜400Mbpsの使用率
33
サーバリソースの使われ方
❏ CPU❏ 同時配信本数・配信ビットレート・トランスコーダ設定に依存
❏ 1本の配信でのベンチマークが取れればあとは配信本数で見積もり可能
❏ 現在takusutaでは1台あたりピーク帯で約 5,60%の使用率
34
サーバリソースの使われ方
❏ メモリ❏ 同時配信本数・配信ビットレート・トランスコーダ設定に依存
❏ 現在takusutaでは1台あたりピーク帯で約 1.5〜2GBの使用率
35
まとめ
❏ Wowza Streaming Engine を用いた共通配信基盤における配信についてご説明
させていただきました。
❏ Wowzaは今もアップデートを続けており、これからも新機能が登場してくることと思
います。
❏ まだまだ知見が少ない(と思う・・)プロダクトではありますが、Web上なりリアルコ
ミュニケーションなりで積極的な情報交換を行っていければと思っております。
36
おしまい
37