使用 getUserMedia 和 RTCPeerConnection Chrome 25 停止/关闭网络摄像头

Posted

技术标签:

【中文标题】使用 getUserMedia 和 RTCPeerConnection Chrome 25 停止/关闭网络摄像头【英文标题】:Stop/Close webcam using getUserMedia and RTCPeerConnection Chrome 25 【发布时间】:2013-02-14 17:37:40 【问题描述】:

我在 Chrome 25 上成功使用 getUserMedia 和 RTCPeerConnection 将网页中的音频连接到另一方,但我无法让 API 停止 Chrome 选项卡中正在使用媒体的红色闪烁指示图标在那个页面上。我的问题本质上与Stop/Close webcam which is opened by navigator.getUserMedia 重复,只是那里的分辨率不起作用。如果我的页面仅使用 getUserMedia 而没有远程媒体(无对等),则停止相机会关闭闪烁的选项卡指示器。添加远程流似乎是一个/问题。这是我目前的“关闭”代码:

if (localStream) 
    if (peerConnection && peerConnection.removeStream) 
        peerConnection.removeStream(localStream);
    
    if (localStream.stop) 
        localStream.stop();
    
    localStream.onended = null;
    localStream = null;

if (localElement) 
    localElement.onerror = null;
    localElement.pause();
    localElement.src = undefined;
    localElement = null;

if (remoteStream) 
    if (peerConnection && peerConnection.removeStream) 
        peerConnection.removeStream(remoteStream);
    
    if(remoteStream.stop) 
        remoteStream.stop();
    
    remoteStream.onended = null;
    remoteStream = null;

if (remoteElement) 
    remoteElement.onerror = null;
    remoteElement.pause();
    remoteElement.src = undefined;
    remoteElement = null;

if (peerConnection) 
    peerConnection.close();
    peerConnection = null;

我已经尝试过使用和不使用removeStream() 调用,我已经尝试过使用和不使用stop() 调用,我已经尝试过element.src=""element.src=null,我的想法已经不多了。有人知道这是错误还是用户/我在使用 API 时的错误?

编辑:我将我的默认设备(使用 Windows)设置为在使用时有灯的相机,并且在停止时,相机灯熄灭,所以这可能是 Chrome 错误.我还发现,如果我使用chrome://settings/content 将麦克风设备更改为“默认”以外的任何设备,Chrome 音频将完全失败。最后,我意识到使用 element.src=undefined 会导致 Chrome 尝试加载资源并抛出 404,所以这显然是不正确的......所以回到element.src=''

【问题讨论】:

【参考方案1】:

最终是我的错(是的,令人震惊)。原来我没有在getUserMediaonUserMediaSuccess 回调中正确保存localStream...一旦设置好,Chrome 就会关闭闪烁的录制图标。这并没有解释其他异常情况,但它结束了问题的要点。

【讨论】:

几个月前我也遇到过类似的问题:***.com/a/14366623/1916258【参考方案2】:

刚刚在浏览了 WebRTC 规范后昨天才开始工作。我不知道这是否是“正确”的做法,但我发现在删除流后重新协商 PeerConnection 并提供新的报价就可以了。

var pc = peerConnections[socketId];
pc.removeStream(stream);
pc.createOffer( function(session_description) 
  pc.setLocalDescription(session_description);
  _socket.send(JSON.stringify(
    "eventName": "send_offer",
    "data":
      "socketId": socketId,
      "sdp": session_description
      
    ));
,
function(error) ,
defaultConstraints);

【讨论】:

感谢您的帖子;我在peerConnection.close 行上方的peerConnection.createOffer 上方添加了我的关闭代码,但奇怪的是,它似乎以某种方式失败,没有调用成功回调或失败回调,也没有抛出错误。不幸的是,我的小 chrome tab 录制图标仍在闪烁。如果我发现任何东西,我会继续从这个角度工作并回复,谢谢。

以上是关于使用 getUserMedia 和 RTCPeerConnection Chrome 25 停止/关闭网络摄像头的主要内容,如果未能解决你的问题,请参考以下文章

如何在Chrome for iOS中使用getUserMedia

使用 getUserMedia 和 RTCPeerConnection Chrome 25 停止/关闭网络摄像头

在 Chrome 中使用 HTML5 和 getUserMedia 录制音频

使用 Cordova 和 JavaScript(没有 getUserMedia)从 android 麦克风获取音频数据

Firefox 和 Chrome 中的 getUserMedia() 视频大小不同

`MediaDevices.getUserMedia` `undefined` 的问题