← Back to blog

How to Download Blob Videos in Chrome (2026 Method)

Why right-click Save As fails on blob: URLs and three working methods to download videos served as blob URLs in 2026.

You opened the Network tab to grab a video URL and saw something like blob:https://example.com/abc-def-1234. You clicked it expecting a video file. You got nothing useful. Right-click → Save As tries to save a 0-byte file. This guide explains what a blob URL actually is, why no traditional download method works, and three reliable ways to get the underlying video.

What a blob URL actually is

A blob: URL is not a network address. It’s a JavaScript-created reference to data living in your browser’s memory. The format is:

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

The {uuid} is generated by URL.createObjectURL() and points to a chunk of binary data that the page’s JavaScript handed to the browser. When the page sets <video src="blob:...">, the player plays from that in-memory buffer.

Two key properties:

  1. Local-only: The blob URL only exists in the tab that created it. Copy-pasting it into another tab gives you nothing — that other tab has no reference to the source data.
  2. Ephemeral: The blob is garbage-collected when the tab closes or when the page calls URL.revokeObjectURL(). Refreshing the page invalidates every blob URL on it.

Right-click → Save As fails because Chrome tries to make a network request to the blob URL, and there’s no server to respond — the data is in JavaScript memory, not at any HTTP endpoint.

Why pages use blob URLs for video

Three reasons modern players use blob URLs:

1. Media Source Extensions (MSE)

MSE is the browser API that lets JavaScript build a video stream from segments fetched separately (this is how HLS and DASH players work in browsers without native HLS support). The MSE pipeline produces a MediaSource object, which gets wrapped in a blob URL via URL.createObjectURL(mediaSource). The video element plays from that blob URL while JavaScript continually feeds new segments into the MSE buffer.

Most modern HLS/DASH players (hls.js, dash.js, Shaka Player, Video.js) use this pattern. When you see a blob URL on a page that’s playing HLS, this is why.

2. Decrypted DRM streams

Widevine, FairPlay, and PlayReady DRM systems decrypt the video stream inside a closed system, then hand the decrypted bytes to MSE. The result is a blob URL that looks like any other but contains decrypted content the user is not allowed to save in plaintext form. DRM-protected blob URLs are not legally downloadable and we do not cover bypass techniques for them.

Some sites use blob URLs specifically to prevent right-click saves. The video data is fetched in segments via JavaScript and assembled into a blob, with no direct MP4 URL that a user could paste into another browser. This is a soft anti-download measure — not a real security boundary.

Method 1: Browser extension that handles MSE-fed blobs

A browser extension running in the same tab as the video player can:

  • Watch for HLS/DASH manifest fetches that the player makes
  • Re-fetch the same segments using the same authenticated session
  • Mux them into MP4 via FFmpeg.wasm

This is exactly what an extension built for HLS/DASH does. The blob URL is irrelevant — the extension goes one level deeper, to the manifest URLs that fed the blob.

Video Downloader One-for-All handles blob-served videos by ignoring the blob URL entirely:

  1. Open the page with the blob video
  2. Wait for playback to start
  3. Click the extension icon — toolbar badge turns blue when manifests are detected (regardless of whether the player wraps them in a blob)
  4. Pick the quality, click Download

You’ll see the resolution and quality dropdown populated even though the video element itself shows a blob URL — the extension is reading the underlying manifest, not the blob.

Method 2: DevTools Network tab + manifest URL extraction

If you want to understand exactly what’s happening, walk through it manually:

  1. Open the page with the blob video
  2. Open DevTools (F12)
  3. Click the Network tab
  4. In the filter box, type m3u8 or mpd (HLS or DASH)
  5. Reload the page
  6. Play the video
  7. You’ll see the player make requests for an .m3u8 or .mpd manifest, then for a series of .ts/.m4s/.mp4 segment files

Once you have the manifest URL, you can use FFmpeg or yt-dlp to download:

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

If neither .m3u8 nor .mpd shows up in the network tab, search for .mp4 (the page may be feeding raw MP4 chunks into MSE):

Network tab filter: media

Look for sequential range requests to a single .mp4 URL — those are MSE-driven progressive downloads. The full URL (the part before ?range=... or ?start=...) is the file you want.

Method 3: MediaRecorder API (last resort)

If the blob URL contains decrypted content that has no underlying network manifest you can find — sometimes the case for client-side processed video, like in-browser editors — you can use Chrome’s MediaRecorder API to capture the video element’s output as a new MP4:

// Run in the page's DevTools console
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();
// ... play the video to completion ...
recorder.stop();

This produces a WebM file (you can convert to MP4 with FFmpeg if needed). The catch: MediaRecorder captures at the rate the video plays, so a 1-hour video takes 1 hour to record. And it only works when the video element is in captureStream()-eligible state (most are; DRM-protected ones are not).

This approach also has the same limitations as screen recording: re-encoding loss (though minor since it captures the decoded video frames directly), and you have to keep the tab focused.

When the blob video has no findable manifest

In rare cases, a page generates video data entirely in JavaScript — a canvas-based video editor, an in-browser game capture, a custom WebGL pipeline. The blob URL contains data that was never fetched from any server.

For these cases, MediaRecorder is the only path. There is no underlying file to find because there is no underlying file — the video is being created in real-time by the page’s code.

Common questions

Why does Chrome show a video URL as blob:https://... instead of the actual file?

Because the page is using JavaScript to feed segments into a Media Source Extensions buffer rather than pointing the video element at a single file URL. This is normal and intentional for adaptive streaming.

Can I just save the blob URL by pressing Ctrl+S?

No. Ctrl+S saves the HTML page, not the video. Even on the page itself, the video data lives in JavaScript memory, not in any persistent file.

Right-click → “Save video as” is greyed out. Is this DRM?

Not necessarily. Many non-DRM blob videos disable right-click save by JavaScript (oncontextmenu handlers) or by the way the player is constructed. The path to verify whether DRM is involved: open DevTools → Application → check for EME related events. If you see Widevine or FairPlay message exchanges in the page’s network requests, DRM is in play and downloading is not legally available.

My downloaded file from method 2 has no audio.

You’re hitting the audio/video manifest separation problem covered in HLS Download Audio and Video Are Separate? Here’s How to Fix It. Look for a separate audio.m3u8 or audio-only DASH segments in the Network tab and pass both to FFmpeg.

Does the extension work on every blob video?

It works on blob videos backed by HLS/DASH/MSE-fed MP4 — which is almost all non-DRM blob videos in 2026. For DRM-protected blobs, the answer is no, and that’s not a fixable limitation. For purely JavaScript-generated video (rare), MediaRecorder is the only path.

Same answer as for any other video format: depends on the content’s license and your jurisdiction. The blob URL itself doesn’t change the legal status — it’s just how the data is delivered to your browser.

Comparison

SituationBest method
HLS/DASH backed blob (most common)Browser extension
Need to confirm what’s underneathDevTools Network tab
In-browser-generated content (rare)MediaRecorder API
DRM-protected blobNot legally downloadable

Bottom line

A blob URL is not the video. It’s a reference to data the page assembled in memory, usually from underlying HLS or DASH manifests. The right strategy is to ignore the blob URL and find the manifests it was built from — which is what a browser extension does automatically.

Install Video Downloader One-for-All and the blob abstraction becomes invisible: the extension shows you available qualities and downloads them, blob or not. For the underlying HLS protocol details, see How to Download m3u8 / HLS Streams.