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

jam*_*mix 7 webrtc getusermedia

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

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

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

如果我这样做this._localStream.stop(),相机的指示灯会熄灭,但音频也会响起.

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

那么有没有办法静音本地视频,同时:

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

jib*_*jib 6

今天

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());
Run Code Online (Sandbox Code Playgroud)
<video id="video" width="160" height="120" autoplay></video><br>
<button onclick="stop('video')">Stop Video</button>
<button onclick="stop('audio')">Stop Audio</button>
Run Code Online (Sandbox Code Playgroud)

这为您提供了一种在保留音频的同时关闭视频的方法,而无需在 Firefox 中重新提示权限。重新打开视频时您仍然会收到提示,因此它并不完美,但好 50%。

在 Chrome 赶上之前,您的其他答案(每次删除并重新 gUM)应该在那里工作,因为它们永远不会重新提示。

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

长期

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

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

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

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

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

  • @jamix 我为您提供了一种在保留音频的同时关闭视频的方法,而无需在今天的 Firefox 中重新提示许可。这击败了你的自我回答,它会在 Firefox 中重新提示“两次”(一次当视频消失时,一次当视频重新出现时)。通过浏览器检测并组合这些答案,您应该能够想出在多个浏览器中运行良好的东西,直到浏览器赶上。几乎不值得投反对票。 (2认同)

flo*_*850 1

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