Slide 1

Slide 1 text

1周年を迎えたAbemaTVの動画配信の裏側 TECH PLAY CONFERENCE 2017 Yusei YAMANAKA

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

山中勇成 @toriimiyukki 株式会社サイバーエージェント 2017年新卒 株式会社AbemaTV サーバサイドエンジニア 配信チーム こういうカメラを 持っているほどの 放送オタクです

Slide 4

Slide 4 text

「中3で初めて生放送サービスを作った」AbemaTVで働く最年少エンジニアとは? IUUQTXXXXBOUFEMZDPNDPNQBOJFTBCFNBQPTU@BSUJDMFT

Slide 5

Slide 5 text

本日のアジェンダ ・AbemaTVとは ・AbemaTVを支える技術 ・AbemaTVの生放送が視聴できるまで ・MPEG-DASH(DRM)対応

Slide 6

Slide 6 text

AbemaTVの動画配信を支えるサーバーサイドシステム IUUQTXXXTMJEFTIBSFOFUZVJDIJSPOBLB[BXBBCFNBUW インターネットにおける動画配信の仕組み IUUQTXXXTMJEFTIBSFOFU3ZPTVLF,VCPTT

Slide 7

Slide 7 text

AbemaTVとは

Slide 8

Slide 8 text

AbemaTVとは PC、タブレット、スマホ、テレビデバイスなど様々なデバイスで楽しめます 24時間365日のリニア型放送を行う、インターネットテレビ局 ニュースやアニメ、スポーツなど約25チャンネルを視聴できる

Slide 9

Slide 9 text

Since 2016/4/11

Slide 10

Slide 10 text

20 million downloads

Slide 11

Slide 11 text

290 thousand programs

Slide 12

Slide 12 text

3 billion requests per day

Slide 13

Slide 13 text

1.5 Petabytes via Akamai 65 Terabytes via origin Weekend day, transferred

Slide 14

Slide 14 text

AbemaTVを支える技術

Slide 15

Slide 15 text

AbemaTV(サーバサイド)で使用している主要技術 GCP + k8s + Golang

Slide 16

Slide 16 text

Google Cloud Platform Googleが提供するクラウド AbemaTVのほとんどのインフラは、GCPを使用している →Google検索やYouTubeと同じインフラが使用できる

Slide 17

Slide 17 text

AbemaTVでのGCP使用例 ComputeEngine varnish, redis, mongo, wowza… CloudStorage 動画ファイル, セグメント, サムネイル… BigQuery BigTable アクセスログ 視聴履歴データ Pub/Sub アクセスログ, 行動ログ, 通知… Network DNS, GLB…

Slide 18

Slide 18 text

Kubernetes(k8s) Googleのエンジニアによって作られた、コンテナの管理プラット フォーム GCPでは、Google Container Engine(GKE)として、 マネージドなKubenetesクラスタが提供されている →コンソール上でノード数を指定することで自動的に環境が構築される デプロイ、ローリングアップデート、スケーリングのスケジューリングを 行い、適切にpodの台数やリソースを管理してnodeに配置する →複数のDockerのコンテナをpodという単位で管理 →podが動作するコンテナ環境を提供するマシンをminion(node)と呼ぶ

Slide 19

Slide 19 text

230 nodes vCPU 3700 cores / RAM 3300 GB 840 instances vCPU 3000 cores / RAM 13 TB w/o GKE nodes

Slide 20

Slide 20 text

Microservices →API, 管理API, 生放送管理API, メディアサーバ, 投票機能, サムネ生成などなど… サービス間の通信が必要な場合は、gRPCを使用している AbemaTVでは、マイクロサービスアーキテクチャを取り入れており、 約40のサービスが稼働している 4FSWJDF %# 4FSWJDF# 4FSWJDF" H31$

Slide 21

Slide 21 text

Deploykun AbemaTVのChatOpsボット Slackでサービスのリリースの作成, デプロイ, スケールなどが可能

Slide 22

Slide 22 text

Golang サーバサイドでは(簡単なスクリプトも含め)Golangを使用している ・社内での幾つか運用実績があった ・新しいもの好き ・シンプルな言語

Slide 23

Slide 23 text

Codeship サーバサイドのCIは、Codeshipを使用している ・以前は、CircleCIだった(CircleCI 2.0が出る前に移行した) ・Golangのユニットテストを並列で実行している ・Codeshipはコンテナを並列して動かすことができるため、  インテグレーションテストの環境が比較的楽に用意できる

Slide 24

Slide 24 text

まとめ AbemaTVのサーバサイドは、GCP+k8s+Golangの構成 サービスのデプロイでは、ChatOpsを採用し、基本的にPRから デプロイまでを一人のエンジニアが行う

Slide 25

Slide 25 text

AbemaTVの生放送が視聴できるまで

Slide 26

Slide 26 text

AbemaTVの配信種別 タイムシフト 収録 生放送 リニア ビデオ

Slide 27

Slide 27 text

生放送が視聴できるまで 現場 Encoder Streaming Server CDN Client (一般的な構成)

Slide 28

Slide 28 text

生放送が視聴できるまで 現場 Wirecast Wowza Watchman Store MediaProxy CDN Client 放送管理画面 (AbemaTVの場合)

Slide 29

Slide 29 text

現場から 送出 現場の映像は、Wirecastを通してエンコードし、GCP上の Wowzaへストリーミング プロトコルとして、RTMP や RTMP over Zixi が使われる RTMP SDI

Slide 30

Slide 30 text

エンコード& パッケージング Wowzaでは、ストリーミングされてきた映像(1920x1080)を、 AbemaTVで使用している各種解像度ごとに再エンコードし、 HLSへのパッケージングも行う 生放送管理画面で行った、CMの送信、投票の開始などの 操作もHLSのプレイリストにメタとして埋め込む これを実現するために、独自の拡張モジュールを導入している RTMP m3u8 ts(解像度ごと)

Slide 31

Slide 31 text

監視& 保存 Watchmanは、プロセスごとに担当番組を決め、 該当番組のWowzaが出力するHLSのプレイリストを監視し、 セグメント情報をmongoへ、TSをredisとGCSに書き込む 開局当初、GCSのみへの書き込みであったが、冗長化のために redisを使用した m3u8 ts(解像度ごと) Watchman

Slide 32

Slide 32 text

配信& 広告挿入 ユーザーが映像を再生するためのプレイリストやTSのエンドポイント を持つサービス プレイリストへのアクセスに対して、DBを参照して現在のチャンネ ルの放送すべきセグメントを計算して、収録や生放送、 SSAI(Server Side Ad Insertion)の広告のTSパスをまとめたm3u8 プレイリストを生成する TSへのアクセスに対して、redisかGCSを参照して返す m3u8 ts(解像度ごと) MediaProxy

Slide 33

Slide 33 text

配信から ユーザーまで m3u8 ts MediaProxy Clientは、MediaProxyのプレイリストを取得して再生する TSファイルは、Akamai(CDN)を通して取得する

Slide 34

Slide 34 text

生放送が視聴できるまで 現場 Wirecast Wowza Watchman Store MediaProxy CDN Client 放送管理画面 (AbemaTVの場合)

Slide 35

Slide 35 text

生放送が視聴できるまで 現場 Wirecast Wowza Watchman Store MediaProxy CDN Client 放送管理画面 独自のシステム (AbemaNewsの場合)

Slide 36

Slide 36 text

独自のシステムでは、HLSをベースに動画の取得と配信を行って いる まとめ AbemaTVでは、リニア型の配信やSSAIのために、独自のシス テムで動画配信を行っている CM挿入や投票機能を映像に同期して行うために、パッケージャー の時点でHLSにそれらの情報を埋め込んでいる

Slide 37

Slide 37 text

MPEG-DASH(DRM) 対応

Slide 38

Slide 38 text

MPEG-DASH(DRM)対応 DRM技術に対応したコンテンツの配信を行う必要があった →DRMはデバイスごとの対応が異なり、DRMによって必要な 配信形式も異なる

Slide 39

Slide 39 text

DRMと配信方式の対応 .JDSPTPGU 1MBZ3FBEZ "QQMF 'BJS1MBZ (PPHMF 8JEFWJOF )-4 .1&(%"4) ✕ ˓ ✕ ˓ ˓ ˓ AbemaTVではこの2方式を採用

Slide 40

Slide 40 text

MPEG-DASH(DRM)対応 DRM対応するために、MPEG-DASHへの対応が必須になった MPEG-DASHは、ISO国際標準規格(ISO/IEC 23001-6) で定められているHTTP上で動画をストリームするための規格 規格ではTS, MP4, ABR, マルチストリーム, 字幕(CC), ライブなど 多くの機能がある しかし、すべてをサポートしているプレイヤーは存在しない…! →プロファイルという概念が存在する

Slide 41

Slide 41 text

MPEG-DASHのプロファイル 'VMM1SPpMF .1&( 54 NBJO .1&(54 TJNQMF *40#BTF NFEJBpMF GPSNBU0O %FNBOE *40#BTFNFEJBpMFNBJO *40#BTF NFEJBpMF GPSNBU -JWF *40#.'' .1 *40#.''0O%FNBOE *40#.''-JWF

Slide 42

Slide 42 text

MPEG-DASHのマニフェスト MPEG-DASHには、MPDと呼ばれるマニフェストファイルとMP4 を数秒の細かいチャンクに区切ったfMP4(fragmented MP4) が必要 →HLSのリスト型とは異なり、MPEG-DASHはテンプレートを書いているような感覚 (個人談)

Slide 43

Slide 43 text

TSの構造 UT 1"5 1.5 7JEFP%BUB "VEJP%BUB 7JEFP%BUB "VEJP%BUB 7JEFP%BUB "VEJP%BUB CZUF۠੾Γ ʜ

Slide 44

Slide 44 text

MP4とfMP4の構造(だいたい) .1 NFEJBNQ NPPW NWIE USBL GUZQ NEBU 7JEFP%BUB G.1 JOJUNT NT NPPG NEBU 7JEFP%BUB NGIE USBG NPPW NWIE USBL GUZQ

Slide 45

Slide 45 text

HLSとMPEG-DASHのファイル取得 )-4 .1&(%"4) NV .BTUFS1MBZMJTU .FEJB1MBZMJTU NV UT 4FHNFOU UT 4FHNFOU .FEJB1MBZMJTU NV UT 4FHNFOU NQE .BOJGFTU .BOJGFTU NQE NT 4FHNFOU 4FHNFOU NT 4FHNFOU 4FHNFOU NT 4FHNFOU 4FHNFOU *OJUJBM4FHNFOU NT 7JEFP "VEJP *OJUJBM4FHNFOU

Slide 46

Slide 46 text

MPEG-DASHのマニフェスト構造 プロファイル指定 メディアパスのテンプレート タイムライン ビットレート、解像度別の定義 映像、音声、字幕の定義(言語別の音声など) コンテンツごとの単位(時間で分割、広告など) リクエストの一例 1. mp4ce/BSnr3JKqCoqq3H/P4AMzXhX8xh/360p.1/74011529.m4s 2. mp4ce/BSnr3JKqCoqq3H/P4AMzXhX8xh/720p.1/74011529.m4s 3. mp4ce/BSnr3JKqCoqq3H/P4AMzXhX8xh/720p.1/74332041.m4s (74011529+320512)

Slide 47

Slide 47 text

AbemaTVでfMP4を生成する fMP4は、ffmpeg, Bento4, MP4Boxなど様々なツールで作 成できる →SSAIをするために、TSとタイミングを合わせ、時間情報を同期させる必要があるため 収録されたコンテンツは、予め変換をすることができるが、生放 送のコンテンツは、リアルタイムで変換する必要がある 現場 Wirecast Wowza Watchman Store MediaProxy CDN Client ここでやるのが一般的 AbemaTVではここで変換

Slide 48

Slide 48 text

AbemaTVでfMP4を生成する AbamaTVでは、予め区切られたTSファイルをMP4に変換し、 Initial SegmentとMedia Segmentに分ける また、TSの時刻情報をInitial Segmentにも書き込む UT NQ JOJUNT NFEJBNT ࣌ؒ৘ใ

Slide 49

Slide 49 text

まとめ 生放送の番組では、リアルタイムにTSからfMP4へのトランスコー ドをして、MPEG-DASHに対応している MPEG-DASHのMulti-Periodで広告やコンテンツを区切って いる

Slide 50

Slide 50 text

PR

Slide 51

Slide 51 text

AbemaTV開発局の構成 QA エンジニア E2Eテスト, 映像の品質基準など Android, iOS, Web, サーバサイド, インフラなど ディレクター 開発のディレクションなど デザイナー アプリケーションのデザイン, ロゴデザインなど

Slide 52

Slide 52 text

AbemaTVエンジニアの構成 Web サーバサイド フロント, 管理画面, Chromecastなど コア, API, 配信など Android Android, Fire TVなど iOS iOS, tvOSなど インフラ GCP, チューニング, 負荷試験など

Slide 53

Slide 53 text

We’re hiring! https://recruit.abematv.co.jp https://www.wantedly.com/companies/abema