From 6edd3548049c17398382549a4daa837ac2dfa0a8 Mon Sep 17 00:00:00 2001 From: Chris Mills Date: Sat, 23 Nov 2024 16:43:17 +0000 Subject: [PATCH 1/7] Adding landing page for Screen Capture extrensions --- .../element_capture/index.md | 11 ++ .../api/screen_capture_extensions/index.md | 113 ++++++++++++++++++ .../region_capture/index.md | 11 ++ files/jsondata/GroupData.json | 15 +++ 4 files changed, 150 insertions(+) create mode 100644 files/en-us/web/api/screen_capture_extensions/element_capture/index.md create mode 100644 files/en-us/web/api/screen_capture_extensions/index.md create mode 100644 files/en-us/web/api/screen_capture_extensions/region_capture/index.md diff --git a/files/en-us/web/api/screen_capture_extensions/element_capture/index.md b/files/en-us/web/api/screen_capture_extensions/element_capture/index.md new file mode 100644 index 000000000000000..e592065bd9a35a5 --- /dev/null +++ b/files/en-us/web/api/screen_capture_extensions/element_capture/index.md @@ -0,0 +1,11 @@ +--- +title: Using the Element Capture API +slug: Web/API/Screen_Capture_extensions/Element_Capture +page-type: guide +--- + +{{SeeCompatTable}} + +{{DefaultAPISidebar("Screen Capture extensions")}}{{securecontext_header}} + +This guide provides a walkthrough of typical usage of ... diff --git a/files/en-us/web/api/screen_capture_extensions/index.md b/files/en-us/web/api/screen_capture_extensions/index.md new file mode 100644 index 000000000000000..ce2b3c3125d3182 --- /dev/null +++ b/files/en-us/web/api/screen_capture_extensions/index.md @@ -0,0 +1,113 @@ +--- +title: Screen Capture extensions +slug: Web/API/Screen_Capture_extensions +page-type: web-api-overview +status: + - experimental +browser-compat: + - api.CropTarget + - api.RestrictionTarget +spec-urls: + - https://screen-share.github.io/element-capture/ + - https://w3c.github.io/mediacapture-region/ +--- + +{{SeeCompatTable}} + +{{DefaultAPISidebar("Screen Capture extensions")}}{{securecontext_header}} + +The [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) allows the user to capture their screen (or a specific window or tab) as a media stream, which can then be shared and broadcast. This section documents APIs that extend the Screen Capture API functionality with additional functionality, for example to limit the part of the screen captured in the stream to a particular crop or element. + +## Concepts and usage + +The Screen Capture API was created specifically to allow apps to capture the user's screen — or a particular window or tab — and then do something with the resulting stream (such as transmit it to multiple peers via [WebRTC](/en-US/docs/Web/API/WebRTC_API)). The main use case is video conferencing apps, where a user might wish to share a demo running on their local machine with other participants. + +The following snippet (which must be run under [transient activation](/en-US/docs/Glossary/Transient_activation), for example by clicking a button) uses {{domxref("MediaDevices.getDisplayMedia()")}} to prompt the user to choose a screen, window or tab, captures their choice in a video stream, and displays that stream in a {{htmlelement("video")}} element: + +```js +const stream = + await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); +videoElem.srcObject = stream; +``` + +The problem with the Screen Capture API is that, by default, it only allows you to broadcast the entire window, screen or tab selected by the user. Often it would be preferrable to share only a limited region to cut down on unnecessary bandwidth or screen space required to show the capture, or for privacy reasons (you might not want to show other participants your message notifications, or background settings required to run the demo you are sharing). + +The following Screen Capture API extensions provide mechanisms to limit the region captured in the stream. + +### The Element Capture API + +The Element Capture API restricts the captured region to a specified rendered DOM element — to do this, you first specify a DOM element as a restriction target using {{domxref("RestrictionTarget.fromElement()")}}: + +```js +const someDOMElement = document.querySelector("#my-element"); +const restrictionTarget = await RestrictionTarget.fromElement(someDOMElement); +``` + +You then grab the media stream, isolate the video track from the stream using {{domxref("MediaStream.getVideoTracks()")}}, then apply the restriction by calling {{domxref("BrowserCaptureMediaStreamTrack.restrictTo()")}} on the track: + +```js +const stream = + await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); +const [track] = stream.getVideoTracks(); +await track.restrictTo(restrictionTarget); + +videoElem.srcObject = stream; +``` + +See [Using the Element Capture API](/en-US/docs/Web/API/Screen_Capture_extensions/Element_Capture) to learn more. + +### Region Capture API + +The Region Capture API crops the captured region to the area of the screen in which a specified DOM element is rendered. To do this, you first specify a DOM element as a crop target using {{domxref("CropTarget.fromElement()")}}: + +```js +const someDOMElement = document.querySelector("#my-element"); +const cropTarget = await CropTarget.fromElement(someDOMElement); +``` + +You then grab the media stream, isolate the video track from the stream using {{domxref("MediaStream.getVideoTracks()")}}, then apply the cropping by calling {{domxref("BrowserCaptureMediaStreamTrack.cropTo()")}} on the track: + +```js +const stream = + await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); +const [track] = stream.getVideoTracks(); +await track.cropTo(restrictionTarget); + +videoElem.srcObject = stream; +``` + +See [Using the Region Capture API](/en-US/docs/Web/API/Screen_Capture_extensions/Region_Capture) to learn more. + +### Element Capture versus Region Capture + +The Element Capture API and the Region Capture API have similar purposes, so what is the difference? + +Element Capture captures the element itself, whereas Region Capture captures the area of the screen the element is rendered in. This means that Element Capture will always show the entire captured element, even if other DOM content overlaps it, whereas Region Capture can result in overlapping content being shown over the top of the content you intended to capture. + +As a result, it is generally recommended that you use the newer Element Capture API over the older Region Capture API, unless you need to support older browser versions that do not support Element Capture. + +## Interfaces + +- {{domxref("BrowserCaptureMediaStreamTrack")}} + - : Represents a single media stream track; extends the {{domxref("MediaStreamTrack")}} class with methods to limit the part of the stream captured. +- {{domxref("CropTarget")}} + - : Provides a static method, {{domxref("CropTarget.fromElement()")}}, which returns a {{domxref("CropTarget")}} instance that can be used to crop the stream to the area in which a specified element is rendered. +- {{domxref("RestrictionTarget")}} + - : Provides a static method, {{domxref("RestrictionTarget.fromElement()")}}, which returns a {{domxref("RestrictionTarget")}} instance that can be used to crop the stream to a specified element. + +## Examples + +See [Using the Region Capture API](/en-US/docs/Web/API/Screen_Capture_extensions/Region_Capture) and [Using the Element Capture API](/en-US/docs/Web/API/Screen_Capture_extensions/Element_Capture) for example code. + +## Specifications + +{{Specifications}} + +## Browser compatibility + +{{Compat}} + +## See also + +- [Capture a video stream from any element](https://developer.chrome.com/docs/web-platform/element-capture) on developer.chrome.com (2025) +- [Better tab sharing with Region Capture](https://developer.chrome.com/docs/web-platform/region-capture) on developer.chrome.com (2023) diff --git a/files/en-us/web/api/screen_capture_extensions/region_capture/index.md b/files/en-us/web/api/screen_capture_extensions/region_capture/index.md new file mode 100644 index 000000000000000..d942bd0a44b8a55 --- /dev/null +++ b/files/en-us/web/api/screen_capture_extensions/region_capture/index.md @@ -0,0 +1,11 @@ +--- +title: Using the Region Capture API +slug: Web/API/Screen_Capture_extensions/Region_Capture +page-type: guide +--- + +{{SeeCompatTable}} + +{{DefaultAPISidebar("Screen Capture extensions")}}{{securecontext_header}} + +This guide provides a walkthrough of typical usage of ... diff --git a/files/jsondata/GroupData.json b/files/jsondata/GroupData.json index cb769586c3aada9..054be930af0aba4 100644 --- a/files/jsondata/GroupData.json +++ b/files/jsondata/GroupData.json @@ -1356,6 +1356,21 @@ ], "events": [] }, + "Screen Capture extensions": { + "overview": ["Screen Capture extensions"], + "guides": [ + "/docs/Web/API/Screen_Capture_extensions/Element_Capture", + "/docs/Web/API/Screen_Capture_extensions/Region_Capture" + ], + "interfaces": [ + "BrowserCaptureMediaStreamTrack", + "CropTarget", + "RestrictionTarget" + ], + "methods": ["MediaDevices.getDisplayMedia()"], + "properties": [], + "events": [] + }, "Screen Orientation API": { "overview": ["Screen Orientation API"], "guides": ["/docs/Web/API/CSS_Object_Model/Managing_screen_orientation"], From 3e80b04e94536502c4ca1d8e49fb0ca35ca047f7 Mon Sep 17 00:00:00 2001 From: Chris Mills Date: Mon, 25 Nov 2024 16:01:16 +0000 Subject: [PATCH 2/7] Add usage guide --- .../element_capture/index.md | 11 - .../hall-of-mirrors.png | Bin 0 -> 38878 bytes .../element_region_capture/index.md | 347 ++++++++++++++++++ .../api/screen_capture_extensions/index.md | 65 +--- .../region_capture/index.md | 11 - files/jsondata/GroupData.json | 3 +- 6 files changed, 353 insertions(+), 84 deletions(-) delete mode 100644 files/en-us/web/api/screen_capture_extensions/element_capture/index.md create mode 100644 files/en-us/web/api/screen_capture_extensions/element_region_capture/hall-of-mirrors.png create mode 100644 files/en-us/web/api/screen_capture_extensions/element_region_capture/index.md delete mode 100644 files/en-us/web/api/screen_capture_extensions/region_capture/index.md diff --git a/files/en-us/web/api/screen_capture_extensions/element_capture/index.md b/files/en-us/web/api/screen_capture_extensions/element_capture/index.md deleted file mode 100644 index e592065bd9a35a5..000000000000000 --- a/files/en-us/web/api/screen_capture_extensions/element_capture/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Using the Element Capture API -slug: Web/API/Screen_Capture_extensions/Element_Capture -page-type: guide ---- - -{{SeeCompatTable}} - -{{DefaultAPISidebar("Screen Capture extensions")}}{{securecontext_header}} - -This guide provides a walkthrough of typical usage of ... diff --git a/files/en-us/web/api/screen_capture_extensions/element_region_capture/hall-of-mirrors.png b/files/en-us/web/api/screen_capture_extensions/element_region_capture/hall-of-mirrors.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae543d8e475fb286c84d6f56fac1236e06a720b GIT binary patch literal 38878 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 literal 0 HcmV?d00001 diff --git a/files/en-us/web/api/screen_capture_extensions/element_region_capture/index.md b/files/en-us/web/api/screen_capture_extensions/element_region_capture/index.md new file mode 100644 index 000000000000000..c4f7e92a3f52b14 --- /dev/null +++ b/files/en-us/web/api/screen_capture_extensions/element_region_capture/index.md @@ -0,0 +1,347 @@ +--- +title: Using the Element Capture and Region Capture APIs +slug: Web/API/Screen_Capture_extensions/Element_Region_Capture +page-type: guide +--- + +{{SeeCompatTable}} + +{{DefaultAPISidebar("Screen Capture extensions")}}{{securecontext_header}} + +This guide provides a walkthrough of typical usage of the Element Capture and Region Capture APIs, showing how to use them and the problem they solve. + +## Background + +The [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) was created specifically to allow apps to capture the user's screen — or a particular window or tab — and then do something with the resulting stream (such as transmit it to multiple peers via [WebRTC](/en-US/docs/Web/API/WebRTC_API)). The main use case is video conferencing apps, where a user might wish to share a demo running on their local machine with other participants. + +The problem with the Screen Capture API is that, by default, it only allows you to broadcast the entire window, screen, or tab selected by the user. Often it would be preferrable to share only a limited region to cut down on unnecessary bandwidth or screen space required to show the capture, or for privacy reasons (you might not want to show other participants your message notifications, or background settings required to run the demo you are sharing). In addition, such apps generally capture your web cam output, meaning that you will likely end up with one of those undesirable "infinite wormhole" or "hall of mirrors" type effects. + +To solve such problems, extensions to the Screen Capture API were invented to allow you to restrict the captured stream to a particular subsection of the screen, window, or tab. + +In the next section we'll start with a basic Screen Capture API demo to illustrate the issues described above. + +## Screen Capture API demo + +This demo uses the Screen Capture API to capture a window, screen, or tab, and broadcast the stream via a {{htmlelement("video")}} element on the same page. It also logs the track settings and constraints to a log container below the main app. + +### HTML + +The HTML starts off with a main heading and intro text, then includes two {{htmlelement("button")}} elements to start and stop the capture: + +```html +

Screen Capture API example

+

+ This example shows you the contents of the selected part of your display. + Click the Start Capture button to begin. +

+ +

+   + +

+``` + +Next, we include the main app container, which contains the `