← ブログに戻る

Chrome で Blob 動画をダウンロードする方法(2026年版)

blob: URL で右クリック保存が失敗する理由と、3つの実用的なダウンロード方法

ネットワークタブを開いて動画 URL を取得しようとしたら、blob:https://example.com/abc-def-1234 のようなものが見えました。それをクリックして動画ファイルが出てくると思いました。何も役に立つものは出てきません。右クリック → 名前を付けて保存では、0バイトのファイルを保存しようとします。このガイドでは、blob URL が実際に何なのか、従来のダウンロード方法がなぜ機能しないのか、そして基になっている動画を取得する3つの確実な方法について説明します。

blob URL が実際に何なのか

blob: URL はネットワークアドレスではありません。ブラウザのメモリに存在するデータへの JavaScript で作成された参照です。形式は以下の通りです:

blob:https://example.com/{uuid}

{uuid}URL.createObjectURL() によって生成され、ページの JavaScript がブラウザに渡したバイナリデータのチャンクを指します。ページが <video src="blob:..."> を設定すると、プレイヤーがそのメモリ内バッファから再生されます。

2つの重要な特性があります:

  1. ローカルのみ: blob URL は、それを作成したタブにのみ存在します。別のタブにコピー・ペーストしても、何も出てきません。その他のタブはソースデータへの参照を持っていません。
  2. 一時的: blob はタブが閉じられるか、ページが URL.revokeObjectURL() を呼び出したときにガベージコレクションされます。ページを更新すると、すべての blob URL が無効になります。

右クリック → 名前を付けて保存が失敗する理由は、Chrome が blob URL に対してネットワーク要求を行おうとするからです。データは JavaScript メモリに存在するため、レスポンスを返すサーバーがありません。HTTP エンドポイントには存在しません。

ページが動画に blob URL を使用する理由

最新のプレイヤーが blob URL を使用する理由は3つあります:

1. Media Source Extensions(MSE)

MSE は、JavaScript がフェッチされた別個のセグメントからビデオストリームを構築できる、ブラウザ API です(これは、ネイティブ HLS サポートなしでブラウザにおいてHLS と DASH プレイヤーがどのように機能するかです)。MSE パイプラインは MediaSource オブジェクトを生成し、URL.createObjectURL(mediaSource) を介して blob URL でラップされます。JavaScript が MSE バッファに新しいセグメントを継続的にフィードする間、ビデオ要素はその blob URL から再生されます。

最新の HLS/DASH プレイヤー(hls.js、dash.js、Shaka Player、Video.js)は、このパターンを使用します。blob URL が表示されているページが HLS を再生している場合、これが理由です。

2. 復号化された DRM ストリーム

Widevine、FairPlay、および PlayReady DRM システムは、閉じたシステム内でビデオストリームを復号化し、復号化されたバイトを MSE に渡します。その結果は、他の blob URL のように見えるが、ユーザーがプレーンテキスト形式で保存することが許可されていない復号化コンテンツが含まれている blob URL です。DRM で保護された blob URL は法的にダウンロード可能ではなく、我々はバイパス手法をカバーしていません。

3. プライバシー / 直接リンク防止

一部のサイトは blob URL を使用して右クリック保存を防止しています。ビデオデータは JavaScript を介してセグメントでフェッチされ、blob に組み立てられ、ユーザーが別のブラウザに貼り付けられる直接 MP4 URL がありません。これは、ダウンロード防止の柔らかい対策です。実際のセキュリティ境界ではありません。

方法 1: MSE で供給された blob を処理するブラウザ拡張機能

ビデオプレイヤーと同じタブで実行されるブラウザ拡張機能は以下の操作ができます:

  • プレイヤーが行う HLS/DASH マニフェストフェッチを監視する
  • 同じ認証済みセッションを使用して同じセグメントを再度フェッチする
  • FFmpeg.wasm を使用して MP4 にミックスする

これは、HLS/DASH 用に構築された拡張機能が行うことです。blob URL は関係ありません。拡張機能は、blob をフィードしたマニフェスト URL の1つ下のレベルに移動します。

Video Downloader One-for-All は blob で供給された動画を、blob URL を完全に無視することで処理します:

  1. blob 動画を使用したページを開く
  2. 再生が開始されるのを待つ
  3. 拡張機能アイコンをクリックします。マニフェストが検出されると、ツールバーバッジが青になります(プレイヤーが blob でラップしているかどうかに関係なく)
  4. 品質を選択し、[ダウンロード] をクリックします

ビデオ要素自体が blob URL を表示している場合でも、利用可能な品質の解像度と品質ドロップダウンが入力されるのを確認できます。拡張機能は blob ではなく、基になるマニフェストを読み取っています。

方法 2: DevTools ネットワークタブ + マニフェスト URL 抽出

実際に何が起こっているかを正確に理解したい場合は、手動で実行してください:

  1. blob 動画を使用したページを開く
  2. DevTools を開く(F12)
  3. ネットワークタブをクリックします
  4. フィルターボックスに m3u8 または mpd(HLS または DASH)と入力します
  5. ページを再読み込みする
  6. 動画を再生する
  7. プレイヤーが .m3u8 または .mpd マニフェストに対するリクエストを行い、その後、一連の .ts/.m4s/.mp4 セグメントファイルに対するリクエストを行うのが確認できます

マニフェスト URL を取得したら、FFmpeg または yt-dlp を使用してダウンロードできます:

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

ネットワークタブに .m3u8.mpd も表示されない場合は、.mp4 を検索してください(ページが生の MP4 チャンクを MSE にフィードしているかもしれません):

ネットワークタブフィルター:メディア

単一の .mp4 URL への連続した範囲リクエストを探してください。これらは MSE 駆動のプログレッシブダウンロードです。完全な URL(?range=... または ?start=... の前の部分)は、あなたが欲しいファイルです。

方法 3: MediaRecorder API(最後の手段)

blob URL に、検出できるネットワークマニフェストの基盤を持たない復号化コンテンツが含まれている場合があります。例えば、クライアント側で処理されたビデオ、ブラウザ内エディターの場合など。ビデオ要素の出力を新しい MP4 としてキャプチャするために、Chrome の MediaRecorder API を使用できます:

// ページの DevTools コンソールで実行
const video = document.querySelector('video');
const stream = video.captureStream();
const recorder = new MediaRecorder(stream, { mimeType: 'video/webm' });
const chunks = [];
recorder.ondataavailable = e => chunks.push(e.data);
recorder.onstop = () => {
  const blob = new Blob(chunks, { type: 'video/webm' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'video.webm';
  a.click();
};
recorder.start();
// ... 動画を最後まで再生 ...
recorder.stop();

これは WebM ファイルを生成します(必要に応じて FFmpeg で MP4 に変換できます)。キャッチは、MediaRecorder がビデオ再生のレートでキャプチャするため、1時間のビデオを記録するのに1時間かかります。そして、ビデオ要素が captureStream() 適格な状態にある場合にのみ機能します(ほとんどはそうですが、DRM で保護されているものはそうではありません)。

このアプローチには、スクリーンレコーディングと同じ制限があります:再エンコードロス(デコードされたビデオフレームを直接キャプチャするため、ロスはわずかです)、およびタブをフォーカスしたままにしておく必要があります。

blob 動画が検出可能なマニフェストを持たない場合

まれなケースでは、ページが完全に JavaScript でビデオデータを生成します。キャンバスベースのビデオエディター、ブラウザ内ゲームキャプチャ、カスタム WebGL パイプラインです。blob URL には、サーバーからフェッチされたことのないデータが含まれています。

これらのケースの場合、MediaRecorder が唯一のパスです。基になるファイルを見つけることはできません。基になるファイルが存在しないからです。ビデオはページのコードによってリアルタイムで作成されています。

よくある質問

Chrome がビデオ URL を実際のファイルではなく blob:https://... として表示するのはなぜですか?

ページが、ビデオ要素を単一のファイル URL に指すのではなく、JavaScript を使用してセグメントをMedia Source Extensions バッファにフィードしているからです。これは、アダプティブストリーミングでは正常で意図的です。

Ctrl+S を押すだけで blob URL を保存できませんか?

いいえ。Ctrl+S は動画ではなく、HTML ページを保存します。ページ自体でも、ビデオデータは永続的なファイルではなく JavaScript メモリに存在します。

右クリック → 「動画を別名で保存」がグレーアウトしています。これは DRM ですか?

必ずしもそうではありません。多くの非 DRM blob 動画は、JavaScript(oncontextmenu ハンドラー)またはプレイヤーの構築方法によって右クリック保存を無効にします。DRM が関係しているかどうかを確認するためのパス:DevTools → アプリケーション → EME 関連イベントを確認します。ページのネットワーク要求で Widevine または FairPlay メッセージ交換が表示される場合、DRM が進行中であり、ダウンロードは法的に利用できません。

方法 2 からダウンロードしたファイルにオーディオがありません。

オーディオ/ビデオマニフェスト分離の問題が発生しています。これは HLS ダウンロードのオーディオとビデオが分離していますか?ここで修正する方法 で説明されています。ネットワークタブで別の audio.m3u8 またはオーディオのみの DASH セグメントを探し、両方を FFmpeg に渡します。

拡張機能はすべての blob 動画で機能しますか?

HLS/DASH/MSE で供給された MP4 により、blob 動画で機能します。これは 2026 年のほぼすべての非 DRM blob 動画です。DRM で保護された blob の場合、答えは「いいえ」です。これは修正可能な制限ではありません。純粋に JavaScript で生成された動画(まれ)の場合、MediaRecorder が唯一のパスです。

blob 動画のダウンロードは合法ですか?

答えは他の動画形式と同じです。コンテンツのライセンスと管轄権に応じて異なります。blob URL 自体はデータがブラウザにどのように配信されるかであり、法的ステータスは変わりません。

比較

状況最適な方法
HLS/DASH で供給された blob(最も一般的)ブラウザ拡張機能
下にあるものを確認する必要があるDevTools ネットワークタブ
ブラウザ内で生成されたコンテンツ(まれ)MediaRecorder API
DRM で保護された blob法的にダウンロード不可

まとめ

blob URL は動画ではありません。これは、ページが通常、基になる HLS または DASH マニフェストからメモリに組み立てたデータへの参照です。正しい戦略は blob URL を無視し、それが構築されたマニフェストを見つけることです。これはブラウザ拡張機能が自動的に行うことです。

Video Downloader One-for-All をインストールすると、blob 抽象化は見えなくなります。拡張機能は利用可能な品質と品質を表示し、blob かどうかに関わらずダウンロードします。基になる HLS プロトコルの詳細については、m3u8 / HLS ストリームをダウンロードする方法を参照してください。