DEV Community

yqqwe
yqqwe

Posted on

FC2動画ストリーミングの深層:HLS解析とFFmpeg.wasmによる高性能ダウンローダーの構築

開発者として「動画をダウンロードする」というタスクに直面したとき、多くの人は単に.mp4ファイルのURLを探すことを想像します。しかし、FC2のような大規模なプラットフォームでは、動画は単一のファイルではなく、HLS (HTTP Live Streaming) という洗練されたプロトコルによって断片化され、保護されて配信されています。
今回、私は FC2動画保存(日本語版) を開発する過程で、ブラウザ上でのバイナリ処理の限界に挑戦しました。この記事では、FC2の動画配信アーキテクチャの解析から、FFmpeg.wasmを活用したクライアントサイドでの動画合成(Muxing)の実装詳細までを技術的に深掘りします。

1. FC2動画配信アーキテクチャの解剖

FC2動画は、ユーザーのネットワーク帯域に応じて画質を動的に変更する Adaptive Bitrate Streaming (ABS) を採用しています。
1.1 HLSプロトコルの構造
FC2のプレイヤーが動画を再生する際、まずマスタープレイリスト(.m3u8)をリクエストします。このファイルは以下の階層構造を持っています:
• Master Playlist: 1080p、720p、360pといった解像度ごとのサブプレイリストへのリンクが含まれています。
• Media Playlist: 特定の解像度における動画セグメント(TSファイル)のURLが時系列順に並んでいます。
• EXT-X-KEY: 動画が暗号化されている場合、AES-128等のキーURLとIV(初期化ベクトル)が記述されます。
1.2 動的トークンと認証の壁
FC2のAPI(get_info等)は、セッションごとに動的なトークンを要求します。単にURLをコピーするだけでは、CDN側で 403 Forbidden が返される仕組みになっています。ダウンローダーの実装においては、ブラウザのコンテキストを維持しつつ、適切な Referer や Cookie をシミュレートするエンジンの構築が不可欠です。

2. 技術選定:なぜ「ブラウザ完結型」なのか?

従来の動画ダウンロードツールは、サーバー側で動画を取得・結合してユーザーに渡す手法が一般的でした。しかし、本プロジェクトでは FFmpeg.wasm (WebAssembly) を採用し、すべての処理をブラウザ内で行うアーキテクチャを選択しました。
2.1 プライバシーとコストのトレードオフ

  1. Privacy-by-Design: ユーザーのダウンロード内容がサーバーを経由しないため、究極のプライバシー保護が実現できます。
  2. スケーラビリティ: 動画の結合(Remuxing)はCPU負荷が高い処理ですが、これをユーザーのローカルリソースで行うことで、サーバー側のインフラコストを最小限に抑え、無料で高品質なサービスを維持できます。

3. コア実装の技術的詳細

3.1 跨るCORS(Cross-Origin Resource Sharing)の突破
ブラウザのセキュリティポリシー(SOP)により、別ドメインのCDNからバイナリデータを直接取得することは制限されています。 私たちは、Transparent Proxy(透明プロキシ) レイヤーを構築しました。
• サーバー側はデータのバイナリを透過的に流す(Piping)だけで、一切のデータを保持しません。
• 応答ヘッダーに Access-Control-Allow-Origin: * を動的に注入することで、ブラウザ側のWASMエンジンがセグメントを取得可能にします。
3.2 信号量(Semaphore)による非同期並行制御
1つの動画は数百のTSセグメントで構成されます。これらを順次ダウンロードすると時間がかかりすぎ、一斉にダウンロードするとCDNにブロックされます。 そこで、Promiseベースの並行ダウンロード・プールを実装しました。
JavaScript
async function concurrentDownload(urls, limit = 6) {
const pool = new Set();
for (const url of urls) {
if (pool.size >= limit) {
await Promise.race(pool); // 空きが出るまで待機
}
const task = fetchSegment(url).then(() => pool.delete(task));
pool.add(task);
}
}
3.3 FFmpeg.wasm による高速再カプセル化(Remuxing)
TSファイルはすでにH.264でエンコードされているため、再エンコード(Transcoding)の必要はありません。-c copy フラグを使用することで、パケットを抽出してMP4コンテナに再格納するだけで済みます。これにより、画質の劣化をゼロに抑え、1080pの動画でも数秒で結合を完了させることが可能になりました。

4. 特化型最適化:不連続なタイムスタンプの補正

FC2のストリームでは、稀にセグメント間で PTS (Presentation Time Stamp) が不連続になることがあります。単純に結合すると、再生時に映像と音声がズレる(音ズレ)原因となります。 私たちのエンジンは、結合前にTSパケットのヘッダーを走査し、不連続なタイムスタンプを自動的に再計算・補正するロジックを搭載しています。

5. 結論:開発者による、開発者のためのツール

FC2動画保存ツール は、単なるスクレイピングツールではありません。現代のWeb標準技術である WebAssembly、WebWorkers、そしてストリーム処理 を組み合わせたエンジニアリングの成果物です。
本ツールの強み:
• 原画質維持: 1080pの最高画質をそのまま抽出。
• 安全・軽量: インストール不要で、すべての重い処理はブラウザのサンドボックス内で実行。
• 高速: 並行ダウンロードとWASMにより、待ち時間を極限まで短縮。
HLSの解析や、ブラウザでの大規模バイナリ処理について議論したい方は、ぜひコメント欄で教えてください。技術の力で、より自由で快適なWeb体験を構築していきましょう。

Tags: #JavaScript #WebAssembly #FC2 #VideoStreaming #HLS #WebDev #Japanese

Top comments (0)