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

时间:2013-02-28 13:43:36

标签: javascript html5 html5-video webrtc

我在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=nullchrome://settings/content,我的想法已经不多了。任何人都知道这是使用API​​时的错误或用户/我的错误吗?

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

2 个答案:

答案 0 :(得分:2)

结束了我的错(是的,令人震惊)。事实证明我没有在localStream onUserMediaSuccess回调中正确保存getUserMedia ...一旦设置完毕,Chrome就会关闭闪烁的录制图标。这并没有解释其他异常,但它结束了问题的主要观点。

答案 1 :(得分:0)

只是昨天在浏览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);