M3U8/HLSストリーミングのダウンロード:完全初心者ガイド
有料講座を受講中、あるいはどうしても保存したいライブ配信のアーカイブがある。動画を右クリック——「保存」オプションはない。ダウンロードツールを試す——3KBの .ts ファイルが得られ、VLCでも開けない。
これがHLSストリーミングをユーザー視点で見た姿だ。このガイドでは仕組みを分解し、動画を完全に取り出す手順をステップバイステップで解説する。
HLSとは何か、なぜ存在するのか
HLS——HTTP Live Streaming——は2009年にAppleが作成し、当初はiPhone向けストリーミングに使われた。核心的なアイデアはシンプルだ:巨大な動画ファイルを一つ送るのではなく、小さな塊に分割し、標準HTTPで一つずつ配信する。
すべてのセグメントをつなぐ再生リストファイルが M3U8ファイル——拡張子 .m3u8 のプレーンテキストファイルだ。ブラウザのNetworkパネルで見える .m3u8 URLは、動画の目次であって動画そのものではない。
典型的なM3U8は以下のようになる:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.960000,
segment_000.ts
#EXTINF:9.960000,
segment_001.ts
...
#EXT-X-ENDLIST
各行 #EXTINF がセグメントの長さを定義し、その後にセグメントのURLが続く。1時間の動画を10秒セグメントにすると360個の .ts ファイルになる。プレイヤーは順番にダウンロードし、ユーザーには連続したストリームに見える。
アダプティブビットレート(ABR)
ほとんどのHLSストリームは実際にはアダプティブビットレートストリームだ。単一のM3U8ではなく、複数の品質バージョンをリストするマスターM3U8が存在する:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
360p/index.m3u8
プレイヤーは帯域幅に応じて適切な品質を選択し、帯域が変動してもシームレスに切り替える。これがYouTubeで回線が悪くてもカクつかない理由だ——4GBのファイルのダウンロード完了を待っているのではなく、次の10秒分だけを取得している。
なぜサイトは直リンクMP4よりHLSを好むのか
セグメント配信は海賊版対策を格段に難しくする:
- セグメントURLは頻繁に期限切れになる——2時間前に有効だったURLが今は403を返すことも
- AES-128暗号化で各セグメントを個別に暗号化でき、キーのローテーションも可能
- 単一のダウンロード可能ファイルが存在しない——「右クリックで保存」できるものがない
- CDN配信——実際の
.tsファイルは世界中の数十台のサーバーに分散している可能性がある
合法的な用途(アーカイブ、オフライン学習、アクセシビリティ)にとっては、これは確かに頭の痛い問題だ。HLSダウンロードツールが存在する理由がここにある。
適切なツールなしで試みると何が起きるか
DevToolsでM3U8 URLを見つけて直接ダウンロードしようとした場合:
- wget/curl M3U8:再生リストのテキストファイルが得られ、動画ではない
- ブラウザの「リンクを保存」:数KBのM3U8テキストをダウンロード、当然再生不可
- 一般的なダウンロードツール:エラーになるか、最初のセグメントだけを取得
- youtube-dl/yt-dlp:対応サイトなら使えるが、コマンドライン、Pythonが必要で、サイトの変更に追従するメンテナンスが必須
HLSを正しくダウンロードするには、以下のことができるソフトウェアが必要だ:
- M3U8フォーマットの解析
- 相対URLから絶対URLへの変換
- 数百の
.tsセグメントのダウンロード(できれば並列) #EXT-X-KEYのキーを使ったAES-128暗号化セグメントの復号- 再生可能なコンテナフォーマット(MP4またはTS)への結合または再多重化
これはパイプラインであり、単純なダウンロードではない。
FlowPickでHLSストリームをダウンロード
方法1:ブラウザ拡張機能(推奨)
拡張機能はブラウザ内で静かにM3U8リクエストをリッスンし、手動でURLを探す必要はない。
ステップ1:FlowPickをインストール
Chromeウェブストア、Edgeアドオン、またはFirefoxアドオンからインストール。
ステップ2:ページを開き再生を開始
M3U8リクエストはプレイヤー初期化時にのみ発行される。ページを開くだけでは不十分で、動画の再生を開始する必要がある。
ステップ3:FlowPickアイコンをクリック
ツールバーアイコンに検出されたストリーム数を示すバッジが表示される。クリックしてポップアップを開く。

ステップ4:画質を選択
アダプティブストリームの場合、FlowPickはマスターM3U8を読み取り、利用可能なすべての画質を表示する。必要な解像度を選択する。

ステップ5:ダウンロードと結合
Pickをクリック。FlowPickは設定されたスレッド数(デフォルト2、設定で増やせる)でセグメントを並列ダウンロードし、暗号化セグメントをローカルで復号し、MP4またはTSファイルに結合する(設定による)。全工程でサーバーを経由せず、ファイルはCDNから直接ディスクへ。
ダウンロード進捗
FlowPickポップアップの下部に現在のダウンロードタスクのリアルタイム進捗が表示される:ダウンロード済みセグメント数/総セグメント数、現在の速度、推定残り時間。数百セグメントの長尺動画でも、通常は数分で完了する。

方法2:オンラインツール(インストール不要)
既にM3U8 URLを持っているなら、M3U8オンラインダウンローダーを直接使えばよく、拡張機能のインストールは不要。
URLを貼り付け、画質を選択し、ダウンロードをクリック。公開ストリームには非常に有効だが、一部のプラットフォームではCORS制限がある(その場合、ページ自身の認証情報で動作する拡張機能の方が有利)。
m3u8 と入力 → 動画を再生 → Content-Typeが application/x-mpegurl のリクエストを探す。出力フォーマット:MP4かTSか?
FlowPickは2つの出力フォーマットに対応し、設定で切り替え可能:
| MP4 | TS | |
|---|---|---|
| 互換性 | 最高、ほぼすべてのプレイヤーが対応 | 一部の古いプレイヤーは非対応 |
| 処理速度 | FFmpeg WASMによる再多重化が必要、やや遅い | 直接バイナリ結合、極めて高速 |
| ファイルサイズ | TSより5-15%小さい(コンテナオーバーヘッドが少ない) | やや大きい |
| 適したシーン | 長期保存、プラットフォームアップロード、動画編集 | 速度重視、後でFFmpegで処理する場合 |
日常使いならMP4で十分。 後でFFmpegコマンドラインでさらに処理する予定がある場合や、回線が遅く再多重化ステップをスキップしたい場合のみTSを検討すればよい。
暗号化ストリーム:AES-128
多くの有料コンテンツは暗号化HLSを使用しており、M3U8に以下のような行がある:
#EXT-X-KEY:METHOD=AES-128,URI="https://api.example.com/key?token=abc123"
意味:各 .ts セグメントは128ビットAESキーで暗号化され、キーはそのURIから取得する。キーがなければ、生のセグメントバイトは無意味だ。
FlowPickはこれらすべてを自動処理する:
- URIからキーを取得(ブラウザのCookieとセッションを使用——ログイン状態で利用可能)
- ブラウザ内蔵のWeb Crypto APIで各セグメントをクライアント側で復号
- キーとセグメントデータが外部サーバーに送信されることは一切ない
FlowPickが処理できないもの: Widevine、PlayReady、FairPlay DRM。これらはハードウェアレベルのコンテンツ保護で、復号キーはデバイスにバインドされ、JavaScriptからはアクセスできない。NetflixやDisney+がこのカテゴリに該当する。
実際のユースケース
オンライン講座プラットフォーム(Udemy、Courseraなど)
ほとんどの講座プラットフォームは暗号化HLSを使用し、受講生がダウンロード後に返金するのを防いでいる。FlowPickはAES-128暗号化を処理できる——ログイン済みでアクセス権があることが前提。
操作リズム:講座動画を開く → 5秒再生 → FlowPickを開く → 720Pを選択(講座コンテンツには十分な画質で、ファイルも小さい)→ Pick。ダウンロード完了後すぐに再生確認し、音声同期をチェック。
ライブ配信アーカイブの録画
ライブ配信終了後、通常は短いアーカイブウィンドウ(24〜72時間)があり、その後プラットフォームが削除するか有料会員限定にする。この時間内にダウンロードするのが最もクリーンだ——ストリームは静的で、リアルタイム配信のようにURLが急速に期限切れになることもない。
判断方法:リアルタイム配信の場合、M3U8に #EXT-X-ENDLIST タグがない。このタグがあれば配信は終了しており、完全にダウンロード可能な静的ストリームだ。
自動字幕付きコンテンツ
一部のプラットフォームのHLSストリームには多言語音声トラックが含まれ、M3U8内で #EXT-X-MEDIA:TYPE=AUDIO としてリストされる。FlowPickはこれらを検出し、利用可能な音声トラックを表示して選択できる。
よくあるトラブルシューティング
「0件のストリームを検出」
最も一般的な原因:動画の再生がまだ始まっていない。M3U8リクエストはプレイヤー初期化時にのみ発行される。再生を押し、バッファが1〜2秒進むのを待つ。
サイトがプレイヤーをiframe内に配置している場合(埋め込みプレイヤー、講座プラットフォーム)、動画を右クリック → 「フレームを新しいタブで開く」、そのタブでFlowPickを使用する。
「X%でダウンロードが止まった」
ストリームURLが期限切れ。ほとんどのプラットフォームのセグメントURLの有効期限は4〜6時間、ライブコンテンツでは30分の場合もある。
解決策:ページを更新し、動画を再再生して新しいURLを取得し、FlowPickで再検出する。
「ダウンロードしたファイルが再生できない」
いくつかの可能性:
- セグメント破損:単一の破損した
.tsが結合を壊す。低画質バージョンを試す。 - 非標準TSフォーマット:FlowPickはFFmpeg WASMで再多重化を処理するが、エッジケースは存在する。
- 音声・動画の同期ずれ:VLCで開き、「常に修復」を選択(メディア → 変換/保存 → プロファイル → 動画コーデック → 「破損または欠落したAV同期を修復/無視」にチェック)。
「単一の.tsファイルしかダウンロードされない」
Firefox上や結合ステップがサイレント失敗した場合に発生。ChromeまたはEdgeに切り替える——ChromeのFile System Access APIが大容量ファイルの直接ディスク書き込みを可能にするため、結合サポートが優れている。
ダウンロード速度が非常に遅い
デフォルトの並列スレッド数は2で、やや保守的。FlowPick設定でスレッド数を4〜6に上げると、通常は顕著な速度向上が見られる。上げすぎに注意——並列接続が多すぎるとサーバー側のレート制限をトリガーする可能性がある。
大容量ファイルのダウンロードについて
FlowPickはブラウザのFile System Access APIによるストリーミング書き込みで、理論上ファイルサイズ制限がない。4K動画、数GBの長尺コンテンツも問題なく、ファイルサイズによるブラウザクラッシュやメモリ不足は発生しない。
ChromeとEdgeが大容量ファイルに最も適している(完全なFSAストリーミング書き込み)。Firefoxも対応しているが、異なる書き込み戦略を取るため、超大容量ファイルのシナリオではChromeより安定性がやや劣る。
クイックリファレンス:HLSともう一つのフォーマット
.m3u8 ではなく .mpd ファイルに遭遇した場合、それはDASH——別の関連ストリーミングプロトコルだ。詳細は DASHストリーミングとは?MPDファイルの解説 を参照。
どちらもFlowPickで処理でき、操作フローは基本的に同じ。主な違いはDASHが独立した音声・動画トラックを持ち、結合が必要なため処理時間がやや長くなる点だ。
おすすめ記事
- FlowPickがブラウザ内でセグメントをMP4に結合する仕組み — ダウンロードボタンの裏で何が起きているか、技術パイプライン全体を分解
- DASHストリーミングとは?MPDファイルの解説 — もう一つの主要ストリーミングプロトコル、HLSとの核心的な違い
- Bilibili動画をローカルにダウンロードする方法 — BilibiliのほとんどのコンテンツはDASH、ライブ配信はHLS
- Webページの音声を検知してダウンロード:ポッドキャスト、BGM、オーディオブック — HLS音声ストリームも同じフローで処理可能
- Webページから画像を一括ダウンロードする方法 — 同じ拡張機能で画像も一括取得
- FlowPick vs Video DownloadHelper 比較 — この分野で最も歴史のある拡張機能との横断比較