2016-11-07 55 views
0

使用navigator.mediaDevices.getUserMedia(約束),您可以爲各種設備(其中包括網絡攝像頭和麥克風)獲取MediaStream對象,從而使您能夠根據所需數據執行任何操作。MediaStream引用存儲在哪裏?

getUserMedia方法返回一個Promise,它反過來返回一個媒體流,或者在給定約束(視頻,音頻等)沒有可用流的情況下拒絕。如果確實獲得了流對象但不保存任何引用到MediaStream - 垃圾收集器應該刪除它,對吧?但是,我觀察到的是,流不會被刪除 - 例如,如果我爲網絡攝像頭獲取流,即使我沒有參考流,它仍會保持忙碌狀態。

問題是:如果您自己沒有保存對它的引用,MediaStream對象存儲在哪裏?爲什麼它不被垃圾收集器清除?爲什麼我的攝像頭保持忙碌?

+0

什麼瀏覽器?用[這個小提琴](https://jsfiddle.net/jib1/qz7qh9h7/),我的相機指示燈在Firefox和Chrome中都會熄滅約10秒。注意包含一些代碼? – jib

回答

1

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