Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ライブ配信サーバー完全に理解した
Search
Kazuyuki Mori
May 26, 2022
Technology
2
790
ライブ配信サーバー完全に理解した
"エンジニア達の「〇〇完全に理解した」Talk #29" で発表したLT
https://easy2.connpass.com/event/247539/
Kazuyuki Mori
May 26, 2022
Tweet
Share
More Decks by Kazuyuki Mori
See All by Kazuyuki Mori
BitMech 探索的 トレーディングシステム fin-py study #1
mainyaa
0
46
GoPiGo2で遊んでみた
mainyaa
0
33
Electron(旧atom shell)基礎+入門
mainyaa
0
41
Docker基礎+Docker0.9/0.10概要
mainyaa
0
32
Docker基礎+docker0.9, 0.10概要
mainyaa
0
51
Other Decks in Technology
See All in Technology
子育てで想像してなかった「見えないダメージ」 / Unforeseen "hidden burdens" of raising children.
pauli
2
280
AI駆動開発の実践とその未来
eltociear
1
230
ChatGPTで論⽂は読めるのか
spatial_ai_network
11
29k
S3を正しく理解するための内部構造の読解
nrinetcom
PRO
2
160
regrowth_tokyo_2025_securityagent
hiashisan
0
250
MariaDB Connector/C のcaching_sha2_passwordプラグインの仕様について
boro1234
0
640
今年のデータ・ML系アップデートと気になるアプデのご紹介
nayuts
1
510
【U/day Tokyo 2025】Cygames流 最新スマートフォンゲームの技術設計 〜『Shadowverse: Worlds Beyond』におけるアーキテクチャ再設計の挑戦~
cygames
PRO
2
690
AIエージェント開発と活用を加速するワークフロー自動生成への挑戦
shibuiwilliam
4
290
Jakarta Agentic AI Specification - Status and Future
reza_rahman
0
110
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
730
1人1サービス開発しているチームでのClaudeCodeの使い方
noayaoshiro
2
390
Featured
See All Featured
Practical Orchestrator
shlominoach
190
11k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
286
14k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Optimizing for Happiness
mojombo
379
70k
Building Adaptive Systems
keathley
44
2.9k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Being A Developer After 40
akosma
91
590k
[SF Ruby Conf 2025] Rails X
palkan
0
540
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Transcript
ライブ配信 サーバー 完全に理解した @mainyaa
Who • @mainyaa • Kazuyuki Mori • フロントエンドからバックエンドから機械学習までやる系エンジニア • D.Node所属
ライブ配信の技術
世はまさに、大配信時代! • スパチャ投げたことありますか? • Youtube Liveの台頭によってストリー マーが注目を集めている ◦ ストリーマーになりたいけどなれな い。。。
世はまさに、大配信時代! • 僕らには技術があった ◦ DevToolsを使ってTwitch.tvをみると、ど うやら.m3u8とか.tsというファイルを使っ ているみたい ◦ ググってみるとHLSというのを使っている
HLSとは • HTTPを経由した低遅延の動画配信の規格 • HLS(HTTP Live Streaming)はデファクトスタンダード ◦ 他にはMPEG-DASHという標準規格もある →今回はHLSについて話します!
HLSとは • Appleが作った規格(RFC8216) • HTTP/HTTPSで動画を配信できる • 主要なOSに対応している ◦ iOSはHLSにしか対応していない
HLSとは • アダプティブストリーミングに対応 ◦ 視聴者の帯域幅に合わせて動的に画質を変える機能 ◦ モバイルで嬉しい • 3~6秒の遅延がある ◦
遅延=配信から視聴までのラグ ◦ 快適なコミュニケーションにはちょっとつらい
HLSの仕組み
HLSの仕組み(配信側) • 動画をセグメント(tsファイル)に分割する。各セグメントの長さ は約10秒 • ビデオセグメントのURLと順序は、プレイリスト(m3u8ファイル) に記述される • プレイリストとビデオセグメントは、ストリーミングサーバーで HTTPで配信される
high.m3u8 .ts .ts .ts .ts .ts .ts プレイリスト 10秒で分割されたビデオセグメント
ストリーミングサーバー (Origin) (次のページに続く) メディアサーバー 配信ソフトウェア エンコーダー セグメンテーター セグメントファイル .ts インデックスファイル
.m3u8
HLSの仕組み(視聴側) • HLS準拠のプレイヤーはm3u8ファイルをダウンロードし、 ビットレートを選択し、動画を再生する • プレイヤーは、定期的にm3u8ファイルをポーリングし、新し い動画を再生する
ストリーミングサーバー (Origin) セグメントファイル .ts インデックスファイル .m3u8 CDN
HLSの嬉しいところ • HTTPで通信するためセキュリティでブロックされない • HTTPサーバーを使っているためスケールが簡単にでき、 CDNで突発アクセスにも備えられる • 視聴者が増えてもメディアサーバーへの負荷が変わらない • アダプティブストリーミングで複数のビットレートで配信でき
る • DevToolで簡単に中身を見られる
HLSの嬉しくないところ • 使えるエンコードが決まっている ◦ H.264かH.265のみ • DRMがApple FairPlayのみ対応 • iOSがMPEG-DASHに対応しない
アダプティブストリーミング
アダプティブストリーミングとは • ビットレートが異なる複数のストリームを配信することで、ブ ラウザが自分の帯域に合わせて自動的に画質を調整してく れる仕組み • マスターm3u8を作り、そこからビットレートが違う子m3u8を 参照する
index.m3u8 high.m3u8 medium.m3u8 low.m3u8 高ビットレート 中ビットレート 低ビットレート メディアサーバー
高ビットレート 中ビットレート 低ビットレート ストリーミング サーバー ブラウザ 再生状態 配信
HLSのファイルを見る
HTMLのサンプル <!DOCTYPE html> <html> <head><title>HTTP Live Streaming Example</title></head> <body> <video
src="/v1/playlist/index.m3u8" width="400" height="300" controls></video> </body> </html>
インデックスm3u8のサンプル #EXTM3U #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="chunked",NAME="936p60 (source)",AUTOSELECT=YES,DEFAULT=YES #EXT-X-STREAM-INF:BANDWIDTH=9004654,RESOLUTION=1664x936,CODECS="avc1.64002A,mp4a.40.2",VIDEO="ch unked",FRAME-RATE=60.000 https://example.com/v1/playlist/1.m3u8 #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="720p60",NAME="720p60",AUTOSELECT=YES,DEFAULT=YES #EXT-X-STREAM-INF:BANDWIDTH=3422999,RESOLUTION=1280x720,CODECS="avc1.4D401F,mp4a.40.2",VIDEO="72 0p60",FRAME-RATE=60.000
https://example.com/v1/playlist/2.m3u8 #EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="360p30",NAME="360p",AUTOSELECT=YES,DEFAULT=YES #EXT-X-STREAM-INF:BANDWIDTH=630000,RESOLUTION=640x360,CODECS="avc1.4D401F,mp4a.40.2",VIDEO="360p 30",FRAME-RATE=30.000 https://example.com/v1/playlist/4.m3u8
メディアm3u8のサンプル #EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:100 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:9.97663, media-100.ts #EXTINF:9.97663, media-101.ts
#EXT-X-ENDLIST
HLSサーバーを立てる
HLSサーバーを立てる • alfg/nginx-rtmp ◦ このDockerイメージを使うと一瞬でHLSサーバーを立ち 上げられる ◦ nginxとnginx-rtmp-moduleとffmpegを使用している
HLSサーバーを立てる エンコード OBS ブラウザ(HLS.js) 配信 ストリーミング
HLSサーバーを立てる Dockerイメージをpullして実行する docker pull alfg/nginx-rtmp docker run -it -p 1935:1935
-p 8080:80 --rm alfg/nginx-rtmp
配信する • OBSを起動する • 右下の「コントロール」欄で「設定」>「配信」を選択 • サービス:「カスタム...」 ◦ サーバー:rtmp://localhost:1935/stream ◦
ストリームキー: hello • 「配信開始」を押す
配信を見る • ブラウザでHLS.js Playerを開き、 • 「http://localhost:8080/live/hello.m3u8」を入力します • 「Apply」ボタンを押すと下に配信中の動画が流れます
まとめ
まとめ • DRMがいらないならHLSで十分 • HLSの仕組みは意外と簡単 • Dockerイメージのnginx-rtmpを使うとお手軽にサーバーを 作れる
Thanks you!