为什么音视频MediaStreamTracks enabled参数设置为false时,"on-air"指示灯一直亮着?

Why when both audio and video MediaStreamTracks enabled parameter set to false, "on-air" indicator keeps being turned on?

W3C http://www.w3.org/TR/mediacapture-streams/#life-cycle-and-media-flow 关于媒体流生命周期的文章说:

When all tracks connected to a source are muted or disabled, the "on-air" or "recording" indicator for that source can be turned off; when the track is no longer muted or disabled, it must be turned back on.

提到的行为是否在 Chrome 中实现?

更新: Firefox 现在支持 turning off the camera light on mute. 编辑粗体.

我从主题中得知你知道答案是否定的。

当网站(暂时)禁用相机流时,Chrome 和 Firefox 都不会关闭相机灯。规范说“可以”将其关闭,但“必须”将其重新打开,因此两种浏览器都符合要求。

您可以在这里尝试:

var start = () => navigator.mediaDevices.getUserMedia({ video: true })
  .then(stream => video.srcObject = stream)
  .catch(e => log(e.name));

toggle.onclick = () => {
  var track = video.srcObject && video.srcObject.getVideoTracks()[0];
  if (!track) return;
  toggle.innerHTML = (track.enabled = !track.enabled) ? "Disable" : "Enable";
}

var log = msg => div.innerHTML += "<p>" + msg + "</p>";
<video id="video" height="120" width="160" autoplay></video><br>
<button onclick="start()">Start!</button>
<button id="toggle">Disable</button><div id="div"></div>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

注意: 在 Chrome 中改用 https://jsfiddle.net/jib1/b6tyjm4s/ (getUserMedia + snippets != <3).

至于为什么,spec also says

When permission is not stored, permission should last only until such time as all MediaStreamTracks sourced from that device have been stopped.

这可以从摄像头灯 以及浏览器内的摄像头和麦克风实时指示器 观察到。对于非持久性权限,两种浏览器都向用户保​​证,当摄像头灯熄灭时,网站的访问就结束了。 在站点暂时禁用流时关闭灯会破坏此保证。 浏览器内指示器可能会解决这个问题。

我不得不推测 Chrome 中的 https,但至少对于 Firefox,默认情况下权限授予是非持久性的,这就是原因。