从 DOM 元素进行媒体捕获

W3C 工作草案

关于此文档的更多详细信息
此版本:
https://www.w3.org/TR/2025/WD-mediacapture-fromelement-20250212/
最新发布版本:
https://www.w3.org/TR/mediacapture-fromelement/
最新编辑草案:
https://w3c.github.io/mediacapture-fromelement/
历史:
https://www.w3.org/standards/history/mediacapture-fromelement/
提交历史
测试套件:
https://github.com/web-platform-tests/wpt/tree/master/mediacapture-fromelement
编辑:
Martin Thomson (Mozilla)
(Google, Inc.) (媒体元素部分。)
(Google, Inc.)(Canvas 元素部分。)
反馈:
GitHub w3c/mediacapture-fromelement拉取请求新议题开放议题
public-webrtc@w3.org 使用主题行 [mediacapture-fromelement] … 消息主题 …归档
参与
邮件列表

摘要

本文档定义了如何从 DOM 元素捕获媒体流,例如 videoaudiocanvas 元素,以 MediaStream [GETUSERMEDIA] 的形式。

本文档状态

本节描述此文档在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版,可在 W3C 技术报告索引中找到: https://www.w3.org/TR/。

本文档尚未完成。它可能会发生重大变化,因此虽然鼓励早期实验, 但它并不打算用于实现。

本文档由 Web 实时 通信工作组作为 工作草案发布,使用的是 推荐标准轨道

作为工作草案发布,并不 意味着得到 W3C 及其成员的认可。

这是一份草案文档,可能会在任何时候被其他 文档更新、替换或废弃。除作为进行中的工作外,不应引用本文档。

本文档由一个按照 W3C 专利 政策运作的小组制作。 W3C 维护一份 与该小组交付成果相关的任何专利披露的公开列表; 该页面还包括 专利披露说明。实际知晓某项专利,并认为该专利包含 必要权利要求 的个人,必须依照 W3C 专利政策第 6 节 披露相关信息。

本文档受 2023 年 11 月 03 日 W3C 流程文档管辖。

1. 引言

本节为非规范性内容。

本文档描述了对 HTML 媒体元素和 HTML canvas 元素的扩展,使得能够以流式 媒体的形式捕获元素的输出。

捕获的媒体会被构造成一个 MediaStream [GETUSERMEDIA],随后可由处理媒体流的各种 API 使用,例如 WebRTC [WEBRTC],或 Web Audio [WEBAUDIO]。

2. 一致性

除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。其他所有内容均为规范性内容。

本文档中的关键词 MUSTMUST NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,但仅当它们像此处所示那样以全大写形式出现时才如此。

本规范定义了适用于单一产品的一致性准则:实现其所包含接口的 用户代理

使用 ECMAScript 来实现本规范中定义的 API 的实现,必须以符合 Web IDL 规范 [WEBIDL] 中定义的 ECMAScript 绑定的方式实现它们,因为本规范使用了该规范及其 术语。

3. HTML 媒体元素媒体捕获扩展

方法 captureStream 被添加到 HTML [HTML5] 媒体 元素上。 捕获方法被添加到 HTMLMediaElementHTMLCanvasElement 二者上。

MediaStreamHTMLMediaElement 都暴露了 track 的概念。由于 HTMLMediaElement 没有使用通用类型,因此 本文档使用术语 track 来指代 VideoTrackAudioTrackMediaStreamTrack 用于标识 MediaStream 中的媒体。

WebIDLpartial interface HTMLMediaElement {
    MediaStream captureStream ();
};

方法

captureStream

captureStream() 方法会生成对 渲染到媒体元素的媒体的实时捕获。

捕获的 MediaStream 由若干 MediaStreamTrack 组成,这些轨道会渲染来自媒体元素中一组 选定(对于 VideoTrack, 或其他互斥选定的 track 类型)或 启用 (对于 AudioTrack, 或其他支持 多重选择的 track 类型)的 track 的内容。如果媒体元素 没有给定类型的选定或启用 track,则捕获流中不会存在该类型的 MediaStreamTrack

因此, video 元素可以捕获一个视频 MediaStreamTrack 和任意数量的音频 MediaStreamTrack。 而 audio 元素可以捕获 任意数量的音频 MediaStreamTrack。 在这两种情况下, 捕获的 MediaStreamTrack 集合都可以为空。

除非并直到存在给定类型且已选定或启用的 track, 否则捕获流中不存在该类型的 MediaStreamTrack。 尤其是,如果媒体元素没有分配源,则捕获的 MediaStream 没有任何轨道。因此,ready state 为 HAVE_NOTHING 的媒体元素不会生成任何捕获的 MediaStreamTrack 实例。一旦元数据 可用且选定或启用的 track 得以确定,就会创建新的捕获 MediaStreamTrack 实例并将其添加到 MediaStream

MediaStreamTrack 捕获的 结束播放 结束(且 ended 事件触发)时,或当它捕获的轨道不再被选定或启用于播放时, 捕获的轨道会结束。如果通过设置媒体元素的 srcsrcObject 属性更改了源,则 track 不再被选定或启用。

如果媒体元素的源发生变化,捕获的 MediaStreamTrack 集合也会发生变化。如果媒体元素的源结束,则会选择不同的源。

如果媒体元素的选定 VideoTrack 或启用的 AudioTrack 发生变化,则会为每个先前未被选定或启用的 track 生成一个带有新 MediaStreamTrackaddtrack 事件;并且会为每个不再被选定或启用的 track 生成一个 removetrack 事件。MediaStreamTrack MUST 在从 MediaStream 移除之前结束。

由于 MediaStreamTrack 只能结束一次,因此一个被启用、 禁用并再次启用的 track 会被捕获为两个独立的 track。类似地, 在播放结束后重新开始播放,会导致创建一组新的捕获 MediaStreamTrack 实例。在播放期间进行查找 而不改变轨道选择,不会生成事件,也不会导致捕获的 MediaStreamTrack 结束。

组成捕获的 MediaStreamMediaStreamTrack 会随着它们所捕获的 track 状态变化而变为 muted 或 unmuted。 在任何时候,媒体元素都可能由于多种原因而在给定 track 上没有可供捕获的活动内容:

  • 媒体播放可能被暂停。
  • 如果当前播放时间 早于该 track 内容的开始时间,或晚于内容的结束时间,则某个 track 可能在当前播放 时间没有内容。
  • 作为源的 MediaStreamTrack 可能被 muteddisabled
  • 由于跨源保护,track 的内容可能对当前 origin 变得不可访问。例如,从 HTTP URL 渲染的内容可能在对部分内容的请求中受到重定向影响,或者 启用或选定的轨道可能发生变化,从而包含跨源内容。

内容缺失会通过 muted 属性反映在捕获的轨道中。如果其对应的 源 track 没有可用且可访问的内容,则捕获的 MediaStreamTrackmuted 属性 MUST 被设置为 true。当内容 可用性发生变化时,会在 MediaStreamTrack 上触发 mute 事件。

muted 捕获所产生的输出会因媒体类型而异: VideoTrack 在 muted 时停止捕获新帧, 导致捕获流显示最后捕获的一帧;muted 的 AudioTrack 会产生静音。

媒体元素是否正在主动渲染内容(例如渲染到屏幕或音频 设备)不会影响捕获流的内容。将媒体元素的音频静音不会导致捕获产生静音, 隐藏媒体元素也不会导致捕获的视频停止。类似地,媒体元素的音频电平或音量 不会影响捕获音频的音量。

来自具有非 1.0 有效 播放速率的元素的捕获音频 MUST 进行时间拉伸。不可播放的播放 速率会导致捕获的音频轨道变为 muted。

4. HTML Canvas 元素媒体捕获扩展

captureStream 方法被添加到 HTML [HTML5] canvas 元素上。生成的 CanvasCaptureMediaStreamTrack 提供了 允许控制何时从 canvas 采样帧的方法。

WebIDLpartial interface HTMLCanvasElement {
    MediaStream captureStream (optional double frameRequestRate);
};

方法

captureStream

captureStream() 方法会生成对 canvas 表面的实时视频 捕获。生成的媒体流具有一个视频 CanvasCaptureMediaStreamTrack, 其尺寸与 canvas 元素的尺寸相匹配。

来自非 origin-clean 的 canvas 的内容 MUST NOT 被捕获。如果 canvas 不是 origin-clean,此方法会抛出 SecurityError 异常。

如果源 canvas 的 origin-clean 标志在流由 captureStream() 创建之后变为 false, 则捕获的流 MUST 立即停止捕获内容。 捕获的 MediaStreamTrack MUST 变为 muted,在 canvas 保持此 状态时不产生任何新内容。

每个捕获 canvas 的 track 都有一个 [[frameCaptureRequested]] 内部槽,当请求从 canvas 获取 新帧时,该内部槽会被设置为 true

所有新 track 上的 [[frameCaptureRequested]] 的值 在 track 创建时被设置为 true。使用特定且非零的 frameRequestRate 创建捕获轨道时,用户 代理会启动一个周期性定时器,其间隔为 1/frameRequestRate 秒。每次定时器触发时, [[frameCaptureRequested]] 会被设置为 true

为了通过 requestFrame() 方法支持对帧捕获的手动控制,浏览器 MUST 支持 frameRequestRate 的值为 0。然而,即使 frameRequestRate 为零, 捕获的流 MUST 在创建时请求捕获一个 帧。

如果 frameRequestRate 为负,此方法会抛出 NotSupportedError 异常。

[[frameCaptureRequested]] 为 true 且 canvas 被绘制时,会从 canvas 请求一个新帧。 每次捕获的 canvas 被绘制时,都会执行以下步骤:

  1. 对于从 canvas 捕获的每个 track,执行以下 步骤:
    1. 如果自上次绘制以来已有新内容绘制到 canvas,并且 如果 track[[frameCaptureRequested]] 内部槽 已被设置,则向 track 添加一个包含绘制到 canvas 上内容的新帧。
    2. 如果指定了 frameRequestRate 值,则将 track[[frameCaptureRequested]] 内部槽 设置为 false

当向 track 添加包含绘制到 canvas 上内容的新帧时,如果 canvas 不是完全不透明的, 则必须捕获并保留 canvas 的 alpha 通道内容。此 track 的消费者可能不会 保留 alpha 通道。

此算法会导致捕获的轨道直到 canvas 中有内容发生变化时才开始。

参数 类型 可为空 可选 描述
frameRequestRate double
返回类型: MediaStream

CanvasCaptureMediaStreamTrackMediaStreamTrack 的扩展,提供了单个 requestFrame() 方法。 依赖对媒体流中内容渲染进行精确控制的应用,可以使用此方法来控制何时从 canvas 捕获帧。

WebIDL[Exposed=Window] interface CanvasCaptureMediaStreamTrack : MediaStreamTrack {
    readonly        attribute HTMLCanvasElement canvas;
    undefined requestFrame ();
};

属性

canvas,类型为 HTMLCanvasElement, readonly
此媒体流所捕获的 canvas 元素。

方法

requestFrame

requestFrame() 方法允许 应用手动 请求从 canvas 捕获一帧并将其渲染到 track 中。在 应用逐步渲染到 canvas 的情况下,这允许 应用避免捕获部分渲染的帧。

按当前规定,如果 canvas 不是 origin-clean,这不会导致 SecurityError 或其他 错误反馈。部分原因是我们并不跟踪帧请求来自何处。我们是否要强调这一点?

无参数。
返回类型: undefined

5. 安全考虑

媒体元素可以渲染来自不同于媒体元素 origin 的 origin 的媒体资源。 在这些情况下,生成的 MediaStreamTrack 的内容 MUST 受到保护,避免被文档 origin 访问。

这种保护如何表现会有所不同,具体取决于内容的访问方式。例如, 将不可访问的视频渲染到 canvas 元素 [HTML] 会导致 canvas 的 origin-clean 标志变为 false;尝试创建 Web Audio MediaStreamAudioSourceNode [WEBAUDIO] 会成功,但不会向 文档 origin 产生任何信息(也就是说,只有静音会传输到音频上下文中); 尝试使用 WebRTC [WEBRTC] 传输媒体,则会导致 不传输任何信息。

媒体元素所渲染媒体的 origin 可能随时变化。即使对于单个媒体资源也是如此。 用户代理 MUST 确保媒体 origin 的变化不会导致跨源内容被暴露。

6. 变更日志

本节将在发布前移除。

6.1 自 2015-tbd-tbd 以来的变更

A. 致谢

本文档基于最初由 Robert O'Callahan 开发的流处理规范 [streamproc]。

B. 参考文献

B.1 规范性参考文献

[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTML5]
HTML5. Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Theresa O'Connor; Silvia Pfeiffer. W3C. 27 March 2018. W3C Recommendation. URL: https://www.w3.org/TR/html5/
[mediacapture-streams]
Media Capture and Streams. Cullen Jennings; Bernard Aboba; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 19 December 2024. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[streamproc]
MediaStream Processing API. Robert O'Callahan. W3C. 31 May 2012. W3C Working Group Note. URL: https://www.w3.org/TR/streamproc/
[WEBAUDIO]
Web Audio API. Paul Adenot; Hongchan Choi. W3C. 17 June 2021. W3C Recommendation. URL: https://www.w3.org/TR/webaudio-1.0/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
WebRTC: Real-Time Communication in Browsers. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; Florent Castelli. W3C. 8 October 2024. W3C Recommendation. URL: https://www.w3.org/TR/webrtc/

B.2 资料性参考文献

[GETUSERMEDIA]
Media Capture and Streams. Cullen Jennings; Bernard Aboba; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 19 December 2024. CRD. URL: https://www.w3.org/TR/mediacapture-streams/