WebRTC:使用PeerJS稍后添加音频或禁用麦克风

5
我目前正在编写一个应用程序,使用PeerJS启用WebRTC使用户能够开始视频通话。现在我希望用户能够决定是否添加音频,但无需重新启动通话。 据我所知(根据这个答案),没有办法使用浏览器控制麦克风。假设我启用了视频和音频的通话,我可以在合作伙伴端静音视频元素。我不想这样做。为什么?我想象有人可能使用浏览器的开发者控制台取消静音视频元素,从而在未经他或她同意的情况下窥视呼叫者。 因此,目前似乎我必须重新呼叫合作伙伴并激活视频和音频,如果用户只需要视频,则必须再次重新呼叫。 我的问题是:有更好的方法吗?另外,在回答呼叫时,有办法确定它是只有视频还是视频和音频呼叫吗?

为什么不使用peerjs调用的元数据参数来识别是音频通话还是视频通话。当然,在发起呼叫时,您需要设置此参数。 - thunderbird
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
5
我是一个有用的助手,可以翻译文本。 偶然间我发现了 Mozilla的这篇博客文章。有趣的部分位于标题"静音音频和视频流"下面。在这里,你会发现以下代码行:
mediaStream.getVideoTracks()[0].enabled = !(mediaStream.getVideoTracks()[0].enabled);

这基本意味着你可以禁用视频轨道。事实证明,同样的结果也可以通过以下方式实现:

mediaStream.getAudioTracks()[0].enabled = false;
这将静音音频流。如果将其应用于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);   
     });
};

看起来禁用了音频流。您可以看到,我将localStream存储为对象的属性,并且稍后可以通过使用该属性来激活音频流

myObj.localStream.getAudioTracks()[0].enabled = true;
据我所知,您无法对远程流执行相同的操作。但我将通过进一步测试来验证这一点。

我通过从连接的对等方发送消息(如“启用音频”和“禁用音频”),来切换远程流上的音频,然后相应地使用stream.getAudioTracks()[0] .enabled。我想当音频被禁用时,它不会传输到对等方,但我还没有能够测量数据传输。 - Bert

3

看起来你想找的是一种撤销麦克风或摄像头访问权限的方法,使数据流停止,指示灯熄灭,并且如果重新激活相机,则再次提示用户。

根据W3C WebRTC规范,你应该能够做到这一点:

脚本可以使用MediaStreamTrack.stop()方法指示轨道不再需要其源。当使用源的所有轨道都已停止时,将撤消该源的权限并停止该源。如果数据来自实时源(例如麦克风或相机),则用户代理应删除该源的任何活动“正在直播”指示器。

peerJS API文档中没有提到stop()方法,但是你应该能够在浏览器的WebRTC实现上调用它,使用你传递给peerJS的call()函数的流,我将其称为stream

var s = function(t) {
    t.stop();
}
stream.getAudioTracks().map(s);
这应该会导致浏览器撤销音频访问权限。 然而,我不会太担心在用户的浏览器中保留一个开放的WebRTC连接的安全性。如果有人能够入侵浏览器,他们已经可以访问用户未加密的密码,并且摄像头指示灯(如果可用)无论如何都会亮起来。 祝好运!

谢谢你的回答,虽然不是我想要的(我的错)。请看上面我的回答,那个解决方案对我来说是有效的。至少目前是这样。还需要进一步测试。 - stiller_leser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,