WebRTC / getUserMedia:如何正确静音本地视频?

时间:2013-12-27 17:02:30

标签: webrtc getusermedia

我正在尝试在我的WebRTC应用程序中实现静音本地视频MediaStreamTrack的功能。这是我接近这个的方式:

function muteVideo() {
  if (this._localStream && this._localStream.getVideoTracks().length > 0) {
    this._localStream.getVideoTracks()[0].enabled = false;
  }
}

在Firefox中,正确连接本地流的<video>元素会在静音时呈现黑度。在Chrome中,黑色不会呈现,但图片会冻结。但是,在这两种浏览器中,相机的绿灯仍然亮着,这显然是不受欢迎的行为。 (我希望我的用户在视频静音时看到应用程序实际上断开与摄像头的连接。)

如果我this._localStream.stop(),相机的指示灯熄灭,但音频也会熄灭。

Media Capture规范的current draft提到MediaStreamTrack.stop()方法,但目前在Chrome和Firefox中似乎没有实现。

有没有办法让本地视频静音:

  1. 让相机的指示灯熄灭
  2. 没有丢失音轨?

3 个答案:

答案 0 :(得分:2)

今天

track.stop()在Firefox中运行良好。 Chrome背后。指定结束曲目的方式(https fiddle):

navigator.mediaDevices.getUserMedia({video: true, audio: true})
  .then(stream => video.srcObject = stream)
  .catch(e => log(e.name + ": "+ e.message));

let stop = k => video.srcObject.getTracks().map(t => t.kind == k && t.stop());
<video id="video" width="160" height="120" autoplay></video><br>
<button onclick="stop('video')">Stop Video</button>
<button onclick="stop('audio')">Stop Audio</button>

这使您可以在保留音频的同时关闭视频,而无需在Firefox中重新提示。在重新打开视频时仍会收到提示,因此它并不完美,但会提高50%。

在Chrome赶上之前,你的另一个答案(每次丢弃和重新gUM)应该在那里工作,因为它们永远不会重新提示。

通过浏览器检测并组合这些答案,应该可以在多个浏览器中找到适用的东西,直到浏览器赶上来。

长期

该规范最近addressed this允许浏览器在暂时静音期间关闭相机灯(例如track.enabled == false),前提是相机访问指示灯仍然亮着:

  

“鼓励用户代理持续提供anyAccessible当前状态的指示。

     

鼓励用户代理提供anyLive当前状态的持续指示,并使任何通用硬件设备指示灯匹配。“

更强的语言在规范中的这些陈述之前,使得指标成为一种要求。

目前,浏览器无法正确实现此功能。 Chrome很近,在最近访问后右侧的网址栏内有一个微小的摄像头访问指示器,但它无法在页面加载时出现,以警告前一次访问时授予了持久访问权限;该网站可以随时打开相机。

答案 1 :(得分:0)

我认为你可以对getuser媒体提出两个请求:http://codepen.io/anon/pen/gjtpu。然后你可以真正停止流。您还必须在用户之间使用多个对等连接,因为firefox不支持重新关联(在现有对等连接期间添加或删除流)

答案 2 :(得分:0)

我们通过拆除本地媒体流并在没有视频轨道的情况下重新创建它来解决这个问题。在呼叫中进行呼叫需要重新建立对等连接或执行重新协商(通过发送新的提议触发)。