Hardware & Capabilities · Browser Tests

Codec & Media Support Test

Test which video and audio codecs your browser can play, from H.264 and AV1 to Opus and FLAC.

Testing your codecs…

Formats your browser can play

0
Playable
0
Formats tested
0
Streamable types
Formats reported as playable —

MP4 and H.264

WebM, VP8 and VP9

Audio codecs

MediaSource (streaming)

MediaRecorder (recording)

Capability detail

A ✓ means the browser answers probably, a ~ means it answers maybe, and a ✕ means it reports no support. These are capability declarations, not a test playback, and DRM-protected formats are not checked here.

On this page
  1. What this test checks
  2. How canPlayType answers
  3. Containers and codecs
  4. Streaming and recording
  5. A hint, not a promise

What the codec test checks

This page asks your browser which video and audio formats it can actually play. It probes MP4 with H.264, HEVC and AV1, WebM with VP8 and VP9, the Ogg container, and the audio codecs AAC, Opus, Vorbis, FLAC, ALAC, MP3 and PCM. Each answer comes from the same capability check a real media player uses before it tries to load a file.

The result is a practical map. It tells you whether a downloaded video will open, whether a video call site can use the efficient codec it prefers, and whether an audio file in an unusual format will play at all. It also reveals the packaging choices behind your browser, since the same Chromium build can include or omit proprietary codecs depending on who compiled it.

Three answers, not two

A format can be supported ✓, uncertain ~ or unsupported ✕. The middle answer is the interesting one: it means the browser will not commit without attempting an actual decode.

How canPlayType answers

The whole test rests on one method, canPlayType, called on a media element that is never added to the page. You hand it a MIME type such as video/webm; codecs="vp9" and it returns one of three strings. probably means the browser is confident. maybe means the answer depends on something it cannot determine from the string alone, often the exact profile or level inside a codec family. An empty string means the format is not supported.

The method is a lookup, not a decode. It consults the list of decoders the browser has registered and answers immediately, which is why every chip above appears the moment the page loads. That speed is also its weakness: it can promise support the machine cannot deliver at the resolution you actually want, because a decoder that handles a low-profile stream may struggle with a high-profile one on the same hardware.

The MIME string matters as much as the codec name. Adding a codecs parameter narrows the question, and leaving it off asks only whether the container is recognised at all.

Containers, profiles and codecs

A container is a wrapper, and a codec is the compression inside it. MP4 and WebM are containers; H.264, VP9 and AV1 are video codecs; AAC, Opus and Vorbis are audio codecs. Support is decided per combination, which is why the test probes both separately and together. A browser that plays H.264 inside MP4 may refuse the same video inside WebM.

Profiles add another layer. H.264 has Baseline, Main and High profiles, each with its own feature set, and the test asks about all three because older hardware sometimes decodes only the simplest. AV1 is the newest of the group and the most variable: where it is present it is usually decoded in hardware on recent chips and in software elsewhere, and the answer reflects that split.

On the audio side the container matters too. Opus is widely supported in WebM and Ogg but was historically absent from Safari, while AAC is close to universal. The audio fingerprint test uses the Web Audio API, which is a separate system again.

Streaming and recording

Two related APIs answer narrower questions. MediaSource lets a page feed video into a player in segments rather than as a single file, which is how adaptive streaming works, and MediaSource.isTypeSupported asks whether a specific type can be streamed that way. Its answer is stricter than canPlayType, because the browser has to be able to parse and append fragments, not just decode a finished file.

MediaRecorder.isTypeSupported covers the opposite direction: which formats the browser can encode from a camera or microphone stream. A browser may happily play VP9 while refusing to record it, so the two lists genuinely differ. Recording also costs CPU, and hardware encoders are far less widely available than decoders, which is why that list is usually the shorter one. The media devices test covers the inputs those recordings would come from.

A hint, not a promise

Treat every answer above as a strong hint rather than a guarantee. The check happens before any media is fetched, so it cannot account for a file that uses an unusual profile, an odd resolution or a container feature the decoder rejects on contact. It also says nothing about performance: a software decoder can report full support and then drop frames on a modest CPU.

Support is also not fixed in time. Codec availability changes with browser releases, operating system updates and hardware, and a machine that answers maybe today may answer probably after a driver update adds hardware decoding. Nor does any of this cover DRM, which sits above the codec layer and requires a licence exchange to test properly. For a wider view of what your browser reports about itself, the browser information test and the hardware test fill in the rest.

Frequently Asked Questions

How does a browser know which codecs it can play?
Every browser ships with a set of decoders, either built in or borrowed from the operating system, and canPlayType simply asks that set. It is a lookup rather than a playback test, which is why it answers instantly. The result can change with the browser version, the operating system and whether the build ships proprietary codecs at all.
What is the difference between "probably" and "maybe"?
Probably means the browser is confident it can play the exact type you asked about. Maybe means it cannot be certain without trying, usually because the answer depends on something it cannot see from the MIME string alone. An empty string means no support. The chips above mark the three cases as ✓, ~ and ✕.
Why does my Linux browser show no H.264 support?
Some Chromium builds distributed by Linux distributions are compiled without the proprietary codec bundle, so H.264 and AAC are genuinely absent rather than hidden. The same page in Chrome or Edge on the same machine may play them fine. It is a packaging decision, not a hardware limit, and the browser information test can help confirm which build you are on.
Does this test check DRM, like Netflix playback?
No. Encrypted Media Extensions and the Widevine, PlayReady and FairPlay DRM systems are a separate layer on top of codec support, and they need a real licence exchange to test properly. A browser that answers probably for H.264 may still be unable to play a DRM-protected stream, and vice versa.
Can a site use my codec list to identify me?
It is a weak signal, because the list follows the browser engine far more than the person. Chrome on Windows answers almost identically for millions of users. It still adds a small amount of entropy in combination with other checks, which is what the fingerprint test shows when it weighs signals together.