【问题标题】:webRTC: Add audio later or disable microphone using peerJSwebRTC:稍后添加音频或使用 peerJS 禁用麦克风
【发布时间】:2014-04-01 10:50:30
【问题描述】:

我目前正在编写一个应用程序,使用户能够使用 peerJS 通过 webRTC 发起视频通话。现在我希望用户能够决定是否要添加音频,但无需重新启动通话。

在我看来 - 根据this answer 的说法 - 无法使用浏览器控制麦克风。假设我在启用视频和音频的情况下开始通话,我可以将合作伙伴端的视频元素静音。我不想那样做。为什么?我想有人可以使用浏览器的开发者控制台取消视频元素的静音,从而在调用者不知情的情况下监视调用者。

所以现在看来​​我必须重新呼叫合作伙伴并激活视频和音频,现在如果用户只想要视频,我将不得不再次重新呼叫。

我的问题:有更好的方法吗?另外,如果接听电话,是否有办法确定是纯视频通话还是视频和音频通话?

【问题讨论】:

  • 为什么不使用 peerjs 调用的 metadata 参数来识别它是音频通话还是视频通话。当然你需要在拨打电话的时候设置这个参数。

标签: javascript html webrtc video-conferencing peerjs


【解决方案1】:

偶然发现this blog post from Mozilla。有趣的部分从标题“静音音频和视频流”开始。在这里您将找到以下代码行:

mediaStream.getVideoTracks()[0].enabled = !(mediaStream.getVideoTracks()[0].enabled);

这基本上意味着您可以禁用 Video-Track。事实证明,这也是可能的:

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;

据我判断,您不能在 remoteStream 上执行相同的操作。但我必须通过进一步的测试来验证这一点。

【讨论】:

  • 我通过从连接的对等方发送消息来切换远程流上的音频,例如enable-audiodisable-audio,然后相应地使用stream.getAudioTracks()[0].enabled。我想音频在禁用时不会传输到对等方,但我还无法测量数据传输。
【解决方案2】:

您正在寻找的似乎是一种撤销对麦克风或网络摄像头的访问权限的方法,以便数据流停止,指示灯熄灭,如果重新激活摄像头,则会再次提示用户.

根据W3C WebRTC Spec,你应该可以这样做:

脚本可以通过 MediaStreamTrack.stop() 方法指示轨道不再需要其来源。当使用某个源的所有轨道都已停止时,给定的对该源的权限将被撤销并停止该源。如果数据是从实时源(例如麦克风或摄像头)生成的,则用户代理应删除该源的所有活动“直播”指示器。

peerJS API docs 中没有提到 stop() 方法,但您应该能够在浏览器的 WebRTC 实现中调用它,使用传递给 peerJS 的 call() 函数的流,我将致电stream:

var s = function(t) {
    t.stop();
}
stream.getAudioTracks().map(s);

这应该会导致浏览器撤销音频访问权限。

但是,我不会太担心在用户浏览器中保留打开的 WebRTC 连接的安全性。如果有人能够侵入浏览器,他们已经可以访问用户的未加密密码,并且无论如何摄像头指示灯(如果可用)都会亮起。

祝你好运!

【讨论】:

  • 感谢您的回答,虽然不是我想要的(我的错)。有关对我有用的解决方案,请参阅上面的答案。至少现在。将不得不做进一步的测试。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2014-10-21
  • 2017-10-26
  • 2020-09-29
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多