A requested frame time in a browser-based video frame extractor is a media timeline position, not a guarantee of source-frame precision, and the two should not be confused. When you enter a value such as 12.375 seconds, the HTMLMediaElement seeks to that position, the browser draws whatever decoded frame is closest, and that frame is encoded as a PNG. The decoded frame is chosen by the browser's media pipeline, which depends on keyframes, codec behavior, timestamp rounding, edit lists, and variable frame rates. The PNG you download keeps the decoded frame at its native dimensions, with no resizing, cropping, sharpening, or filtering applied. For thumbnails, references, slide decks, or quick stills from media you own or have permission to process, this matches the result most people actually want. For frame-accurate editorial work, exact numbered frames, HDR or color-managed output, alpha-channel workflows, or batch extraction across long footage, the right answer is a dedicated desktop tool that can inspect packet timestamps — not a browser pipeline. Understanding the difference is the first step to getting the still you actually need.

What "Accuracy" Means When You Extract a Frame from Video
When people search for "extract frames from video accuracy," they are usually asking two related but different questions. First, does the still they save correspond to the time they typed? Second, does the time they typed correspond to a specific numbered source frame? A browser-based extractor like the Video Frame Extractor is precise about the first question and limited about the second. The time field accepts fractional seconds from zero through the displayed duration, so values like 1.25 or 30.5 are preserved exactly as entered — that part is honest, and the output filename includes the selected time so the request is documented. What the browser returns, however, is the decoded frame nearest to that timeline position, and the displayed time records the requested position rather than the actual decoded frame's source-frame number. The output PNG also keeps the decoded frame at its native pixel dimensions, so the result is the same size as what the decoder produced — no scaling, sharpening, or smoothing has been applied to "fix" the image. That keeps the still honest: if the time you typed lands one frame off, the PNG shows exactly what the browser decoded, not a smoothed approximation of what you thought you asked for.
Why Browser Decoding Lands on Nearby Frames
The gap between requested time and source frame comes from how compressed video is actually stored. Most modern codecs only store a complete picture at certain intervals called keyframes (or I-frames); everything else is encoded as a delta from the nearest keyframe in either direction. When you seek to a position that is not itself a keyframe, the browser typically decodes the nearest keyframe and then plays forward until it reaches the requested timestamp. That forward play can round to the nearest decoded frame boundary, which means the still you save can be one or two frames away from the timestamp you typed. On top of that, several other behaviors can shift the result:
- Variable frame rate (VFR) footage, where the gap between frames is not constant, makes any time-to-frame calculation approximate.
- Edit lists that trim the container timeline without re-encoding the underlying stream can shift where the decoder thinks time "zero" is.
- Timestamp rounding inside the container can snap a request to the nearest container timestamp.
- Codec-specific seek behavior varies between H.264, HEVC, VP9, and AV1, and some seek strategies are faster but less precise than others.
According to the MDN HTMLMediaElement reference, the currentTime property represents a position on the media timeline and does not promise alignment with source-frame numbers; the result depends on how the underlying decoder satisfies the seek. The same caveat applies when the decoded frame is handed to the canvas with drawImage — the renderer gets the frame the decoder has on hand, not the frame at the packet timestamp you might have wanted.
File, Codec, and Output Boundaries
Accuracy is not the only thing that can block a frame extraction. Before any seeking happens, the browser has to decode the container, draw the decoded frame to a canvas, and encode the result as a PNG — every step has its own ceiling. The Video Frame Extractor applies a shared safety policy to every input so the operation stays bounded, predictable, and reportable when it fails. Files must stay within a documented envelope, and the output is constrained by what the canvas can encode. The limits below are not negotiable inside the tool; they exist so that the decoder, canvas, and PNG encoder always have room to do their work without timing out or producing a corrupt file.
| Limit | Value |
|---|---|
| Maximum file size | 500 MiB |
| Maximum duration | 5 minutes |
| Maximum pixels per side | 4096 px |
| Maximum output resolution | 3840 × 2160 |
| Supported containers | MP4, WebM, MOV, M4V, Ogg |
| Output format | PNG |
| Output dimensions | Decoded frame native size |
| Resizing, cropping, sharpening | None applied |
A supported extension does not guarantee that the codec inside the container is available. The same MP4 file may open in one browser and refuse to load in another if its codec isn't installed, because the browser only ships with the decoders it ships with. The same caveat applies to WebM, MOV, M4V, and Ogg: a working file on one machine may fail on another if the codec bundle differs. If the decoder, canvas draw, or PNG encoder fails at any step, the tool reports the failure rather than producing an empty or corrupt download — which is also part of accuracy: a clearly wrong result is better than a silently wrong one. Stale jobs and Object URLs are invalidated when inputs change or the component unmounts, so a half-finished extraction from a previous file cannot leak into the next.
How to Extract a Frame with the Video Frame Extractor
This is the short version of the workflow. The tool handles the file locally in the current tab — nothing is uploaded — and the PNG is generated from the decoded frame the browser exposes at the requested time.
- Choose one supported local video (MP4, WebM, MOV, M4V, or Ogg) that stays within the 500 MiB and 5-minute policy, then wait for the duration and preview to load. If the file does not load, the most likely reason is that the codec inside the container is not available in your browser — try a different file or a different encode.
- Enter a frame time in seconds between zero and the displayed duration, including decimals such as 1.25 or 30.5 when you need millisecond-style positioning. The field accepts fractional seconds, and the value you type is preserved exactly in the output filename.
- Select Extract PNG frame, verify the still in the preview, and download the local PNG. The filename will include the selected time so you can keep track of which moment you captured. If the still is off by a beat, nudge the time and re-extract — that is the supported way to dial in the moment you want.
Practical Tips to Get Closer to the Frame You Want
Because browser seeking is bounded by keyframe distance, a few habits make the result more predictable:
- Know your source frame rate. At 30 fps each frame is about 0.0333 seconds apart; at 60 fps it is roughly 0.0167 seconds. Picking a time that lands inside a frame interval — rather than at its boundary — gives a stable result across runs.
- Stay near a keyframe. Most encoders place a keyframe every 1 to 5 seconds; the closer your time is to a keyframe, the less drift the decoder tends to introduce. If you have access to the encode report or a player that shows keyframe ticks, use that information.
- Use decimals, not frame numbers. The field accepts fractional seconds; entering a value such as 12.375 documents what you asked for even if the decoded frame is one interval away. A request like "frame 4827" cannot be entered directly — only the time that frame approximately corresponds to.
- Verify before downloading. The still preview is the actual decoded image. If the frame is off by a beat, nudge the time by a small fraction and re-extract until the preview matches the moment you wanted.
- For exact numbered frames or batch work, switch tools. Anything that needs packet-level precision — exact frame 4827 of a 20-minute file, every frame of a 10-minute clip, HDR or color-managed output — is a job for a dedicated desktop video tool, not a browser pipeline. For a deeper look at the time-versus-frame-rate math, the guide on getting a video frame from frame rate and time walks through the same calculations in more detail.
Can the PNG keep transparency? Only if the browser's decoded video frame actually provides an alpha channel. Most encoded video does not, so the PNG will be opaque even if you expected transparency — the canvas preserves what the decoder hands it, not what the source format might suggest.
When Browser Accuracy Isn't Enough
The Video Frame Extractor is built for one frame at a time from short clips you already own or have permission to process. It does not batch, does not interpolate frames the decoder does not expose, and does not promise that a requested time equals a specific source-frame number. HDR color management, alpha-channel workflows, very long footage, container/codec combinations the decoder does not recognize, and editorial work where every frame number must match an EDL are outside its scope. The decision rule is simple: if you need to know which exact numbered frame you saved, the browser pipeline is the wrong layer to work at, because the decoded image is selected by the media engine and not by packet-timestamp math. For these cases, the path forward is a desktop NLE or a command-line tool with packet-level timestamp access — FFmpeg with a frame-rate-aware seek filter is the typical answer, and a frame-by-frame local extraction workflow covers the exact-timestamp case. For a quick reference still, a thumbnail for a slide, a paused moment for documentation, or a single PNG for a presentation, the browser pipeline is more than enough. For anything stricter, plan a step that goes below the canvas layer, into the demuxer.