HTMLMediaElement: captureStream() method
========================================

The **`captureStream()`** method of the `HTMLMediaElement` interface returns a `MediaStream` object which is streaming a real-time capture of the content being rendered in the media element.

This can be used, for example, as a source for a WebRTC `RTCPeerConnection`.

Syntax
------


```js
captureStream()
```

### Parameters

None.

### Return value

 A `MediaStream` object which can be used as a source for audio and/or
 video data by other media processing code, or as a source for WebRTC.

Examples
--------

 In this example, an event handler is established so that clicking a button starts
 capturing the contents of a media element with the ID `"playback"` into a
 `MediaStream`. The stream can then be used for other purposes—like a source
 for streaming over WebRTC, to allow sharing prerecorded videos with another person
 during a video call.


```js
document.querySelector(".playAndRecord").addEventListener("click", () => {
  const playbackElement = document.getElementById("playback");
  const captureStream = playbackElement.captureStream();
  playbackElement.play();
});
```


See Recording a media element for a longer and more intricate example and explanation.

Specifications
--------------

| Specification |
| --- |
| Media Capture from DOM Elements # dom-htmlmediaelement-capturestream |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

### Firefox-specific notes

 Prior to Firefox 51, you couldn't use `captureStream()` on a media element
 whose source is, itself, a `MediaStream` (like a `<video>`
 element which is presenting a stream being received over a
 `RTCPeerConnection`). Beginning in Firefox 51, this works. This means you
 can capture a stream from the video element and use `MediaRecorder` to
 record it. See Firefox bug 1259788 for details.

 However, `captureStream()` is still prefixed as
 `mozCaptureStream()` on Firefox for good reason: there are some quirks in the
 present implementation which are worth noting:

* The Firefox implementation currently only works as described in the specification
 when the media element's source is, itself, a `MediaStream`.
* If the media element's source isn't a `MediaStream`, the output from this
 method isn't compatible with the spec, and if you change the source after starting
 capture, the output capture stream can't accept the new source data due to that
 incompatibility, so no `MediaStreamTrack`s from the new source
 `MediaStream` are added to the captured stream, resulting in output that
 doesn't capture the updated source.
* Switching the source back to a `MediaStream` adds tracks back to the
 stream and it works again as expected.
* Calling `mozCaptureMediaStream()` on an element with a
 `MediaStream` source returns a stream that only contains tracks while the
 element is playing a `MediaStream`.
* If you call `mozCaptureMediaStream()` on a media element with no source
 media, its compatibility mode will be based on the first source that's added; for
 example, if it's a `MediaStream`, then the capture stream will only work
 with MediaStream sources from then on.
* This special behavior will be removed once the non-`MediaStream` source
 support is brought up to specification and the method is unprefixed. See
 Firefox bug 1259788 for details.
See also
--------

* Recording a media element
* MediaStream Recording API
* `HTMLCanvasElement.captureStream()`
* `MediaStream`
* WebRTC API