2

背景/问题

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

如果没有可用于给定约束(视频、音频等)的流,则该方法getUserMedia返回一个Promise解析媒体流的方法,如果我确实获得了流对象但不保存对 MediaStream 的任何引用 - 我明白垃圾收集器应将其删除。

我观察到的是流没有被删除-例如,如果我为网络摄像头获取流,即使我没有对流的引用,它也会一直很忙。

问题

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

1 回答 1

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)
  })

于 2017-03-14T16:34:40.177 回答