9

我正在尝试MediaStreamTrack在我的 WebRTC 应用程序中实现使本地视频静音的功能。以下是我的处理方法:

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

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

如果我这样做了,相机的灯就会熄灭this._localStream.stop(),但音频也会熄灭。

Media Capture 规范的当前草案提到了该MediaStreamTrack.stop()方法,但目前似乎未在 Chrome 和 Firefox 中实现。

那么有没有办法在以下情况下静音本地视频:

  1. 使相机的灯熄灭
  2. 不会丢失音轨?
4

3 回答 3

4

今天

track.stop()在 Firefox 中运行良好。铬在后面。结束曲目的规范方式(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 赶上之前,您的其他答案(每次 drop 和 re-gUM)应该在那里工作,因为它们从不重新提示。

通过浏览器检测和组合这些答案,应该可以提出在多个浏览器中运行良好的东西,直到浏览器赶上来。

长期

该规范最近通过允许浏览器在暂时静音(例如)期间关闭相机灯来解决这个问题track.enabled == false,前提是相机访问指示灯保持打开:

“鼓励用户代理提供任何可访问的当前状态的持续指示。

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

规范中的这些语句之前有更强大的语言,使指标成为一项要求。

目前,浏览器没有正确实现这一点。Chrome 已关闭,最近访问后右侧 url 栏内有一个微小的摄像头访问指示器,但它未能在页面加载时出现以警告上次访问已授予持久访问权限;该站点可以随时打开相机。

于 2017-01-09T13:43:43.103 回答
1

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

于 2014-01-02T16:17:08.523 回答
-1

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

于 2017-01-09T12:58:08.313 回答