files/en-us/web/api/videoframe/index.md
{{APIRef("Web Codecs API")}}{{AvailableInWorkers("window_and_dedicated")}}
The VideoFrame interface of the Web Codecs API represents a frame of a video.
VideoFrame is a transferable object.
A VideoFrame object can be created or accessed in a number of ways. The {{domxref("MediaStreamTrackProcessor")}} breaks a media track into individual VideoFrame objects.
A VideoFrame is an image source and has a constructor that accepts any other canvas source (
an {{domxref("SVGImageElement")}},
an {{domxref("HTMLVideoElement")}},
an {{domxref("HTMLCanvasElement")}},
an {{domxref("ImageBitmap")}},
an {{domxref("OffscreenCanvas")}},
or another VideoFrame).
This means that a frame can be created from an image or video element.
A second constructor enables the creation of a VideoFrame from its binary pixel representation in an {{jsxref("ArrayBuffer")}}, a {{jsxref("TypedArray")}}, or a {{jsxref("DataView")}}.
Created frames may then turned into a media track, for example with the {{domxref("MediaStreamTrackGenerator")}} interface that creates a media track from a stream of frames.
VideoFrame object.VideoFrame.VideoFrame in pixels, potentially including non-visible padding, and prior to considering potential ratio adjustments.VideoFrame in pixels, potentially including non-visible padding, and prior to considering potential ratio adjustments.codedWidth and codedHeight.VideoFrame.VideoFrame when displayed after applying {{glossary("aspect ratio")}} adjustments.VideoFrame when displayed after applying aspect ratio adjustments.VideoFrame is horizontally mirrored.VideoFrame. Arbitrary numbers (including negatives) are rounded to the next quarter turn.VideoFrame as filtered by options passed into the method.VideoFrame to an ArrayBuffer.VideoFrame object with reference to the same media resource as the original.In the following example frames are returned from a {{domxref("MediaStreamTrackProcessor")}}, then encoded. See the full example and read more about it in the article Video processing with WebCodecs.
let frameCounter = 0;
const track = stream.getVideoTracks()[0];
const mediaProcessor = new MediaStreamTrackProcessor(track);
const reader = mediaProcessor.readable.getReader();
while (true) {
const result = await reader.read();
if (result.done) break;
let frame = result.value;
if (encoder.encodeQueueSize > 2) {
// Too many frames in flight, encoder is overwhelmed
// let's drop this frame.
frame.close();
} else {
frameCounter++;
const insertKeyframe = frameCounter % 150 === 0;
encoder.encode(frame, { keyFrame: insertKeyframe });
frame.close();
}
}
{{Specifications}}
{{Compat}}