MediaStream引用存储在哪里?
问题描述:
使用navigator.mediaDevices.getUserMedia(约束),您可以为各种设备(其中包括网络摄像头和麦克风)获取MediaStream对象,从而使您能够根据所需数据执行任何操作。MediaStream引用存储在哪里?
getUserMedia方法返回一个Promise,它反过来返回一个媒体流,或者在给定约束(视频,音频等)没有可用流的情况下拒绝。如果确实获得了流对象但不保存任何引用到MediaStream - 垃圾收集器应该删除它,对吧?但是,我观察到的是,流不会被删除 - 例如,如果我为网络摄像头获取流,即使我没有参考流,它仍会保持忙碌状态。
问题是:如果您自己没有保存对它的引用,MediaStream对象存储在哪里?为什么它不被垃圾收集器清除?为什么我的摄像头保持忙碌?
答
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
什么浏览器?用[这个小提琴](https://jsfiddle.net/jib1/qz7qh9h7/),我的相机指示灯在Firefox和Chrome中都会熄灭约10秒。注意包含一些代码? – jib