即使在使用 webRTC 建立对等连接后停止流后,浏览器仍继续使用红点访问相机

Posted

技术标签:

【中文标题】即使在使用 webRTC 建立对等连接后停止流后,浏览器仍继续使用红点访问相机【英文标题】:Browser keeps on accessing the camera with red dot even after stopping the stream aafter establishing the peer connection using webRTC 【发布时间】:2020-10-16 18:23:42 【问题描述】:
let localStream;
let peerConnection;
navigator.mediaDevices.getUserMedia(
   audio: true,
   video: true
).then(function(stream) 
   createPeerConnection();
   localStream = stream;
   peerConnection.addStream(localStream);
);

所以当停止流时它会停止视频

localStream.getTracks().forEach(track => track.stop());

但浏览器选项卡显示它正在访问摄像头或麦克风,旁边有一个红点。我只是不想重新加载页面以阻止它。

注意:这种情况发生在使用 webRTC 建立对等连接后,并且在断开对等连接后,摄像头灯保持亮起。

有没有办法做到这一点。提前感谢您的帮助。

【问题讨论】:

这能回答你的问题吗? Stop/Close webcam which is opened by navigator.getUserMedia 感谢您的回复。我也从中得到了参考。没有帮助。我得到了一个新观点,即在与其他对等方建立 webRTC 调用后,相机没有停止。似乎一些 stram 克隆仍在该页面中。有没有办法销毁所有的流。 createPeerConnection() 看起来像什么?你在那里克隆媒体流吗? 在 createPeerConnection() 中我只创建 peerconnection 并初始化 pc 以及使用 pc.addStream(localStream) 添加流 @PradiptaDey 你能展示一下你是怎么做到的吗?试图复制,但不能在这里。 【参考方案1】:

您可以使用布尔值或条件,其中在 track.stop() 之后选项卡访问相机,您可以将值设置为 false,然后相机将不再被访问。 (ps如果可行的话你可以试试)

<!DOCTYPE html>
<html>
    <head>
        <title>Web Client</title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
   <div id="callerIDContainer">
          <button onclick="call_user();">Call User</button>
     </div>
      <div class="video-container">
      <video autoplay muted class="local-video" id="local-video"></video>    
    </div>
    <div>
        <button onclick="hangup();">Hangup</button>
    </div>
    
 </body>
    <script >
      var localStream;
      var accessRequired=true
      function call_user()  //your function
          
         
     if(accessRequired)
      
          navigator.mediaDevices.getUserMedia(
           audio: true,
           video: true
          ).then(function(stream) 
           localStream = stream;

           const localVideo = document.getElementById("local-video");
            
           if (localVideo) 
                localVideo.srcObject = localStream;
                 
          );

      

      

      function hangup()
        localStream.getTracks().forEach(track => track.stop()).then(()=>accessRequired=false);

      

    </script>
</html>

试试这个呼叫用户然后挂断它正在工作

【讨论】:

你能用一个sinppet或例子解释一下吗 感谢您的回复,但我想这无济于事,因为我已经有一个函数,在停止后我正在访问相机,我需要调用该函数才能再次访问相机。问题是相机灯在停止后仍然亮着,我也没有再次调用该函数。 @Pradipta Dey - 你解决了这个问题吗?【参考方案2】:

您问题中的示例代码看起来像是使用 gUM() 创建纯音频流 (video: false, audio:true)。

如果在纯音频流上的所有轨道上使用 .stop() 也会停止其他流上的视频轨道,那就太奇怪了。如果您想关闭相机的直播灯,您需要停止您在peerConnection.addTrack(videoTrack) 中使用的视频轨道。您可能还需要使用peerConnection.close() 终止通话。

【讨论】:

感谢您的回复。我想你明白了我的意思。绝对对不起配置视频应该是真的。我现在已经编辑了这个问题。我已经使用了获取 userMedia 的成功回调如下peerConnection.addStream(localStream) 所以在断开连接时我也在做peerConnection.close() 并停止所有轨道。有时相机灯仍然亮着,浏览器说它仍在访问我的相机【参考方案3】:

我在使用 webRTC 和 React 时遇到了同样的问题。我已经停止了远程流的轨道,但我忘了停止本地流:

window.localStream.getTracks().forEach((track) => 
    track.stop();
);

【讨论】:

以上是关于即使在使用 webRTC 建立对等连接后停止流后,浏览器仍继续使用红点访问相机的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC 对等服务器连接

检测 WebRTC 连接中的离线对等点

Twilio WebRTC TURN 中继在几分钟后随机停止工作

使用 webrtc 时 ReplayKit 不起作用

多个 webRTC 连接

如何在对等js中建立对等点之间的连接