-1

我在 Chrome 25 上成功使用 getUserMedia 和 RTCPeerConnection 将音频从网页连接到另一方,但我无法让 API 停止 Chrome 选项卡中正在使用媒体的红色闪烁指示图标在该页面上. 我的问题本质上是由 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=""and element.src=null,我的想法已经不多了。有人知道这是错误还是用户/我在使用 API 时的错误?

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

4

2 回答 2

2

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

于 2013-03-01T14:12:37.500 回答
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);
于 2013-03-01T00:07:44.653 回答