← ブログに戻る

m3u8/HLSストリームのダウンロード方法: 完全ガイド2026

m3u8の仕組み、HLSマージが必要な理由、3つの実践的ダウンロード方法を解説。初心者向けから上級者向けまで。

保存したい動画を見つけました。Chromeの開発者ツールのネットワークタブを開いて、再生を開始すると .m3u8 URL へのリクエストが表示されました。さてどうしましょう?そのURLからダウンロードできるファイルは、204バイトのテキストファイルであり、動画そのものではありません。実際の動画は、その中に記載されている何百もの小さな .ts ファイルなのです。これがHLS — 2026年のウェブのほとんどのライブ配信とオンデマンド動画を支える配信プロトコルです。

このガイドでは、HLSとm3u8が実際には何なのか、なぜ「m3u8をダウンロード」することがURLをコピーするより複雑なのか、そして初心者から上級者向けまでの3つの実践的な方法を説明します。

HLSとは何か、そしてm3u8とは

HLSはHTTP Live Streamingの略です。Appleが2009年に、特殊なストリーミングサーバーなしで標準的なHTTP接続を使って動画をストリーミング配信する方法として開発しました。現在、ウェブ上の動画の支配的なプロトコルとなっており、放送ネットワーク、ビデオオンデマンドプラットフォーム、ライブストリーム、埋め込み講義、ほとんどの広告サポート動画で使用されています。

トリックは、HLSの「動画」が1つのファイルではないという点です。それは以下の要素で構成されています:

  1. .m3u8 拡張子のプレイリストファイル(本質的にはUTF-8テキスト)
  2. メディアセグメントのリスト — 通常は .ts ファイル(MPEG Transport Stream)または .m4s フラグメント(フラグメント化されたMP4)— 通常は各2~10秒の長さ
  3. 独立したオーディオプレイリスト(独自のオーディオセグメント付き)の場合もあります
  4. 字幕プレイリストの場合もあります

ブラウザの動画プレイヤーはプレイリストを読み込み、セグメントを順番にダウンロードし、再生しながらリアルタイムで連結します。「m3u8をダウンロード」すると、目次のみをダウンロードしたことになります。

m3u8ファイルが実際に含むもの

典型的なメディアプレイリストは次のようになります:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.0,
segment000.ts
#EXTINF:10.0,
segment001.ts
#EXTINF:9.5,
segment002.ts
#EXT-X-ENDLIST

#EXTINF 行は次のセグメントの長さを指定します。最後の #EXT-X-ENDLIST はこれがVOD(ビデオオンデマンド)であることを示します。ライブストリームの場合、この行は存在せず、マニフェストは数秒ごとに新しいセグメントが追加されていきます。

マスタープレイリストはより上位のレベルにあり、複数の異なる品質のメディアプレイリストを指します:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=720x480
480p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/playlist.m3u8

最新のマスタープレイリストは、独立したオーディオマニフェスト、独立した字幕マニフェスト、および代替ビデオストリーム(HDR、異なるコーデックなど)を参照する場合もあります。オーディオ/ビデオの分離に関する詳細については、HLSダウンロード時のオーディオとビデオが分離する問題?その解決方法を参照してください。

「m3u8をダウンロードしてmp4に名前を変更」が機能しない理由

これは最も一般的な誤りです。.m3u8 ファイルはテキストであり、名前を変更してもその内容は変わりません。204バイトのテキストファイルがあるだけです。何らかの方法でプレイヤーにそれを処理させたとしても、セグメントURLをフェッチしようとするでしょう。それはまさに元々のプレイヤーが既に行っていた作業です。

HLSストリームを再生可能なMP4に変換するには、以下を行う必要があります:

  1. マスタープレイリストを解決 → 目的の品質を選択 → 対応するメディアプレイリストをフェッチ
  2. メディアプレイリストに記載されているすべてのセグメントをフェッチ(数百のファイルもあり得ます)
  3. ストリームが暗号化されたセグメント(AES-128またはSAMPLE-AES)を使用している場合、復号化キーをフェッチして各セグメントを復号化
  4. セグメントを順番に連結
  5. オーディオとビデオが別のマニフェストにある場合、上記のすべてを並行して2回行い、結果をマージ
  6. 連結によって発生したタイムスタンプの問題を修正
  7. 結果をMP4コンテナでラップ(または一部の用途では .ts として保持)

これは手動で行いたくなるほどの作業です。以下は、これを委譲する3つの方法です。

方法1: Chromeエクステンション(コマンドラインなし)

ビデオプレイヤーと同じタブ内で実行されるブラウザエクステンションは以下が可能です:

  • プレイヤーが読み込む際のマスタープレイリストを確認
  • プレイヤーの認証(クッキー、ヘッダー、署名付きURL)を継承
  • オーディオとビデオマニフェストが分離している場合、自動的にペア化
  • AES-128復号化を透過的に処理
  • FFmpeg.wasmを使用してブラウザ内で結果をMP4にミックス

Video Downloader One-for-Allは、この目的で保守しているエクステンションです。ワークフローは以下の通りです:

  1. Chrome Web Storeからインストールし、ツールバーにピン留め
  2. HLSコンテンツがあるページにアクセス。プレイヤーが読み込む際にエクステンションがマニフェストを自動検出
  3. エクステンションアイコンをクリック — コンテンツが検出されるとツールバーバッジが青くなります
  4. ドロップダウンから品質を選択
  5. ダウンロードをクリック

HLSの機能全体はHLSダウンローダーページにあります。エクステンションが背後で何をしているかについての技術的なコンテキストについては、このガイドが長形式のコンパニオンです。

方法2: yt-dlp(コマンドライン、バッチ処理向け)

yt-dlp はメディアURLを取り込んで基になるストリームを自動的に解決するPython CLIです。バッチ操作、スクリプト処理、パイプラインに優れています。インストール:

# macOS
brew install yt-dlp

# pip
pip install yt-dlp

その後、HLSストリームをダウンロードするには:

yt-dlp "https://example.com/path/to/master.m3u8"

最高品質でオーディオとビデオをマージする場合:

yt-dlp -f "bv*+ba/b" --merge-output-format mp4 "https://example.com/master.m3u8"

-f "bv*+ba/b" セレクタは「最高品質のビデオストリーム + 最高品質のオーディオストリーム、フォールバックとして最高の単一結合ストリーム」を意味します。これはオーディオ/ビデオの分離されたマニフェストを自動的に処理します。

yt-dlpがよく機能する場合:

  • 認証壁のない公開VOD
  • yt-dlpのエクストラクタライブラリが特に対応しているサイト(数千サイトがリストアップされています)
  • URLのリストから複数のダウンロード

yt-dlpが困難な場合:

  • 認証済みのブラウザセッションが必要なストリーム
  • 積極的なCloudflareまたはトークンローテーション壁の背後にあるサイト
  • ライブストリーム(yt-dlpはライブHLSを記録できますが、信頼性は様々です)
  • TLSフィンガープリント検出のあるサイト

これら全てに対しては、ブラウザエクステンションがより信頼性が高いです。ブラウザのセッションを継承するからです。

方法3: FFmpeg(ワンライナー、最低レベル)

FFmpegはm3u8 URLを直接処理できます:

ffmpeg -i "https://example.com/master.m3u8" -c copy output.mp4

これは以下の場合に機能します:

  • マスタープレイリストが認証なしで到達可能
  • オーディオがビデオセグメントにミックスされている(古いHLSストリーム)
  • CDNが特別なヘッダーを必要としない

オーディオとビデオが分離した最新ストリームの場合、両方のマニフェストを指定する必要があります:

ffmpeg \
  -i "https://example.com/video/1080p/playlist.m3u8" \
  -i "https://example.com/audio/eng/playlist.m3u8" \
  -c copy \
  -bsf:a aac_adtstoasc \
  output.mp4

CDNがRefererヘッダーを必要とする場合(Bilibiliや日本の一部の放送局、多くの埋め込みプレイヤーで一般的):

ffmpeg \
  -headers "Referer: https://example.com/video-page" \
  -i "https://cdn.example.com/master.m3u8" \
  -c copy \
  output.mp4

FFmpegは最も柔軟なツールですが、最も扱いにくいツールでもあります。多くの場合、DevToolsでURLを見つけたり、正しいヘッダーを設定したり、期限切れのトークンを処理したり、ストリームがローテーションされた場合は再実行したりする必要があります。ワンオフの診断に適していますが、日常的な使用には手間がかかります。

m3u8 URLの見つけ方

ページが直接ダウンロードリンクを公開していない場合(ほぼすべてのページがそうです)、DevToolsでm3u8 URLを見つけます:

  1. Chromeで動画ページを開く
  2. F12またはCmd+Option+Iを押してDevToolsを開く
  3. Networkタブをクリック
  4. フィルターボックスに m3u8 と入力
  5. 動画の再生ボタンをクリック
  6. ネットワークログに1つ以上の .m3u8 URLへのリクエストが表示されます
  7. 最初のもの(多くの場合 master.m3u8 または playlist.m3u8 という名前)がマスタープレイリストです
  8. 右クリック → コピー → URLをコピー

複数のm3u8リクエストが表示される場合、最初のものは通常マスタープレイリストで、その後のものは品質別のメディアプレイリストです。FFmpeg/yt-dlpではマスタープレイリストが必要です。エクステンションはこの解決を自動的に行います。

HLSの一般的な落とし穴

m3u8 URLが60秒で期限切れになる

多くのCDNは短い有効期限でURLに署名します(典型的:60~300秒)。URLをコピーして5分後に試すと、403エラーが返されます。解決方法:ブラウザでページを更新して新しいURLを取得するか、ブラウザコンテキストで実行されるツールを使用します。

セグメントがAES-128暗号化を使用している

マニフェストに #EXT-X-KEY:METHOD=AES-128,URI="key.bin" が表示されます。セグメントは暗号化されており、復号化にはキーが必要です。yt-dlpとFFmpegはこれを自動的に処理します。古いブラウザエクステンションはそうではなく、暗号化されたバイトをダウンロードして再生不可能なファイルを生成します。

ストリームがSAMPLE-AESを使用している(DRM近似)

#EXT-X-KEY:METHOD=SAMPLE-AES が表示される場合、暗号化は部分的です — 各セグメント内の特定のサンプルのみが暗号化され、セグメント全体ではありません。これはより高度な処理が必要です。yt-dlpはほとんどの場合に対応しています。一部のサイト(FairPlay、Widevine HLS)はDRMシステムを通してのみ利用可能なキーが必要です — これらは合法的にダウンロード可能ではなく、当方ではサポートしていません。

ライブストリームが数分後に切れる

ライブHLSマニフェストはスライディングウィンドウです — 最新の約30~60秒のセグメントのみが含まれます。FFmpegを一度指定して放置すると、マニフェストはローテーションしてダウンロードが停止します。ライブ記録には、新しいセグメントが表示されるたびにマニフェストを再フェッチするツールが必要です。当方のエクステンションのライブレコーダーがこれを行います。FFmpegは -live_start_index フラグでできますが、設定は複雑です。

ダウンロードしたファイルが再生されるがオーディオがない

オーディオ/ビデオマニフェスト分離の問題があります。オーディオ/ビデオ分離コンパニオン記事で説明されています。ビデオマニフェストだけではなく、両方のマニフェストをマージする必要があります。

比較:どの方法をいつ使うか

状況最適なツール
公開サイトからの気軽なワンオフダウンロードオンラインm3u8-to-mp4ツール
ブラウザ内のサイトから繰り返しダウンロードChromeエクステンション
既にあるURLの多数用のバッチスクリプトyt-dlp
ストリームがログインセッションを必要とするChromeエクステンション
ライブストリーム記録Chromeエクステンションまたはライブフラグ付きFFmpeg
特殊な認証の背後にあるストリーム(カスタムJWT、mTLSなど)カスタムヘッダー付きFFmpeg
教育的なもの/プロトコル自体のデバッグFFmpeg + DevTools

なぜStream Recorderはもはや答えではないのか

Stream Recorderというよく知られているChrome Web StoreのHLSエクステンションが再生可能なファイルをもはや生成していないため、このページを読んでいるのかもしれません。Stream Recorderは2025年8月1日以降更新されていなく、最新のオーディオ/ビデオマニフェスト分離がそれを破壊しています。これについてはStream Recorderが2026年で動作しない?最高のHLS/m3u8代替案で詳しく取り上げています。

結論

m3u8は単なるテキストファイルで、ビデオセグメントを指しています。「m3u8」をダウンロードすると、目次を取得するだけで、動画は取得できません。再生可能なファイルを取得するには、セグメントをフェッチし、暗号化されている場合は復号化し、分離されている場合はオーディオとビデオをマージし、MP4にミックスする必要があります。

ほとんどの人にとって、Chromeエクステンションはすべてをブラウザを離れることなく自動化します。ご自身の用途に合えば、Video Downloader One-for-Allをインストールしてください。バッチCLI処理の場合、yt-dlpは優れています。完全なコントロールが必要な場合、FFmpegです。

3つのすべてに使い場所があります。避けるべき誤りは、m3u8ファイルを動画そのものであるかのように扱うことです。