Javascript 网络摄像头指示灯在流停止后保持亮起

Javascript 网络摄像头指示灯在流停止后保持亮起,javascript,html,web,webrtc,webcam,Javascript,Html,Web,Webrtc,Webcam,我正在构建一个项目,从浏览器中的网络摄像头捕获图像。拍摄图像后,我不再需要使用相机,因此我尝试使用以下功能停止它: 功能停止摄像头(容器){ console.log(“停止照相机”); video=container.querySelector('.video streamer'); console.log(视频); video.srcObject=null; navigator.mediaDevices.getUserMedia({video:true})。然后( 功能(流){ console

我正在构建一个项目,从浏览器中的网络摄像头捕获图像。拍摄图像后,我不再需要使用相机,因此我尝试使用以下功能停止它:

功能停止摄像头(容器){
console.log(“停止照相机”);
video=container.querySelector('.video streamer');
console.log(视频);
video.srcObject=null;
navigator.mediaDevices.getUserMedia({video:true})。然后(
功能(流){
console.log(stream.getTracks().length);
stream.getTracks().forEach(函数(跟踪){
log(“找到需要停止的流”)
track.stop();
});
console.log(stream.getTracks().length);
}).接住(
函数(错误){
日志('getUserMedia()错误',错误);
});
}
但是,即使调用了该函数,网络摄像头访问指示灯仍然亮着,我看到浏览器(Firefox和Chrome)仍然显示页面正在使用摄像头


上面的代码缺少什么?

navigator.mediaDevices.getUserMedia
返回一个新流(克隆),而不是现有流

在灯熄灭之前,您必须停止all流式克隆中的all曲目,这些克隆是从对
getUserMedia
的不同调用返回的

在您的情况下,这包括您正在播放的流的轨迹。使用以下命令:

function stopCamera(container) {
  const video = container.querySelector('.video-streamer');

  for (const track of video.srcObject.getTracks()) {
    track.stop();
  }
  video.srcObject = null;
}
一旦所有轨道停止,灯应立即熄灭

如果您忽略了这一点,则由于垃圾收集(假设它是对流的单独引用),在
video.srcObject=null
之后3-10秒,指示灯仍会熄灭


如果你已经创建了任何曲目,你也需要停止它们。

正如推特上回复的那样,这个片段在Edge Chromium中确实对我有用,但是它会用
getUserMedia
再次抓取摄像机,如果我注释掉整个块,那么只有将
srcObject
设置为null才能杀死摄像机,灯也熄灭了。谢谢你,行了!这似乎不是瞬间的,可能需要约5-10秒的时间让灯熄灭。这是意料之中的吗?@DenDelimarsky听起来你并没有阻止他们,而是喜欢垃圾收集。如果你停止了所有的轨道,灯应该立即熄灭。确保web控制台中没有错误。您是否多次调用
getUserMedia
?很好-我发现一个地方没有正确处理流。再次感谢您的浏览!