-
Notifications
You must be signed in to change notification settings - Fork 22.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add documentation for Screen Capture extensions, element capture and region capture #36939
Open
chrisdavidmills
wants to merge
9
commits into
mdn:main
Choose a base branch
from
chrisdavidmills:region-and-element-capture
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+973
−0
Open
Changes from 7 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
6edd354
Adding landing page for Screen Capture extrensions
chrisdavidmills 3e80b04
Add usage guide
chrisdavidmills bc36f1c
Add reference pages
chrisdavidmills 96bc1f5
Merge branch 'main' into region-and-element-capture
chrisdavidmills 27e5207
Fix a couple of flaws
chrisdavidmills 536f60a
Merge branch 'region-and-element-capture' of github.com:chrisdavidmil…
chrisdavidmills 5c20d74
Fixes for beaufortfrancois review comments
chrisdavidmills 2e95813
remove audio: false,
chrisdavidmills cb3315e
Make it clearer that preferCurrentTab is a hint
chrisdavidmills File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
64 changes: 64 additions & 0 deletions
64
files/en-us/web/api/browsercapturemediastreamtrack/clone/index.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
--- | ||
title: "BrowserCaptureMediaStreamTrack: clone() method" | ||
short-title: clone() | ||
slug: Web/API/BrowserCaptureMediaStreamTrack/clone | ||
page-type: web-api-instance-method | ||
browser-compat: api.BrowserCaptureMediaStreamTrack.clone | ||
--- | ||
|
||
{{APIRef("Screen Capture extensions")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`clone()`** method of the {{domxref("BrowserCaptureMediaStreamTrack")}} interface returns a clone of the original `BrowserCaptureMediaStreamTrack`. | ||
|
||
This method is functionally identical to {{domxref("MediaStreamTrack.clone()")}}, except that it handles cases where cropping or restriction have been applied to the track. The returned clone is identical to the original `BrowserCaptureMediaStreamTrack`, but with any cropping or restriction removed. | ||
|
||
## Syntax | ||
|
||
```js-nolint | ||
clone() | ||
``` | ||
|
||
### Parameters | ||
|
||
None. | ||
|
||
### Return value | ||
|
||
A {{domxref("BrowserCaptureMediaStreamTrack")}} instance. | ||
|
||
## Examples | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create crop target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const cropTarget = await CropTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
const [track] = stream.getVideoTracks(); | ||
|
||
// Crop video track | ||
await track.cropTo(cropTarget); | ||
|
||
// Create uncropped clone of the track | ||
const clonedTrack = track.clone(); | ||
``` | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture extensions](/en-US/docs/Web/API/Screen_Capture_extensions) | ||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) |
84 changes: 84 additions & 0 deletions
84
files/en-us/web/api/browsercapturemediastreamtrack/cropto/index.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
--- | ||
title: "BrowserCaptureMediaStreamTrack: cropTo() method" | ||
short-title: cropTo() | ||
slug: Web/API/BrowserCaptureMediaStreamTrack/cropTo | ||
page-type: web-api-instance-method | ||
browser-compat: api.BrowserCaptureMediaStreamTrack.cropTo | ||
--- | ||
|
||
{{APIRef("Screen Capture extensions")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`cropTo()`** method of the {{domxref("BrowserCaptureMediaStreamTrack")}} interface crops a self-capture stream to the area in which a specified crop target element is rendered. | ||
|
||
## Syntax | ||
|
||
```js-nolint | ||
cropTo(cropTarget) | ||
``` | ||
|
||
### Parameters | ||
|
||
- `cropTarget` | ||
- : A {{domxref("CropTarget")}} instance representing the element rendering area the stream should be cropped to, or `null`/`undefined`, in which case any previously-set cropping is removed from the track. | ||
chrisdavidmills marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Return value | ||
|
||
A {{jsxref("Promise")}} that resolves to {{jsxref("undefined")}}. | ||
|
||
The promise will reject if: | ||
|
||
- The track [`kind`](/en-US/docs/Web/API/MediaStreamTrack/kind) is not `"video"`, or its [`readyState`](/en-US/docs/Web/API/MediaStreamTrack/readyState) is not `"live"`. | ||
- The crop target element no longer exists. | ||
- The track being cropped has clones or is not a track captured from the user's screen. | ||
- `CropTarget` is not one of the values specified above. | ||
- `CropTarget` was created in a tab other than the one being captured. | ||
|
||
## Examples | ||
|
||
### Basic cropping example | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create crop target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const cropTarget = await CropTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
const [track] = stream.getVideoTracks(); | ||
|
||
// Crop video track | ||
await track.cropTo(cropTarget); | ||
|
||
// Broadcast cropped stream in <video> element | ||
videoElem.srcObject = stream; | ||
``` | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_extensions/Element_Region_Capture) for in-context example code. | ||
|
||
### Stopping the cropping | ||
|
||
You can stop the cropping by making a call to `cropTo()` on a previously-cropped track, passing an argument of `null` to it: | ||
|
||
```js | ||
// Stop cropping | ||
await track.cropTo(null); | ||
``` | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture extensions](/en-US/docs/Web/API/Screen_Capture_extensions) | ||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) |
40 changes: 40 additions & 0 deletions
40
files/en-us/web/api/browsercapturemediastreamtrack/index.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
--- | ||
title: BrowserCaptureMediaStreamTrack | ||
slug: Web/API/BrowserCaptureMediaStreamTrack | ||
page-type: web-api-interface | ||
status: | ||
- experimental | ||
browser-compat: api.BrowserCaptureMediaStreamTrack | ||
--- | ||
|
||
{{APIRef("Screen Capture extensions")}}{{SeeCompatTable}} | ||
|
||
The **`BrowserCaptureMediaStreamTrack`** interface of the {{domxref("Screen Capture extensions", "Screen Capture extensions", "", "nocode")}} represents a single video track. It extends the {{domxref("MediaStreamTrack")}} class with methods to limit the part of a self-capture stream (for example, a user's screen or window) that is captured. | ||
|
||
{{InheritanceDiagram}} | ||
|
||
## Instance methods | ||
|
||
- {{domxref("BrowserCaptureMediaStreamTrack.clone", "clone()")}} {{Experimental_Inline}} | ||
- : Returns an uncropped, unrestricted clone of the original `BrowserCaptureMediaStreamTrack`. | ||
- {{domxref("BrowserCaptureMediaStreamTrack.cropTo", "cropTo()")}} {{Experimental_Inline}} | ||
- : Crops a self-capture stream to the area in which a specified crop target element is rendered. | ||
- {{domxref("BrowserCaptureMediaStreamTrack.restrictTo", "restrictTo()")}} {{Experimental_Inline}} | ||
- : Restricts a self-capture stream to a specific rendered restriction target element. | ||
|
||
## Examples | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_extensions/Element_Region_Capture) for in-context example code. | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture extensions](/en-US/docs/Web/API/Screen_Capture_extensions) | ||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) |
84 changes: 84 additions & 0 deletions
84
files/en-us/web/api/browsercapturemediastreamtrack/restrictto/index.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
--- | ||
title: "BrowserCaptureMediaStreamTrack: restrictTo() method" | ||
short-title: restrictTo() | ||
slug: Web/API/BrowserCaptureMediaStreamTrack/restrictTo | ||
page-type: web-api-instance-method | ||
browser-compat: api.BrowserCaptureMediaStreamTrack.restrictTo | ||
--- | ||
|
||
{{APIRef("Screen Capture extensions")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`restrictTo()`** method of the {{domxref("BrowserCaptureMediaStreamTrack")}} interface restricts a self-capture stream to a specific rendered restriction target element. | ||
|
||
## Syntax | ||
|
||
```js-nolint | ||
restrictTo(restrictionTarget) | ||
``` | ||
|
||
### Parameters | ||
|
||
- `restrictionTarget` | ||
- : A {{domxref("RestrictionTarget")}} instance representing the element the stream should be restricted to, or `null`/`undefined`, in which case any previously-set restriction is removed from the track. | ||
chrisdavidmills marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Return value | ||
|
||
A {{jsxref("Promise")}} that resolves to {{jsxref("undefined")}}. | ||
|
||
The promise will reject if: | ||
|
||
- The track [`kind`](/en-US/docs/Web/API/MediaStreamTrack/kind) is not `"video"`, or its [`readyState`](/en-US/docs/Web/API/MediaStreamTrack/readyState) is not `"live"`. | ||
- The restriction target element no longer exists. | ||
- The track being restricted has clones or is not a track captured from the user's screen. | ||
- `RestrictionTarget` is not one of the values specified above. | ||
- `RestrictionTarget` was created in a tab other than the one being captured. | ||
|
||
## Examples | ||
|
||
### Basic restriction example | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create restriction target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const restrictionTarget = await RestrictionTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
const [track] = stream.getVideoTracks(); | ||
|
||
// Restrict video track | ||
await track.restrictTo(restrictionTarget); | ||
|
||
// Broadcast restricted stream in <video> element | ||
videoElem.srcObject = stream; | ||
``` | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_extensions/Element_Region_Capture) for in-context example code. | ||
|
||
### Stopping the restriction | ||
|
||
You can stop the restriction by making a call to `restrictTo()` on the same track, passing an argument of `null` to it: | ||
|
||
```js | ||
// Stop restricting | ||
await track.restrictTo(null); | ||
``` | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture extensions](/en-US/docs/Web/API/Screen_Capture_extensions) | ||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) |
67 changes: 67 additions & 0 deletions
67
files/en-us/web/api/croptarget/fromelement_static/index.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
--- | ||
title: "CropTarget: fromElement() static method" | ||
short-title: fromElement() | ||
slug: Web/API/CropTarget/fromElement_static | ||
page-type: web-api-static-method | ||
browser-compat: api.CropTarget.fromElement_static | ||
--- | ||
|
||
{{APIRef("Screen Capture extensions")}}{{SeeCompatTable}}{{securecontext_header}} | ||
|
||
The **`fromElement()`** static method of the {{domxref("CropTarget")}} interface returns a `CropTarget` instance that can be used to crop a captured video track to the area in which a specified element is rendered. | ||
|
||
## Syntax | ||
|
||
```js-nolint | ||
CropTarget.fromElement(element) | ||
``` | ||
|
||
### Parameters | ||
|
||
- `element` | ||
- : A reference to a DOM element that you want to use as a crop target. | ||
|
||
### Return value | ||
|
||
A {{jsxref("Promise")}} that resolves to a {{domxref("CropTarget")}} object instance, which can then be passed to {{domxref("BrowserCaptureMediaStreamTrack.CropTo()")}} to crop the video captured in the track to just the area the specified DOM element is rendered in. | ||
|
||
`CropTarget` objects are serializable. They can be passed to another document using {{domxref("Window.postMessage()")}}, for example. | ||
|
||
## Examples | ||
|
||
```js | ||
// Options for getDisplayMedia() | ||
const displayMediaOptions = { | ||
preferCurrentTab: true, | ||
}; | ||
|
||
// Create crop target from DOM element | ||
const demoElem = document.querySelector("#demo"); | ||
const cropTarget = await CropTarget.fromElement(demoElem); | ||
|
||
// Capture video stream from user's webcam and isolate video track | ||
const stream = | ||
await navigator.mediaDevices.getDisplayMedia(displayMediaOptions); | ||
const [track] = stream.getVideoTracks(); | ||
|
||
// Crop video track | ||
await track.cropTo(cropTarget); | ||
|
||
// Broadcast cropped stream in <video> element | ||
videoElem.srcObject = stream; | ||
``` | ||
|
||
See [Using the Element Capture and Region Capture APIs](/en-US/docs/Web/API/Screen_Capture_extensions/Element_Region_Capture) for in-context example code. | ||
|
||
## Specifications | ||
|
||
{{Specifications}} | ||
|
||
## Browser compatibility | ||
|
||
{{Compat}} | ||
|
||
## See also | ||
|
||
- [Screen Capture extensions](/en-US/docs/Web/API/Screen_Capture_extensions) | ||
- [Screen Capture API](/en-US/docs/Web/API/Screen_Capture_API) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe you can remove
displayMediaOptions
everywhere as{video: true}
is the default where it works.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
getDisplayMedia()
call does work with no options, yes. My concern with this is that to get Region or Element capture working, you need to do a same-tab capture, otherwise, it doesn't work, and to achieve this, you need thepreferCurrentTab: true
option. Therefore, to be on the safe side, I've decided to include the following minimal options object at the start of each one of these code snippets:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Gotcha. Note that
preferCurrentTab
is a hint, and that user can still pick another tab/screen/display.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When I run my demo on Chrome, it only gives me the option of selecting the current tab when I start the capture. This is what I get:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In Chrome yes, but spec says "SHOULD". See https://wicg.github.io/prefer-current-tab/#ref-for-dom-mediastreamconstraints-prefercurrenttab-1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok, fair enough. I have updated the text in the guide to make it clearer that this is a hint: