Copyright © 2015-2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本文档定义了如何从 DOM 元素捕获媒体流,例如
video、
audio
或
canvas
元素,以 MediaStream
[GETUSERMEDIA] 的形式。
本节描述此文档在发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版,可在 W3C 技术报告索引中找到: https://www.w3.org/TR/。
本文档尚未完成。它可能会发生重大变化,因此虽然鼓励早期实验, 但它并不打算用于实现。
本文档由 Web 实时 通信工作组作为 工作草案发布,使用的是 推荐标准轨道。
作为工作草案发布,并不 意味着得到 W3C 及其成员的认可。
这是一份草案文档,可能会在任何时候被其他 文档更新、替换或废弃。除作为进行中的工作外,不应引用本文档。
本文档由一个按照 W3C 专利 政策运作的小组制作。 W3C 维护一份 与该小组交付成果相关的任何专利披露的公开列表; 该页面还包括 专利披露说明。实际知晓某项专利,并认为该专利包含 必要权利要求 的个人,必须依照 W3C 专利政策第 6 节 披露相关信息。
本文档受 2023 年 11 月 03 日 W3C 流程文档管辖。
本节为非规范性内容。
本文档描述了对 HTML 媒体元素和 HTML canvas 元素的扩展,使得能够以流式 媒体的形式捕获元素的输出。
捕获的媒体会被构造成一个 MediaStream
[GETUSERMEDIA],随后可由处理媒体流的各种 API
使用,例如 WebRTC
[WEBRTC],或 Web Audio [WEBAUDIO]。
除标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释均为非规范性内容。其他所有内容均为规范性内容。
本文档中的关键词 MUST 和 MUST NOT 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,但仅当它们像此处所示那样以全大写形式出现时才如此。
本规范定义了适用于单一产品的一致性准则:实现其所包含接口的 用户代理。
使用 ECMAScript 来实现本规范中定义的 API 的实现,必须以符合 Web IDL 规范 [WEBIDL] 中定义的 ECMAScript 绑定的方式实现它们,因为本规范使用了该规范及其 术语。
方法 captureStream 被添加到 HTML
[HTML5] 媒体
元素上。
捕获方法被添加到 HTMLMediaElement
和 HTMLCanvasElement
二者上。
MediaStream 和 HTMLMediaElement
都暴露了
track
的概念。由于
HTMLMediaElement
没有使用通用类型,因此
本文档使用术语 track 来指代
VideoTrack
或 AudioTrack。
MediaStreamTrack
用于标识 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 事件触发)时,或当它捕获的轨道不再被选定或启用于播放时,
捕获的轨道会结束。如果通过设置媒体元素的 src
或
srcObject
属性更改了源,则 track 不再被选定或启用。
如果媒体元素的源发生变化,捕获的 MediaStreamTrack
集合也会发生变化。如果媒体元素的源结束,则会选择不同的源。
如果媒体元素的选定 VideoTrack
或启用的 AudioTrack
发生变化,则会为每个先前未被选定或启用的 track
生成一个带有新 MediaStreamTrack
的
addtrack
事件;并且会为每个不再被选定或启用的 track 生成一个
removetrack
事件。MediaStreamTrack
MUST 在从
MediaStream
移除之前结束。
由于 MediaStreamTrack
只能结束一次,因此一个被启用、
禁用并再次启用的 track 会被捕获为两个独立的 track。类似地,
在播放结束后重新开始播放,会导致创建一组新的捕获
MediaStreamTrack
实例。在播放期间进行查找
而不改变轨道选择,不会生成事件,也不会导致捕获的
MediaStreamTrack
结束。
组成捕获的
MediaStream
的 MediaStreamTrack
会随着它们所捕获的 track 状态变化而变为 muted 或 unmuted。
在任何时候,媒体元素都可能由于多种原因而在给定 track 上没有可供捕获的活动内容:
MediaStreamTrack
可能被
muted
或 disabled。
内容缺失会通过
muted
属性反映在捕获的轨道中。如果其对应的
源 track 没有可用且可访问的内容,则捕获的
MediaStreamTrack
的
muted
属性 MUST 被设置为 true。当内容
可用性发生变化时,会在 MediaStreamTrack
上触发
mute 事件。
muted 捕获所产生的输出会因媒体类型而异:
VideoTrack
在 muted 时停止捕获新帧,
导致捕获流显示最后捕获的一帧;muted 的
AudioTrack
会产生静音。
媒体元素是否正在主动渲染内容(例如渲染到屏幕或音频 设备)不会影响捕获流的内容。将媒体元素的音频静音不会导致捕获产生静音, 隐藏媒体元素也不会导致捕获的视频停止。类似地,媒体元素的音频电平或音量 不会影响捕获音频的音量。
来自具有非 1.0 有效 播放速率的元素的捕获音频 MUST 进行时间拉伸。不可播放的播放 速率会导致捕获的音频轨道变为 muted。
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 被绘制时,都会执行以下步骤:
[[frameCaptureRequested]]
内部槽
已被设置,则向 track 添加一个包含绘制到 canvas 上内容的新帧。
[[frameCaptureRequested]]
内部槽
设置为 false。
当向 track 添加包含绘制到 canvas 上内容的新帧时,如果 canvas 不是完全不透明的, 则必须捕获并保留 canvas 的 alpha 通道内容。此 track 的消费者可能不会 保留 alpha 通道。
此算法会导致捕获的轨道直到 canvas 中有内容发生变化时才开始。
| 参数 | 类型 | 可为空 | 可选 | 描述 |
|---|---|---|---|---|
| frameRequestRate |
double
|
✘ | ✔ |
MediaStream
CanvasCaptureMediaStreamTrack 是
MediaStreamTrack
的扩展,提供了单个
requestFrame()
方法。
依赖对媒体流中内容渲染进行精确控制的应用,可以使用此方法来控制何时从 canvas 捕获帧。
WebIDL[Exposed=Window] interface CanvasCaptureMediaStreamTrack : MediaStreamTrack {
readonly attribute HTMLCanvasElement canvas;
undefined requestFrame ();
};
canvas,类型为 HTMLCanvasElement,
readonly
requestFrame
requestFrame() 方法允许
应用手动
请求从 canvas 捕获一帧并将其渲染到 track 中。在
应用逐步渲染到 canvas 的情况下,这允许
应用避免捕获部分渲染的帧。
按当前规定,如果 canvas 不是 origin-clean,这不会导致
SecurityError
或其他
错误反馈。部分原因是我们并不跟踪帧请求来自何处。我们是否要强调这一点?
undefined
媒体元素可以渲染来自不同于媒体元素 origin 的 origin 的媒体资源。
在这些情况下,生成的 MediaStreamTrack
的内容 MUST 受到保护,避免被文档 origin 访问。
这种保护如何表现会有所不同,具体取决于内容的访问方式。例如,
将不可访问的视频渲染到
canvas
元素 [HTML]
会导致 canvas 的
origin-clean
标志变为 false;尝试创建 Web Audio
MediaStreamAudioSourceNode
[WEBAUDIO] 会成功,但不会向
文档 origin 产生任何信息(也就是说,只有静音会传输到音频上下文中);
尝试使用 WebRTC [WEBRTC] 传输媒体,则会导致
不传输任何信息。
媒体元素所渲染媒体的 origin 可能随时变化。即使对于单个媒体资源也是如此。 用户代理 MUST 确保媒体 origin 的变化不会导致跨源内容被暴露。
本节将在发布前移除。
本文档基于最初由 Robert O'Callahan 开发的流处理规范 [streamproc]。
Referenced in:
Referenced in:
Referenced in: