BlogScreenshots on your device
How to Capture Webpage Screenshots With a Chrome Extension While Flash Video Plays
Chrome no longer plays Flash, so extensions cannot capture live Flash video. Learn the supported screenshot and recording workflows for modern web video.

Short answer: a current Chrome extension cannot capture a Flash video while it plays because current Chrome does not play Flash at all. Google states that, as of 2021, “Flash content, including audio and video, will no longer play back in any version of Chrome.” Chrome Enterprise Help documents the restriction.
This is a playback limitation, not a missing screenshot permission. An extension can capture pixels Chrome has rendered, but it cannot provide a Flash runtime or make an unsupported plugin run. First determine whether the page has an HTML5 replacement, a downloadable original, or an authorized archive. If modern video is available, use a visible-tab screenshot for a still image or tab capture for a recording.
1. Identify the result you actually need
| Goal | Suitable method | Important limitation |
|---|---|---|
| One still image of the visible page | chrome.tabs.captureVisibleTab() or a screenshot extension |
Captures the current rendered viewport only |
| A full-page still | An extension that scrolls and stitches the page, or an API with full-page capture | Sticky elements, lazy loading and infinite scroll need special handling |
| Motion and audio | chrome.tabCapture or getDisplayMedia() |
Requires a user gesture and permissions; it records supported output, not Flash |
| Legacy Flash-only material | Publisher migration, downloadable source, or an authorized archive | Do not install old Flash binaries or weaken browser security |
2. Capture a still from supported HTML5 video with a Chrome extension
The following minimal Manifest V3 extension captures the visible area of the active tab when its toolbar button is clicked. It works when the page is rendered by current Chrome, including pages using HTML5 video.

manifest.json
{
"manifest_version": 3,
"name": "Visible Tab Screenshot",
"version": "1.0.0",
"description": "Save a screenshot of the active tab.",
"permissions": ["activeTab"],
"action": {
"default_title": "Capture visible tab"
},
"background": {
"service_worker": "service-worker.js"
}
}
service-worker.js
chrome.action.onClicked.addListener(async (tab) => {
if (!tab.windowId) return;
try {
const dataUrl = await chrome.tabs.captureVisibleTab(tab.windowId, {
format: "png"
});
const filename = `chrome-shot-${new Date().toISOString().replace(/[:.]/g, "-")}.png`;
await chrome.downloads.download({
url: dataUrl,
filename,
saveAs: true
});
} catch (error) {
console.error("Screenshot failed", error);
}
});
Add the downloads permission to the manifest:
"permissions": ["activeTab", "downloads"]
Install and use it
- Create a folder containing both files.
- Open
chrome://extensionsand enable Developer mode. - Choose Load unpacked and select the folder.
- Open a page with an HTML5 video, pause at the desired frame, and click the extension button.
captureVisibleTab captures the visible area of a tab; it does not capture content that Chrome has not rendered, hidden off-screen content, or an unavailable Flash plugin. See the Chrome tabs API reference.
3. Timing and video-specific details
- Pause first: pausing the HTML5 player gives you a deterministic frame. A screenshot taken while frames are changing may show any rendered frame.
- Wait for controls to disappear: move the pointer away or wait for the player controls to hide before capture.
- Use the visible viewport: browser zoom, device-pixel ratio and window size affect the output dimensions.
- Cross-origin video: a screenshot of the tab can include video displayed by the page even when JavaScript cannot read the video pixels. Canvas extraction is different and may be blocked by cross-origin rules.
- Protected playback: DRM or protected surfaces may appear blank or black to capture APIs. An extension cannot bypass those protections.
- Full-page capture: a video below the fold may not be rendered until scrolling. Capture the viewport containing the player, or use a tool that explicitly supports full-page rendering.
4. Record supported tab video instead of taking a still
If you need motion, use a media stream rather than a screenshot. Chrome’s chrome.tabCapture API can provide the current tab’s video and audio after the user invokes the extension. The web platform’s getDisplayMedia() presents a browser selection dialog.

Minimal extension recording example
The service worker starts a capture request after the action button is clicked. In production, pass the stream ID to an extension page or offscreen document, create a MediaRecorder, and save the resulting WebM. The exact stream-transfer design depends on your Manifest V3 architecture.
chrome.action.onClicked.addListener(async () => {
const streamId = await chrome.tabCapture.getMediaStreamId();
console.log("Stream id", streamId);
// Use this id from an extension page/offscreen document with getUserMedia.
});
Recording has a different permission and user-gesture flow from still capture. It also records only what Chrome can render. It cannot restore Flash playback.
5. Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Flash shows a blank box or plugin message | Chrome removed Flash playback | Find the publisher’s HTML5 migration, download, or authorized archive. An extension setting cannot fix this. |
captureVisibleTab throws a permission error |
The extension lacks the required permission or the call is not associated with the active tab | Declare activeTab (or the appropriate host permission), reload the extension, and invoke it from the toolbar. |
| The screenshot is the wrong size | Viewport dimensions, zoom, or device-pixel ratio differ from expectations | Resize the window, set zoom to 100%, and account for device pixels when processing the image. |
| The video area is black | Protected media, an unrendered surface, or a player still loading | Wait for playback, try a normal HTML5 source, and respect DRM restrictions. Do not attempt to bypass protection. |
| The frame contains controls or a tooltip | Pointer hover state or player controls are visible | Move the pointer away, pause, wait briefly, then capture. |
| Recording has no audio | Tab audio routing or capture configuration is incomplete | Follow the tabCapture audio guidance and route the captured stream to an AudioContext when required. |
| A full-page image misses the player | The player is outside the captured viewport or lazy-loaded | Scroll to the player and capture the visible tab, or use a full-page tool that waits for lazy content. |
6. Performance, reliability and privacy
- Still images are cheap: capturing one viewport avoids stitching and is usually more predictable than a full-page scroll.
- Keep captures user-driven: toolbar clicks make permission behavior clear and avoid surprise recording.
- Test at the target viewport: responsive players can change layout, controls and poster frames at different widths.
- Handle failures: log the tab ID and error, show a useful message, and let the user retry after the page settles.
- Respect rights and access controls: capture only material you are authorized to save or share. Screenshots do not grant permission to redistribute video.
7. Or skip the browser setup
If you need a clean screenshot of a modern page, ScreenshotNeo provides a GET endpoint that returns PNG, JPEG, WebP or PDF. It is useful when you do not need local browser automation:
cURL
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
ScreenshotNeo removes cookie and consent banners, newsletter popups and chat widgets before capture. Bot checks, blank pages, failed loads and cache hits are not billed, and response headers report the page verdict and billing result. It also offers an MCP server for AI agents, including Claude, Cursor and other MCP clients, with take_screenshot, get_page_info and capture_pdf tools. Free accounts include 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 shots.
Create a free ScreenshotNeo account.
8. FAQ
Can I enable Flash in Chrome with an extension?
No. Chrome no longer plays Flash in any version, so an extension cannot add playback support.
Can a screenshot extension capture a Flash file saved on my computer?
Only if a current, authorized player renders it as supported browser content. A file existing on disk does not make Chrome able to play Flash.
Should I use an old Chrome or Flash plugin?
Do not weaken browser security or install obsolete plugins. Prefer a publisher migration or an authorized archive.
Is a screenshot the same as a recording?
No. captureVisibleTab returns one still image. tabCapture and getDisplayMedia() provide media streams for recording supported content.
Will ScreenshotNeo make Flash play?
No. ScreenshotNeo captures pages that its browser renderer can load. It does not restore the discontinued Flash runtime.


