Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Webブラウザ向け動画配信プレイヤーの 大規模リプレイスから得た知見と学び
Search
yud0uhu
September 05, 2025
Technology
350
0
Share
Webブラウザ向け動画配信プレイヤーの 大規模リプレイスから得た知見と学び
フロントエンドカンファレンス北海道2025(
https://www.frontend-conf.jp/
) のLT登壇資料です。
yud0uhu
September 05, 2025
More Decks by yud0uhu
See All by yud0uhu
未必のマクベス
yud0uhu
0
24
早朝の渋谷の青さ、あるいは溺れた人を助ける為に飛び込んだ海の向こう側に見る、自己覚知と自己開示の尊さ
yud0uhu
1
860
動画配信サービスのフロントエンド実装に学ぶ設計原則
yud0uhu
1
370
非デザイナーのフロントエンドエンジニアがOOUIを考える
yud0uhu
9
5.9k
2023年の ゼロランタイムCSS in JS⚡️ を考える
yud0uhu
5
5.1k
Vue3/Electronで自作したマークダウンエディタをVue3/Tauriにリプレイスした話
yud0uhu
2
3.1k
入社半年を迎える新米エンジニアがカンファレンス・勉強会から得た学び
yud0uhu
0
1.1k
Next.js×Prisma×GraphQL×Supabase +WASMでブログを自作した話
yud0uhu
0
1.3k
Rustでつくって学ぶProtocol Buffers
yud0uhu
1
280
Other Decks in Technology
See All in Technology
LLM とプロンプトエンジニアリング/チューターを定義する / LLMs and Prompt Engineering, and Defining Tutors
ks91
PRO
0
320
ふりかえりがなかった職能横断チームにふりかえりを導入してみて学んだこと 〜チームのふりかえりを「みんなで未来を考える場」にするプロローグ設計〜
masahiro1214shimokawa
0
320
組織的なAI活用を阻む 最大のハードルは コンテキストデザインだった
ixbox
6
1.3k
AIを活用したアクセシビリティ改善フロー
degudegu2510
1
160
Oracle AI Databaseデータベース・サービス: BaseDB/ExaDB-Dの可用性
oracle4engineer
PRO
1
170
AI時代に新卒採用、はじめました/junior-engineer-never-die
dmnlk
0
230
見えない開発現場を、見える投資に変える
rojoudotcom
2
150
終盤で崩壊させないAI駆動開発
j5ik2o
0
320
Babylon.js を使って試した色々な内容 / Various things I tried using Babylon.js / Babylon.js 勉強会 vol.5
you
PRO
0
270
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.4k
2026年度新卒技術研修 サイバーエージェントのデータベース 活用事例とパフォーマンス調査入門
cyberagentdevelopers
PRO
6
7.1k
「決め方」の渡し方 / How to hand over the "decision-making process"
pauli
8
1.3k
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
Building Adaptive Systems
keathley
44
3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.6k
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Believing is Seeing
oripsolob
1
110
Making the Leap to Tech Lead
cromwellryan
135
9.8k
Designing for Performance
lara
611
70k
エンジニアに許された特別な時間の終わり
watany
106
240k
The untapped power of vector embeddings
frankvandijk
2
1.7k
Thoughts on Productivity
jonyablonski
76
5.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Transcript
フロントエンドカンファレンス北海道2025 2025/09/06(Sat) Webブラウザ向け動画配信プレイヤーの 大規模リプレイスから得た知見と学び
0yu(おゆ) 合同会社DMM.com Webフロントエンドエンジニア(新卒3年 目) 好きなもの ☞ 推理小説、映画、アニメ、 マーダーミステリー、洋酒 自己紹介 @yud0uhu
@yud0uhu
動画再生を支える基盤技術
動画再生を支える基盤技術(ABR/MSE/EME) 動画再生を支える基盤技術 ABR(Adaptive Bit Rate) MSE(Media Source Extensions) EME(Encrypted Media
Extensions)
動画再生を支える基盤技術(ABR/MSE/EME) 動画再生を支える基盤技術(ABR ) /MSE/EME ABR(Adaptive Bit Rate) ユーザーの回線環境に最適化したビットレート(=ストリーム)を提供する
動画再生を支える基盤技術(ABR/MSE/EME) 動画再生を支える基盤技術( MSE ) ABR/ /EME MSE(Media Source Extensions) W3Cによって標準化されているWeb
API。 動画データを短いセグメントに分割して読み込み、それをHTMLの<video>要 素に渡すことで、ストリーミング再生を実現する ABRをサポートする
動画再生を支える基盤技術(ABR/MSE/EME) 動画再生を支える基盤技術( MSE ) ABR/ /EME 動画データを分割したセグメント(バイナ リデータ)を、ブラウザ内のMediaSource オブジェクトのSourceBufferと呼ばれる領 域にappendBuffer()する
これがHTMLの<video>要素に渡される
動画再生を支える基盤技術(ABR/MSE/EME) 動画再生を支える基盤技術( EME) ABR/MSE/ EME(Encrypted Media Extensions) W3Cによって標準化されているWeb API。 保護されたコンテンツ(DRM:デジタル著作権管理)の再生を制御する
動画再生を支える技術(ABR/MSE/EME) 動画再生を支える基盤技術( EME) ABR/MSE/ EME(Encrypted Media Extensions) W3Cによって標準化されているWeb API。 保護されたコンテンツ(DRM:デジタル著作権管理)の再生を制御する
DMM TVでは、配信コンテンツに対する保護要件が指定されている場合があり 暗号化された音声や動画を安全に取り扱う技術が不可欠となる
動画再生を支える基盤技術(Shaka Player) Shaka Playerとは? Google謹製のHTML5ベースのWebプレイヤーライブラリ(OSS) https://github.com/shaka-project/shaka-playerhttps:// github.com/shaka-project/shaka-player
動画再生を支える基盤技術(Shaka Player) Shaka Playerとは?
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで 1 2 3 4 5 6
7 8 9 function if else () { shaka.polyfill. (); (shaka.Player. ()) { (); } { . ( ); } } initApp installAll isBrowserSupported initPlayer error console 'Browser not supported!'
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで 1 2 3 4 5 6
7 8 9 function if else () { shaka.polyfill. (); (shaka.Player. ()) { (); } { . ( ); } } initApp installAll isBrowserSupported initPlayer error console 'Browser not supported!'
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで 1 2 3 4 5 6
7 8 9 function if else () { shaka.polyfill. (); (shaka.Player. ()) { (); } { . ( ); } } initApp installAll isBrowserSupported initPlayer error console 'Browser not supported!'
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで 1 2 3 4 5 6
7 8 9 function if else () { shaka.polyfill. (); (shaka.Player. ()) { (); } { . ( ); } } initApp installAll isBrowserSupported initPlayer error console 'Browser not supported!'
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで 1 2 3 4 5 6
7 8 9 async function const const new await () { video document. ( ); player shaka. (); player. (video); initPlayer getElementById Player attach = = 'video' // v4.6 からコンストラクタ引数が非推奨になった。 // new shaka.Player(video) // player = new shaka.Player();
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで 1 2 3 4 5 6
7 8 9 10 window.player player; player. ( , onErrorEvent); { player. (manifestUri); . ( ); } (e) { (e); } = console addEventListener load log onError 'error' 'The video has now been loaded!' try await catch
動画再生を支える基盤技術(Shaka Player) Shaka Playerを用いて動画を再生するまで 1 document. ( , initApp); addEventListener
'DOMContentLoaded'
動画再生を支える基盤技術 DMM TVとShaka Player DMM TVには、オンデマンド、ライブ、コメント付きライブの三種類の再 生形式を提供している これらを再生するために、Shaka Playerを基盤として独自の再生プレイ ヤーを開発・運用している
動画再生を支える基盤技術 ここまでのまとめ ブラウザで動画を安全に、遅延なく再生する技術がABR/MSE/EME これらを抽象化して扱えるようにしたライブラリがShaka Player DMM TVはプロダクトの持つ多様なニーズに対応するため、Shaka Player を基盤とした独自の動画配信プレイヤーを運用している
動画再生を支える基盤技術 ここまでのまとめ ブラウザで動画を安全に、遅延なく再生する技術がABR/MSE/EME これらを抽象化して扱えるようにしたライブラリがShaka Player DMM TVはプロダクトの持つ多様なニーズに対応するため、Shaka Player を基盤とした独自の動画配信プレイヤーを運用している <<ここまでのお話が気になる方へ>>
今日からできる! 動画配信基盤システム構築(CodeZine) https://codezine.jp/article/corner/1002
プレイヤーリプレイスで行ったこと
プレイヤーリプレイスで行ったこと (そもそも)プレイヤーリプレイスのモチベーション “動画配信”サービスにおける”再生プレイヤー”の性能 ユーザーの体験に直結
プレイヤーリプレイスで行ったこと プレイヤーリプレイスで行ったこと Shaka Playerのメジャーバージョンアップ 3系→4系へ グローバル状態ライブラリの移行 Apollo Client→Reduxへ Emotion(CSS in
JS)→ Tailwind CSS への移行 詳細はDMM TV Web速度改善の道 〜Tailwind CSS移行編〜 next/dynamic→ dynamic import(JSの標準動的インポート)へ移行 複数のhooksに分散したuseEffectの共通化→一つのカスタムフックとして まとめて分離・統一
プレイヤーリプレイスで行ったこと プレイヤーリプレイスで行ったこと Shaka Playerのメジャーバージョンアップ 3系→4系へ グローバル状態ライブラリの移行 Apollo Client→Reduxへ Emotion(CSS in
JS)→ Tailwind CSS への移行 詳細はDMM TV Web速度改善の道 〜Tailwind CSS移行編〜 next/dynamic→ dynamic import(JSの標準動的インポート)へ移行 複数のhooksに分散したuseEffectの共通化→一つのカスタムフックとして まとめて分離・統一
ライブラリバージョンアップで 発生した課題
ライブラリバージョンアップで発生した課題 ライブラリバージョンアップで発生した課題 発生した事象① 特定の再生環境・デバイスで著作権保護コンテンツが再生できない Windows/Edgeのみで発生 Shaka Player 4.13系のバグ https://github.com/shaka-project/shaka-player/issues/8066 https://github.com/shaka-project/shaka-player/pull/8067
ライブラリバージョンアップで発生した課題 ライブラリバージョンアップで発生した課題 発生した事象② 特定の再生環境・デバイスで最大画質が1080p→720pに落ちてしまう Windows/Edgeのみで発生 Shaka Player 4.14系のバグ https://github.com/shaka-project/shaka-player/issues/8478 https://github.com/shaka-project/shaka-player/pull/8585
グローバルの状態管理が抱える課題
グローバルの状態管理が抱える課題 プレイヤーリプレイスで行ったこと Shaka Playerのメジャーバージョンアップ 3系→4系へ Emotion(CSS in JS)→ Tailwind CSS
への移行 詳細はDMM TV Web速度改善の道 〜Tailwind CSS移行編〜 next/dynamic→ dynamic import(JSの標準動的インポート)へ移行 複数のhooksに分散したuseEffectの共通化→一つのカスタムフックとして まとめて分離・統一 グローバル状態ライブラリの移行 Apollo Client→Reduxへ
グローバルの状態管理が抱える課題 Apollo Clientとは? https://www.apollographql.com/docs/react GraphQLを使用してデータをフェッチする仕組みと、取得したデータの状 態を管理するキャッシュ機構が一体化したライブラリ
グローバルの状態管理が抱える課題 Apollo Clientとは? GraphQL からフェッチしたデータは InMemoryCache に保存される Apollo Client の提供するフック(useQueryなど)を使うことで、Reactコ
ンポーネントは InMemoryCache 内のデータにリアクティブにアクセスで きる InMemoryCache 内のデータが Mutation によって変更されると、Apollo Client はそのデータを使用しているすべてのコンポーネントを自動的に再 レンダリングする InMemoryCache は、ローカルのアプリケーションの状態(UIの状態な ど)も管理できる
グローバルの状態管理が抱える課題 どのような状態管理ライブラリが好ましいのか DMM TVは前提として、 求められる仕様が多く、複雑性が高いサービス
グローバルの状態管理が抱える課題 どのような状態管理ライブラリが好ましいのか どこからでも使える どこからでも呼び出せる どこからでも値の状態の変更ができる
グローバルの状態管理が抱える課題 どのような状態管理ライブラリが好ましいのか どこからでも使える どこからでも呼び出せる どこからでも値の状態の変更ができる
グローバルの状態管理が抱える課題 どのような状態管理ライブラリが好ましいのか どこからでも使える どこからでも呼び出せる どこからでも値の状態の変更ができる の逆が好ましい かつ、再レンダリングを抑えられて ナレッジが潤沢にあり、ベストプラクティスがある
Reduxを使うモチベーション
Reduxを使うモチベーション Reduxを使うモチベーション アプリケーションの状態がいつ、どこで、なぜ、どのように更新される かがわかりやすい 再レンダリングを抑えられる ナレッジが潤沢 ベストプラクティス(Redux Style Guide)がある
Reduxを使うモチベーション Reduxを使うモチベーション
リプレイス前後のパフォーマンス
リプレイス前後のパフォーマンス リプレイス前後のパフォーマンス リプレイス前後で平均再生速度が体感20〜30%程度高速化 通常再生時:2.6s→ 再読み込み時:4.0s→ 2.0s 3.0s
リプレイス前後のパフォーマンス リプレイス前後のパフォーマンス 計測環境 使用OS:Windows 10 Pro ブラウザ:Google chrome(バージョン: 121.0.6167.185(Official Build)
(64 ビット)) 計測回数は5回操作を行った平均値
まとめ
まとめ まとめ 動画配信サービスには、ABR/MSE/EMEという基盤技術が存在する Shaka Playerは、これらを包括的に利用できるライブラリ DMM TVでは、Shaka Playerを基盤とした独自の動画配信プレイヤーを運 用している 「動画配信サービスの再生プレイヤー」の性能=ユーザー体験に直結する
そのため、堅牢化とパフォーマンス改善を目的としたリプレイスを行った グローバル状態管理ライブラリの刷新 Shaka Playerのアップデート リプレイスの結果、体感20〜30%程度の高速化が実現できた
Thank you!