WebCodecsLimited availability
The WebCodecs API provides low-level access to individual video frames and chunks of audio samples, for full control over the way media is processed.
Not yet supported in all major browsers — check the table and provide a fallback.
Browser support
DesktopChrome
1–93Not supported
94+Supportedsince Sep 21, 2021
Current: 155Edge
12–93Not supported
94+Supportedsince Sep 24, 2021
Current: 154Firefox
1–129Not supported
130+Supportedsince Sep 3, 2024
Current: 157Safari
1–18.6Not supported
26+Supportedsince Sep 15, 2025
Current: 27MobileChrome Android
18–93Not supported
94+Supportedsince Sep 21, 2021
Current: 155Firefox Android
✕Not supportedup to 157
Current: 157Safari iOS
1–18.6Not supported
26+Supportedsince Sep 15, 2025
Current: 27How to use
Not supported in Firefox Android. Use feature detection below and provide a fallback (or a polyfill) for those browsers.
Example
Full syntax and examples are on MDN: AudioData.
Feature detection
JS · check before using
if ("AudioData" in globalThis) {
// AudioData is available
} else {
// load a polyfill or use a fallback
}Specification
Usage share
Sub-features
Support for each part of the feature (126). The overall table above shows when the whole feature works.
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| AudioData | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.AudioData | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.allocationSize | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.clone | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.close | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.copyTo | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.duration | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.format | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.numberOfChannels | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.numberOfFrames | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.sampleRate | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioData.timestamp | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.AudioDecoder | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.close | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.configure | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.decode | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.decodeQueueSize | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.dequeue_event | 106 | 106 | 130 | 26 | 106 | ✕ | 26 |
| AudioDecoder.flush | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
Show 106 more
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| AudioDecoder.isConfigSupported_static | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.reset | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioDecoder.state | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.AudioEncoder | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.close | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.configure | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.configure.bitrateMode | 119 | 119 | 130 | 26 | 119 | ✕ | 26 |
| AudioEncoder.configure.opus | 110 | 110 | 130 | 26 | 110 | ✕ | 26 |
| AudioEncoder.configure.opus.opus_application | 126 | 126 | ✕ | ✕ | 126 | ✕ | ✕ |
| AudioEncoder.configure.opus.opus_signal | 126 | 126 | ✕ | ✕ | 126 | ✕ | ✕ |
| AudioEncoder.dequeue_event | 106 | 106 | 130 | 26 | 106 | ✕ | 26 |
| AudioEncoder.encode | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.encodeQueueSize | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.flush | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.isConfigSupported_static | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.reset | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| AudioEncoder.state | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedAudioChunk | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedAudioChunk.EncodedAudioChunk | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedAudioChunk.byteLength | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedAudioChunk.copyTo | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedAudioChunk.duration | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedAudioChunk.timestamp | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedAudioChunk.type | 94 | 94 | 130 | 26 | 94 | ✕ | 26 |
| EncodedVideoChunk | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| EncodedVideoChunk.EncodedVideoChunk | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| EncodedVideoChunk.byteLength | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| EncodedVideoChunk.copyTo | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| EncodedVideoChunk.duration | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| EncodedVideoChunk.timestamp | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| EncodedVideoChunk.type | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| ImageDecoder | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.ImageDecoder | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.close | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.complete | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.completed | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.decode | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.isTypeSupported_static | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.reset | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.tracks | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageDecoder.type | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrack | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrack.animated | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrack.frameCount | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrack.repetitionCount | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrack.selected | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrackList | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrackList.length | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrackList.ready | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrackList.selectedIndex | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| ImageTrackList.selectedTrack | 94 | 94 | 133 | ✕ | 94 | 133 | ✕ |
| VideoColorSpace | 94 | 94 | 130 | 15.4 | 94 | 130 | 15.4 |
| VideoColorSpace.VideoColorSpace | 94 | 94 | 130 | 17 | 94 | 130 | 17 |
| VideoColorSpace.fullRange | 94 | 94 | 130 | 15.4 | 94 | 130 | 15.4 |
| VideoColorSpace.matrix | 94 | 94 | 130 | 15.4 | 94 | 130 | 15.4 |
| VideoColorSpace.primaries | 94 | 94 | 130 | 15.4 | 94 | 130 | 15.4 |
| VideoColorSpace.toJSON | 94 | 94 | 130 | 15.4 | 94 | 130 | 15.4 |
| VideoColorSpace.transfer | 94 | 94 | 130 | 15.4 | 94 | 130 | 15.4 |
| VideoDecoder | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.VideoDecoder | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.close | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.configure | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.configure.flip_option | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoDecoder.configure.rotation_option | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoDecoder.decode | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.decodeQueueSize | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.dequeue_event | 106 | 106 | 130 | 16.4 | 106 | ✕ | 16.4 |
| VideoDecoder.flush | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.isConfigSupported_static | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.isConfigSupported_static.flip_option | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoDecoder.isConfigSupported_static.rotation_option | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoDecoder.reset | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoDecoder.state | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.VideoEncoder | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.close | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.configure | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.dequeue_event | 106 | 106 | 130 | 16.4 | 106 | ✕ | 16.4 |
| VideoEncoder.encode | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.encodeQueueSize | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.flush | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.isConfigSupported_static | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.reset | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoEncoder.state | 94 | 94 | 130 | 16.4 | 94 | ✕ | 16.4 |
| VideoFrame | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.VideoFrame | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.VideoFrame.flip_option | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoFrame.VideoFrame.rotation_option | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoFrame.allocationSize | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.clone | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.close | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.codedHeight | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.codedRect | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.codedWidth | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.colorSpace | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.copyTo | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.copyTo.format_property | 127 | 127 | 130 | ✕ | 127 | 130 | ✕ |
| VideoFrame.displayHeight | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.displayWidth | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.duration | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.flip | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoFrame.format | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.rotation | 138 | 138 | ✕ | ✕ | 138 | ✕ | ✕ |
| VideoFrame.timestamp | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |
| VideoFrame.visibleRect | 94 | 94 | 130 | 16.4 | 94 | 130 | 16.4 |