使用 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】:最终是我的错(是的,令人震惊)。原来我没有在getUserMedia
的onUserMediaSuccess
回调中正确保存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 麦克风获取音频数据