Akamai Tech Meetup Tokyo
← プレイヤーへ Architecture
Engineering Deep Dive

ライブ配信の裏側を
全部見せます

OBS から視聴者のブラウザまで、このデモは Akamai のクラウドインフラ・VPU エンコーダー・エッジ配信・サーバーレス関数を組み合わせた本格的なライブ配信スタックです。すべてオープンソースと標準プロトコルで構成されています。

NETINT Quadra VPU FFmpeg + HLS Akamai MSL5 Akamai CDN Rust + WebAssembly Akamai Functions HLS.js ABR Terraform IaC
配信パイプライン全体像
ライブ配信— OBS から視聴者まで
OBS Studio
12 Mbps H.264
SRT over UDP
port 9000
Akamai Cloud
NETINT Quadra
VPU + AI
Accelerated Compute
Akamai
MSL5
Live Origin / HTTP PUT
AMD
Adaptive Media Delivery
HLS.js Player
ABR 5 variants
ビューワー / API 配信— index.html とコメント API
Akamai Cloud
Object Storage
index.html / JS / JSON
Akamai
DSA
Dynamic Site Accelerator
Origin Call
Akamai Cloud
Akamai Functions
Wasm / Spin
Browser
Viewer / Comments UI
NETINT Quadra VPU
Akamai Accelerated Compute / T1U
  • 専用 VPU チップで H.264 エンコードを完全ハードウェア処理。CPU オフロードで 5 変換を同時実行
  • AI プリフィルター ni_quadra_ai_pre が DNN モデルで映像品質を強化してからエンコード
  • HVS QP(人間視覚モデルに基づくブロック単位 QP)と 16 フレーム先読み でビットレート効率を最大化
  • VPU 側スケーリング ni_quadra_scale で 5 解像度への変換も GPU/CPU 不要
FFmpeg filter_complex — NETINT AI pipeline
# AI前処理 → split → VPU hwupload → 解像度変換
[0:v]ni_quadra_ai_pre=nb=HVS_plus_1080p_L2_NR2.nb[ai];
[ai]split=5[vr0][vr1][vr2][vr3][vr4];
[vr0]ni_quadra_hwupload[hw0];
[hw0]ni_quadra_scale=1920:1080[v1080p];
[vr1]ni_quadra_hwupload[hw1];
[hw1]ni_quadra_scale=1280:720[v720p];
xcoder-params — 品質チューニング
-xcoder-params RcEnable=1\
  :hvsQPEnable=1      # 人間視覚QP
  :EnableRdoQuant=1   # RDO量子化
  :lookAheadDepth=16  # 16f先読み
  :cuLevelRCEnable=0  # lookAhead時は無効
SRT インジェスト
Secure Reliable Transport / UDP 9000
  • UDP ベースで TCP より低遅延。パケットロス時の再送機構(ARQ)を内蔵し安定した配信品質を実現
  • mode=listener: OBS が FFmpeg へ接続するプッシュモデル。NodeBalancer が UDP 非対応のためインスタンス直接接続
  • latency=2000ms のバッファで日本–LA 間のネットワーク遅延・抖動を吸収
  • RTMP(TCP 1935)はフォールバックとして NodeBalancer 経由でも受付
FFmpeg SRT 入力
ffmpeg -re -i \
  "srt://0.0.0.0:9000?mode=listener&latency=2000" \
  -filter_complex "[0:v]ni_quadra_ai_pre..." \
  ...
OBS 接続 URL
srt://<instance-ip>:9000
  ?mode=caller&latency=2000
FFmpeg + HLS アップローダー
render-ffmpeg-command.py / run-ffmpeg-msl5-primary.sh
  • YAML 駆動の FFmpeg コマンド生成: event.yaml を Python スクリプトが読み込み、バリアント数や AI 設定に応じた filter_complex を動的構築
  • バリアント並列アップロード: 5 本の独立ループが bash バックグラウンドジョブで並走し、1080p の大セグメントが他バリアントをブロックしない
  • セグメント先行 PUT: .ts → index.m3u8 → master.m3u8 の順で MSL5 へ送信。「未配信セグメントを参照するプレイリスト」問題を防止
  • RUN_ID プレフィックス: 再起動ごとにユニークな ID をセグメント名に付与し CDN キャッシュコリジョンを回避
bash — 並列バリアントアップローダー
for _vname in 1080p 720p 480p 360p 240p; do
  upload_variant_loop "${_vname}" &
  UPLOADER_PIDS+=($!)
done
# セグメントファイルの更新検知: stat mtime + size
stamp="$(stat -c '%s:%Y' "${file}")"
[[ "${stamps[${rel}]:-}" != "${stamp}" ]] || return 0
Akamai MSL5
Media Services Live 5 / HTTP PUT ingest
  • HTTP PUT でセグメント配信: 専用インジェストプロトコル不要。curl 1 コマンドで .ts ファイルをオリジンへ直接 PUT
  • Primary / Backup 冗長構成: 両エンドポイントへ並列 PUT。どちらか一方の成功で OK とする設計
  • 4 秒セグメント × 6 セグメントプレイリスト: プレイリスト保持 24 秒のウィンドウで DVR 相当の機能を提供
  • EXT-X-PROGRAM-DATE-TIME: セグメントに UTC タイムスタンプを付与し、後段プレイヤーの同期・DVR 操作を支援
curl — MSL5 HTTP PUT
curl --fail --silent \
  --upload-file "1080p/20260510T_seg_00042.ts" \
  "https://p-ep{ID}.mslentrypoint.net/
   {STREAM_ID}/{EVENT}/1080p/seg.ts"
HLS.js プレイヤー
Vanilla JS / ABR / 追加 SaaS ゼロ
  • HLS.js ABR: EWMA 帯域推定で 5 バリアント(1080p〜240p)を自動切替。手動品質選択も可能
  • Picture-in-Picture: Browser PiP API で他作業しながらの視聴をサポート
  • stream-config.json ポーリング: 配信前は 10 秒ごとに設定を確認し、is_live=true になった瞬間に HLS ストリームを開始
  • localStorage で設定永続化: 音量・シアターモード・チャット名をタブ間で記憶
HLS.js — ABR 品質セレクター
const hls = new Hls({ lowLatencyMode: false });
hls.loadSource(streamUrl);
hls.attachMedia(video);
// 手動品質選択: -1 = 自動ABR
hls.currentLevel = -1;
Akamai Functions
Spin Framework / Rust / WASM / KV Store
  • Rust → WebAssembly: wasm32-wasip1 ターゲットでビルドした 240 KB の WASM バイナリが Spin ランタイムで実行
  • KV Store で状態管理: コメント一覧(最大 200 件)とセッションマップを JSON シリアライズして KV に保存
  • ハートビートによる視聴者数計測: 30 秒間隔の POST で session_id を更新。90 秒間応答がないセッションを自動削除
  • サーバーレス・コールドスタートなし: Spin の WASM ランタイムは事前コンパイル済みで即時起動
Rust — heartbeat エンドポイント
fn handle_heartbeat(req: &Request) -> Result<Response> {
  let mut sessions = load_sessions(&store)?;
  // TTL 90s 超過セッションを削除
  sessions.retain(|_, last| {
    now.saturating_sub(*last) < 90_000
  });
  sessions.insert(session_id, now);
  json_ok(&Resp { count: sessions.len() })
}
spin.toml — KV Store 設定
[component.comments-api]
source = "target/wasm32-wasip1/release/comments_api.wasm"
key_value_stores = ["default"]
Terraform IaC
Akamai Accelerated Compute / イベントスコープ
  • イベント単位でインフラをプロビジョン: terraform apply でエンコーダーインスタンス・ファイアウォールアタッチを自動作成
  • cloud-init 連携: インスタンス起動時に NETINT ドライバ・FFmpeg・スクリプト一式を自動セットアップ
  • 共有ファイアウォールのアタッチのみ: ルール変更は一切行わず既存の common ファイアウォールをアタッチ。複数イベント間の設定ドリフトを防止
  • outputs でOBS URL を即時出力: apply 後に SRT URL が表示され、配信者がそのまま OBS に貼り付け可能
terraform output (apply後)
obs_srt_direct_url = "srt://<IP>:9000?mode=listener"
ssh_command        = "ssh root@<IP>"
instance_type      = "g1-accelerated-netint-vpu-t1u1-s"
Akamai CDN (SPS)
akamai-techmeetup.isss802.top / prd_Site_Accel
  • Site Accelerator で静的ファイル(viewer/)と HLS セグメントを同一ホスト名から配信
  • エッジキャッシュ: .ts セグメントは変更なしのためキャッシュヒット率が高く、オリジンへの負荷が最小化
  • TLS 終端: edgesuite.net ネットワーク証明書で HTTPS を自動適用
  • akamai purge CLI でプレイヤー更新時にキャッシュを即時パージ
purge コマンド
akamai purge invalidate \
  --edgerc ~/.edgerc \
  "https://akamai-techmeetup.isss802.top/index.html" \
  "https://akamai-techmeetup.isss802.top/stream-config.json"

ABR ラダー設計

5 段階のビットレートラダー。HLS.js が視聴者の帯域を EWMA で推定し、リアルタイムに最適な品質を選択します。

バリアント 解像度 映像ビットレート 音声 GOP 必要帯域(目安) 相対ビットレート
1080p 1920 × 1080 12,000 kbps 192 kbps 120 ≈ 15 Mbps
720p 1280 × 720 6,000 kbps 192 kbps 120 ≈ 8 Mbps
480p 854 × 480 2,000 kbps 128 kbps 120 ≈ 2.5 Mbps
360p 640 × 360 800 kbps 128 kbps 120 ≈ 1.1 Mbps
240p 426 × 240 350 kbps 96 kbps 120 ≈ 0.55 Mbps
GOP = 120 frames (30 fps × 4s segment) — セグメント境界とキーフレームが完全に整列
システム仕様数値
5
ABR バリアント
1080p → 240p
12
最大映像ビットレート
Mbps (1080p)
4s
HLS セグメント長
6 segments in playlist
16
Look-ahead Depth
NETINT xcoder-params
240
WASM バイナリ
KB (comments-api)
30s
ハートビート間隔
TTL: 90s
3s
チャットポーリング
max 200 comments
2000
SRT バッファ
ms (Japan → LA)

技術スタック全体

エンコーディング
FFmpeg7.1
NETINT libxcoderV5.7.0
h264_ni_quadra_encH.264
ni_quadra_ai_preHVS_plus L2
HLS MPEG-TS4s seg
インフラ
Akamai Accelerated ComputeT1U
Terraform>= 1.5
Linode Provider~> 2.0
cloud-initYAML
配信 / CDN
Akamai MSL5HTTP PUT
Akamai CDN (SPS)Site Accel
SRTUDP 9000
RTMP (fallback)TCP 1935
プレイヤー
HLS.jslatest
Vanilla JavaScriptES2022
HTML5 Media API
Picture-in-Picture API
Fullscreen API
Akamai Functions
Rust1.78+
Spin Framework5.2.0
WebAssemblywasm32-wasip1
KV Storedefault
自動化 / ツール
Python3.x + PyYAML
Bash5.0+
Task (Taskfile)
akamai CLIpurge
s5cmdObject Storage