sti*_*ser 5 html javascript video-conferencing webrtc peerjs
我目前正在编写一个应用程序,使用户能够使用peerJS 通过 webRTC 启动视频通话。现在我希望用户能够决定是否要添加音频,但无需重新启动通话。
正如我所见 - 根据这个答案- 无法使用浏览器控制麦克风。假设我在启用视频和音频的情况下开始通话,我可以将合作伙伴端的视频元素静音。我不想那样做。为什么?我想象有人可以使用浏览器的开发者控制台并取消视频元素的静音,从而在呼叫者不知情的情况下监视呼叫者。
因此,目前看来我必须重新呼叫合作伙伴并激活视频和音频,现在如果用户只想要视频,我将不得不再次重新呼叫。
我的问题:有更好的方法吗?另外,如果接听电话,是否有办法确定是纯视频通话还是视频和音频通话?
我偶然发现了Mozilla 的这篇博文。有趣的部分从标题“静音音频和视频流”开始。在这里你会发现以下代码行:
mediaStream.getVideoTracks()[0].enabled = !(mediaStream.getVideoTracks()[0].enabled);
Run Code Online (Sandbox Code Playgroud)
这基本上意味着您可以禁用视频轨道。事实证明,同样的情况也可以实现:
mediaStream.getAudioTracks()[0].enabled = false;
Run Code Online (Sandbox Code Playgroud)
这将使音频流静音。如果将其应用于 localStream,如下所示:
Participant.prototype.startCall = function(){
var participant = this;
var target = participant.callees[0];
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
navigator.getUserMedia({
audio: true,
video: true
},function(stream){
console.log("called");
//IMPORTANT LINE HERE
stream.getAudioTracks()[0].enabled = false;
participant.localStream = stream;
participant.call = participant.peer.call(target, stream);
},function(error){
console.log(error);
});
};
Run Code Online (Sandbox Code Playgroud)
它似乎禁用了音频流。如您所见,我将 localStream 存储为对象的属性,稍后可以使用以下命令激活音频流
myObj.localStream.getAudioTracks()[0].enabled = true;
Run Code Online (Sandbox Code Playgroud)
据我判断,你不能对remoteStream 执行相同的操作。但我必须通过进一步的测试来验证这一点。
小智 3
您似乎正在寻找一种撤销对麦克风或网络摄像头的访问权限的方法,以便数据流停止,指示灯熄灭,并且如果重新激活摄像头,则会再次提示用户。
根据W3C WebRTC Spec,您应该能够执行以下操作:
脚本可以使用MediaStreamTrack.stop()方法指示轨道不再需要其源。当使用某个源的所有轨道都已停止时,该源的给定权限将被撤销,并且该源将被停止。如果数据是从实时源(例如麦克风或摄像机)生成的,则用户代理应该删除该源的任何活动的“直播”指示器。
在peerJS API文档中没有提到stop()方法,但是您应该能够在浏览器的WebRTC实现上调用它,使用您传递给peerJScall()函数的流,我将调用它stream:
var s = function(t) {
t.stop();
}
stream.getAudioTracks().map(s);
Run Code Online (Sandbox Code Playgroud)
这应该会导致浏览器撤销音频访问。
但是,我不会太担心在用户浏览器中保留开放的 WebRTC 连接的安全性。如果有人能够侵入浏览器,他们就已经可以访问用户的未加密密码,并且摄像头指示灯(如果可用)无论如何都会亮起。
祝你好运!
| 归档时间: |
|
| 查看次数: |
9897 次 |
| 最近记录: |