MediaStream引用存储在哪里?

问题描述:

使用navigator.mediaDevices.getUserMedia(约束),您可以为各种设备(其中包括网络摄像头和麦克风)获取MediaStream对象,从而使您能够根据所需数据执行任何操作。MediaStream引用存储在哪里?

getUserMedia方法返回一个Promise,它反过来返回一个媒体流,或者在给定约束(视频,音频等)没有可用流的情况下拒绝。如果确实获得了流对象但不保存任何引用到MediaStream - 垃圾收集器应该删除它,对吧?但是,我观察到的是,流不会被删除 - 例如,如果我为网络摄像头获取流,即使我没有参考流,它仍会保持忙碌状态。

问题是:如果您自己没有保存对它的引用,MediaStream对象存储在哪里?为什么它不被垃圾收集器清除?为什么我的摄像头保持忙碌?

+0

什么浏览器?用[这个小提琴](https://jsfiddle.net/jib1/qz7qh9h7/),我的相机指示灯在Firefox和Chrome中都会熄灭约10秒。注意包含一些代码? – jib

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

+0

我想,当我遇到这个问题时,我正在使用的HTML视频框架(videojs)中存在一些基础机制,这让getUserMedia被调用的次数增加了很多。说了这么多,你的帖子回答了这个问题:) – maxpaj