browser - 如何手动停止 getDisplayMedia 流以结束屏幕捕获?
问题描述
我有兴趣从用户那里获取屏幕截图,并且我正在使用getDisplayMedia
API 来捕获用户的屏幕:
const constraints = { video: true, audio: false };
if (navigator.mediaDevices["getDisplayMedia"]) {
navigator.mediaDevices["getDisplayMedia"](constraints).then(startStream).catch(error);
} else {
navigator.getDisplayMedia(constraints).then(startStream).catch(error);
}
执行时,浏览器会提示用户是否要共享他们的显示。用户接受提示后,提供的回调会收到一个 MediaStream。为了可视化,我将它直接绑定到一个元素:
const startStream = (stream: MediaStream) => {
this.video.nativeElement.srcObject = stream;
};
到目前为止,这很简单且非常有效。不过,我只对单个帧感兴趣,因此我想在处理完流后立即手动停止流。
我尝试的是video
从 DOM 中删除该元素,但 Chrome 一直显示一条消息,指出当前已捕获屏幕。所以这只会影响视频元素,但不会影响流本身:
我查看了MDN 上的 Screen Capture API 文章,但找不到任何关于如何停止流的提示。
如何正确结束流以使提示也停止?
解决方案
您可以停止它的轨道,而不是停止流本身。
使用该方法遍历轨道getTracks
并调用stop()
它们中的每一个:
stream.getTracks()
.forEach(track => track.stop())
一旦所有曲目停止,Chrome 的捕获提示也会消失。
推荐阅读
- php - 从字符串 php 中提取重量 kg
- dafny - Dafny:构造函数中的后置条件错误
- c# - .NET Core 3.1 在控制器中抛出的异常在命中中间件之前被记录
- c++ - 如何设置默认参数 如果用户没有输入另一个参数
- ansible - Ansible如何使用变量和字符串的混合作为键从字典中获取值
- c++ - 将 strcpy_s 转换为 strcpy CPP
- ios - Alamofire 5 代表中缺少 sessionDidReceiveChallenge
- r - 创建 R 函数问题
- outlook - 如何使用 appendOnSendAsync?
- amazon-web-services - 创建 IAM 用户以授予在 AWS EC2 中执行某些任务的权限