{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/reference/video-codec-support",
  "collection": "docs",
  "title": "Video codec support in browsers and devices",
  "description": "What browser documentation says about each video codec, and how to probe playback in HTML video, MSE and WebCodecs.",
  "canonicalUrl": "https://encode.wiki/reference/video-codec-support/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/reference/video-codec-support.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/reference/video-codec-support.md",
  "status": "current",
  "tags": [
    "video",
    "compatibility",
    "browsers",
    "hardware"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "Chromium audio/video codec and container support",
      "url": "https://www.chromium.org/audio-video/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Mozilla supported audio and video formats",
      "url": "https://support.mozilla.org/en-US/kb/audio-and-video-firefox",
      "accessedAt": "2026-10-04T00:00:00.000Z"
    },
    {
      "title": "WebKit features in Safari 17.0",
      "url": "https://webkit.org/blog/14445/webkit-features-in-safari-17-0/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "WebKit features in Safari 17.4",
      "url": "https://webkit.org/blog/15063/webkit-features-in-safari-17-4/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Firefox 126 release notes for developers (Theora disabled)",
      "url": "https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/126",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "W3C Media Capabilities",
      "url": "https://www.w3.org/TR/media-capabilities/",
      "accessedAt": "2026-10-04T00:00:00.000Z"
    },
    {
      "title": "W3C WebCodecs",
      "url": "https://www.w3.org/TR/webcodecs/",
      "accessedAt": "2026-10-04T00:00:00.000Z"
    },
    {
      "title": "W3C AV1 WebCodecs codec registration",
      "url": "https://www.w3.org/TR/webcodecs-av1-codec-registration/",
      "accessedAt": "2026-10-04T00:00:00.000Z"
    },
    {
      "title": "W3C AVC WebCodecs codec registration",
      "url": "https://www.w3.org/TR/webcodecs-avc-codec-registration/",
      "accessedAt": "2026-10-04T00:00:00.000Z"
    },
    {
      "title": "NVIDIA encode/decode support matrix",
      "url": "https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "headings": [
    {
      "depth": 2,
      "text": "Native browser playback",
      "anchor": "native-browser-playback"
    },
    {
      "depth": 2,
      "text": "Four playback paths",
      "anchor": "four-playback-paths"
    },
    {
      "depth": 2,
      "text": "Probe a concrete rendition",
      "anchor": "probe-a-concrete-rendition"
    },
    {
      "depth": 2,
      "text": "Hardware and device validation",
      "anchor": "hardware-and-device-validation"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/reference/video-codec-support/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/_preamble.md",
      "checksum": "c9dcd0f2cde87befb18414e4af8d3ff309241483b02765f86eee616d831a38b2",
      "bytes": 212
    },
    {
      "id": "native-browser-playback",
      "title": "Native browser playback",
      "depth": 2,
      "anchor": "native-browser-playback",
      "canonicalUrl": "https://encode.wiki/reference/video-codec-support/#native-browser-playback",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/native-browser-playback.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/native-browser-playback.md",
      "checksum": "38cd0b8bef47ab9e56edf5a8dcb14c0ab2e38c3a4b41e4a8cbc188ffbdc48b3d",
      "bytes": 4475
    },
    {
      "id": "four-playback-paths",
      "title": "Four playback paths",
      "depth": 2,
      "anchor": "four-playback-paths",
      "canonicalUrl": "https://encode.wiki/reference/video-codec-support/#four-playback-paths",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/four-playback-paths.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/four-playback-paths.md",
      "checksum": "da4aa47d4b95bcd75b0d5c08002aa001a62c6dc6dd4b000c015aebb468a5f710",
      "bytes": 1460
    },
    {
      "id": "probe-a-concrete-rendition",
      "title": "Probe a concrete rendition",
      "depth": 2,
      "anchor": "probe-a-concrete-rendition",
      "canonicalUrl": "https://encode.wiki/reference/video-codec-support/#probe-a-concrete-rendition",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/probe-a-concrete-rendition.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/probe-a-concrete-rendition.md",
      "checksum": "518b940a1598a61930158bc710cc610616b5f115a12a3ad2048cd658373d929a",
      "bytes": 2636
    },
    {
      "id": "hardware-and-device-validation",
      "title": "Hardware and device validation",
      "depth": 2,
      "anchor": "hardware-and-device-validation",
      "canonicalUrl": "https://encode.wiki/reference/video-codec-support/#hardware-and-device-validation",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/hardware-and-device-validation.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/reference/video-codec-support/hardware-and-device-validation.md",
      "checksum": "cc11cea6339763aa8bc172cc563536886a2d6f06ba72ec2af6c4f2cd180acc35",
      "bytes": 1416
    }
  ],
  "outboundReferences": [
    "/codecs/video/av1/",
    "/codecs/video/av2/",
    "/codecs/video/avc/",
    "/codecs/video/avs3/",
    "/codecs/video/dsv/",
    "/codecs/video/dsv2/",
    "/codecs/video/ecm/",
    "/codecs/video/ffv1/",
    "/codecs/video/hevc/",
    "/codecs/video/prores/",
    "/codecs/video/theora/",
    "/codecs/video/utvideo/",
    "/codecs/video/vc-1/",
    "/codecs/video/vp8/",
    "/codecs/video/vp9/",
    "/codecs/video/vvc/",
    "https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/126",
    "https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new",
    "https://support.mozilla.org/en-US/kb/audio-and-video-firefox",
    "https://webkit.org/blog/14445/webkit-features-in-safari-17-0/",
    "https://webkit.org/blog/15063/webkit-features-in-safari-17-4/",
    "https://www.chromium.org/audio-video/",
    "https://www.w3.org/TR/media-capabilities/",
    "https://www.w3.org/TR/webcodecs-av1-codec-registration/",
    "https://www.w3.org/TR/webcodecs-avc-codec-registration/",
    "https://www.w3.org/TR/webcodecs/"
  ],
  "checksum": "1d36808335534a2f642209bc3f441a149decadb9033d5fcffe705227b3dd3ae6",
  "contentFormat": "markdown",
  "markdown": "Checking a codec name is not enough. A file plays only if the browser handles the whole\ncombination: codec, profile, level or tier, bit depth, chroma, container and audio codec, through the\nplayback API you use.\n\n## Native browser playback\n\n| Format                              | Native browser playback                                                                                                                                                                                                                                                                                   | Check on your targets                                                                      |\n| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |\n| [AVC / H.264](/codecs/video/avc/)   | All major browsers. Chromium builds without proprietary codecs lack it.                                                                                                                                                                                                                                   | Profile, level and MP4 setup                                                               |\n| [HEVC / H.265](/codecs/video/hevc/) | Safari. Chrome only with a hardware decoder. Mozilla lists Firefox support as limited.                                                                                                                                                                                                                    | Hardware and OS availability, `hvc1` versus `hev1`, depth, chroma and HDR display behavior |\n| [VP8](/codecs/video/vp8/)           | Chrome and Firefox. Safari on macOS since 14.1, on iOS and iPadOS since 17.4.                                                                                                                                                                                                                             | File playback versus WebRTC, audio track and WebM/MSE path                                 |\n| [VP9](/codecs/video/vp9/)           | Chrome and Firefox. Safari on macOS since 14.1, on iOS and iPadOS since 17.4.                                                                                                                                                                                                                             | Profile 0 versus 2, 8/10/12-bit, chroma, HDR and hardware decode                           |\n| [AV1](/codecs/video/av1/)           | Chrome and Firefox. Safari 17+ only on devices with hardware AV1 decoding.                                                                                                                                                                                                                                | Device, profile, depth, level, software decode speed and container                         |\n| [Theora](/codecs/video/theora/)     | Legacy. Firefox disabled it by default in 126, and Chromium no longer lists it.                                                                                                                                                                                                                           | Not a web fallback any more                                                                |\n| Everything else                     | None: [VVC](/codecs/video/vvc/), [AV2](/codecs/video/av2/), [AVS3](/codecs/video/avs3/), [VC-1](/codecs/video/vc-1/), [FFV1](/codecs/video/ffv1/), [ProRes](/codecs/video/prores/), [Ut Video](/codecs/video/utvideo/), [DSV](/codecs/video/dsv/), [DSV2](/codecs/video/dsv2/), [ECM](/codecs/video/ecm/) | Ship a web rendition in one of the codecs above, or bring your own application decoder     |\n\nSources: [Chromium's codec list](https://www.chromium.org/audio-video/),\n[Mozilla's supported-format table](https://support.mozilla.org/en-US/kb/audio-and-video-firefox),\n[Firefox 126 release notes](https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/126), and\nWebKit's [Safari 17.0](https://webkit.org/blog/14445/webkit-features-in-safari-17-0/) and\n[Safari 17.4](https://webkit.org/blog/15063/webkit-features-in-safari-17-4/) notes. Edge and other\nChromium browsers follow Chrome, except where the vendor removes proprietary codecs.\n\n## Four playback paths\n\n| Path                           | Appropriate check                                                    | What a positive result leaves unresolved                                    |\n| ------------------------------ | -------------------------------------------------------------------- | --------------------------------------------------------------------------- |\n| Native file / HTML video       | `HTMLMediaElement.canPlayType()` and an actual file                  | Decode rate, seeking, timestamps, audio, HDR and display correctness        |\n| Media Source Extensions (MSE)  | `MediaSource.isTypeSupported()` for the intended byte-stream type    | Segmentation, initialization data, append boundaries and adaptive switching |\n| WebCodecs                      | `VideoDecoder.isConfigSupported()` for the exact codec configuration | Demuxing, timestamps, audio synchronization and frame rendering             |\n| JavaScript / WebAssembly codec | Application-specific decode test                                     | Integration, CPU and memory budget, battery cost and renderer correctness   |\n\nThe same browser can give different answers for each path. A WebCodecs decoder does not demux MP4 or\nplay audio by itself, and a software WASM decoder does not add to the browser's native codec list. The\n[WebCodecs specification](https://www.w3.org/TR/webcodecs/) defines the configuration queries and the\nencode and decode model.\n\n## Probe a concrete rendition\n\nRun this in the target page's browser console. The configurations are examples. Derive the real codec\nstring, dimensions, bitrate and frame rate from your encoded file, and use its container's MIME type.\n\n```js\nconst candidates = [\n  { name: 'AVC High 8-bit', contentType: 'video/mp4; codecs=\"avc1.640028\"' },\n  { name: 'HEVC Main 10', contentType: 'video/mp4; codecs=\"hvc1.2.4.L120.B0\"' },\n  { name: 'VP9 profile 0', contentType: 'video/webm; codecs=\"vp09.00.40.08\"' },\n  { name: 'VP9 profile 2', contentType: 'video/webm; codecs=\"vp09.02.40.10\"' },\n  { name: 'AV1 Main 10-bit', contentType: 'video/mp4; codecs=\"av01.0.08M.10\"' },\n];\nconst element = document.createElement('video');\nfor (const candidate of candidates) {\n  const result = {\n    name: candidate.name,\n    canPlayType: element.canPlayType(candidate.contentType),\n    mse: globalThis.MediaSource?.isTypeSupported(candidate.contentType) ?? null,\n  };\n  if (navigator.mediaCapabilities?.decodingInfo) {\n    try {\n      result.mediaCapabilities = await navigator.mediaCapabilities.decodingInfo({\n        type: 'file',\n        video: {\n          contentType: candidate.contentType,\n          width: 1920,\n          height: 1080,\n          bitrate: 6_000_000,\n          framerate: 30,\n        },\n      });\n    } catch (error) {\n      result.error = String(error);\n    }\n  }\n  console.log(result);\n}\n```\n\n`canPlayType()` returns an empty string, `maybe` or `probably`. [Media Capabilities](https://www.w3.org/TR/media-capabilities/)\nadds `supported`, `smooth` and `powerEfficient` estimates. These can be unavailable, and they do not\ncertify an HDR display, a specific decoder, or every frame of a file. For MSE, query with\n`type: 'media-source'` and your real configuration.\n\nA WebCodecs check uses the same idea with an AV1 configuration:\n\n```js\nif (globalThis.VideoDecoder?.isConfigSupported) {\n  const result = await VideoDecoder.isConfigSupported({\n    codec: 'av01.0.08M.10',\n    codedWidth: 1920,\n    codedHeight: 1080,\n    hardwareAcceleration: 'prefer-hardware',\n  });\n  console.log(result);\n}\n```\n\n`prefer-hardware` is a preference: a `supported: true` result can still mean software decoding. For AVC,\nsupply the AVC configuration data when your input needs it. The [AVC registration](https://www.w3.org/TR/webcodecs-avc-codec-registration/)\ndistinguishes AVC-format input from Annex B, and the [AV1 registration](https://www.w3.org/TR/webcodecs-av1-codec-registration/)\ndefines AV1 codec strings and chunk expectations. Handle unsupported configurations and decode errors\nin code rather than choosing a codec from a user-agent string.\n\n## Hardware and device validation\n\nHardware encoding and decoding are separate capabilities. Check the GPU or SoC model, OS, driver,\napplication backend, profile, depth, chroma, resolution and frame-rate limit. The\n[vendor matrix](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new) lists encode and decode\nsupport per sample format, and a newer chip in a product family is not evidence for an older one.\n\nFor each rendition you deliver:\n\n1. Inspect the final file with `ffprobe -show_streams -show_format`, and note the codec, profile, pixel\n   format, dimensions, frame rate and color metadata.\n2. Run a full decode with an independent software decoder to catch stream errors before device testing.\n3. Play the exact file on representative browsers and devices, including low-power and older supported\n   targets. Check startup, seeking, audio sync, captions, adaptive switching and dropped frames.\n4. Compare SDR range and matrix, and HDR output, against a known-good source and display path. A picture\n   on screen does not confirm color or tone mapping.\n\nKeep a fallback rendition, and handle playback errors without breaking the page.\n\nFor preservation and editing codecs, keep the original or a lossless master, and encode delivery\nrenditions separately. For AV2, ECM or custom codecs, use the matching decoder revision and state the\nresearch or deployment constraints of the output.\n"
}
