未删除 MediaStream 引用/为什么我的网络摄像头一直忙?

MediaStream reference not removed / why does my webcam stay busy?

背景/问题

使用 navigator.mediaDevices.getUserMedia(constraints) 我可以获得各种设备的 MediaStream 对象,其中包括网络摄像头和麦克风,允许您对通过的数据做任何您想做的事情。

方法 getUserMedia returns a Promise 解析为媒体流或如果没有流可用于给定约束(视频、音频等)则拒绝获取流对象但不保存对 MediaStream 的任何引用 - 我知道垃圾收集器应该删除它。

我观察到流没有被删除 - 例如,如果我获得网络摄像头的流,即使我没有对流的引用,它仍然很忙。

问题

  1. 如果我不保存对它的引用,MediaStream 对象存储在哪里?
  2. 为什么它没有被垃圾收集器删除?
  3. 为什么我的网络摄像头一直忙?

MediaStream API 要求您停止包含在您获得的 MediaStream 实例中的每个轨道。在您这样做之前,媒体捕获将继续进行。

navigator.mediaDevices
  .getUserMedia({
    audio: true,
    video: true
  })
  .then(function (stream) {
    console.log('got stream with id ' + stream.id)
    stream.getTracks().forEach(function (track) { track.stop() })
    // WebCam will not be busy anymore
  })
  .catch(function (reason) {
    console.error('capture failed ' + reason)
  })