未删除 MediaStream 引用/为什么我的网络摄像头一直忙?
MediaStream reference not removed / why does my webcam stay busy?
背景/问题
使用 navigator.mediaDevices.getUserMedia(constraints)
我可以获得各种设备的 MediaStream 对象,其中包括网络摄像头和麦克风,允许您对通过的数据做任何您想做的事情。
方法 getUserMedia
returns a 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)
})
背景/问题
使用 navigator.mediaDevices.getUserMedia(constraints)
我可以获得各种设备的 MediaStream 对象,其中包括网络摄像头和麦克风,允许您对通过的数据做任何您想做的事情。
方法 getUserMedia
returns a 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)
})