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
0
110
Webブラウザ向け動画配信プレイヤーの 大規模リプレイスから得た知見と学び
フロントエンドカンファレンス北海道2025(
https://www.frontend-conf.jp/
) のLT登壇資料です。
yud0uhu
September 05, 2025
Tweet
Share
More Decks by yud0uhu
See All by yud0uhu
早朝の渋谷の青さ、あるいは溺れた人を助ける為に飛び込んだ海の向こう側に見る、自己覚知と自己開示の尊さ
yud0uhu
1
590
動画配信サービスのフロントエンド実装に学ぶ設計原則
yud0uhu
1
320
非デザイナーのフロントエンドエンジニアがOOUIを考える
yud0uhu
9
5.5k
2023年の ゼロランタイムCSS in JS⚡️ を考える
yud0uhu
5
4.8k
Vue3/Electronで自作したマークダウンエディタをVue3/Tauriにリプレイスした話
yud0uhu
2
2.8k
入社半年を迎える新米エンジニアがカンファレンス・勉強会から得た学び
yud0uhu
0
1k
Next.js×Prisma×GraphQL×Supabase +WASMでブログを自作した話
yud0uhu
0
1.2k
Rustでつくって学ぶProtocol Buffers
yud0uhu
1
180
ブログを自作した話
yud0uhu
1
28
Other Decks in Technology
See All in Technology
Grafana Meetup Japan Vol. 6
kaedemalu
1
190
生成AI時代のデータ基盤
shibuiwilliam
3
1.9k
250905 大吉祥寺.pm 2025 前夜祭 「プログラミングに出会って20年、『今』が1番楽しい」
msykd
PRO
1
210
進捗
ydah
2
230
Nstockの一人目エンジニアが 3年間かけて向き合ってきた セキュリティのこととこれから〜あれから半年〜
yo41sawada
0
170
なぜSaaSがMCPサーバーをサービス提供するのか?
sansantech
PRO
4
1.1k
実践アプリケーション設計 ②トランザクションスクリプトへの対応
recruitengineers
PRO
4
1.2k
つくって納得、つかって実感! 大規模言語モデルことはじめ
recruitengineers
PRO
32
12k
モバイルアプリ研修
recruitengineers
PRO
5
1.7k
Bye-Bye Query Spaghetti: Write Queries You'll Actually Understand Using Pipelined SQL Syntax
tobiaslampertlotum
0
120
大「個人開発サービス」時代に僕たちはどう生きるか
sotarok
4
540
Jaws-ug名古屋_LT資料_20250829
azoo2024
3
210
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
328
39k
KATA
mclloyd
32
14k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Music & Morning Musume
bryan
46
6.8k
Statistics for Hackers
jakevdp
799
220k
Optimizing for Happiness
mojombo
379
70k
BBQ
matthewcrist
89
9.8k
Producing Creativity
orderedlist
PRO
347
40k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
510
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
284
13k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
790
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!