2016-07-20 27 views
5

這是我的代碼。navigator.getUserMedia允許一個約束,另一個不允許,在關閉瀏覽器提示時調用成功回調

captureUserMedia(mediaConstraints, successCallback, errorCallback) { 
    navigator.getUserMedia(mediaConstraints, successCallback, errorCallback); 
} 

captureUserMedia00(callback){ 
    captureUserMedia({ 
    audio: true, 
    video: true 
    }, function(stream) { 
    console.log('user media Callback', stream); 
    callback(stream); 
    }, function(error) { 
    console.log('user media Error ', JSON.stringify(error)); 
    }); 
}}); 
} 

這裏,當視頻約束是尚未得到用戶允許的,但聲音已經允許(由於對方只是錄音),並提示輸入相同的情況下,與用戶「關閉」的提示,successCallback是叫,我不會得到VideoStream,但只是音頻。

如何確保在調用successCallback時允許視頻和音頻權限?

回答

2

這實際上是Chrome和Firefox中的一個錯誤,因爲它在這種情況下調用errorCallback。它在Firefox開發版中已經修復(49)。

作爲一種解決方法,請檢查你有兩條軌道:

if (stream.getTracks().length < 2) { 
    throw new Error("Need both"); 
} 

一個填充工具可能會是這個樣子(使用https fiddle在Chrome):

let getUserMedia = constraints => 
 
    navigator.mediaDevices.getUserMedia(constraints).then(stream => { 
 
    if (constraints.audio && !stream.getAudioTracks().length || 
 
     constraints.video && !stream.getVideoTracks().length) { 
 
     stream.getTracks().forEach(track => track.stop()); 
 
     throw new DOMException("The object can not be found here.", 
 
          "NotFoundError"); 
 
    } 
 
    return stream; 
 
    }); 
 

 
getUserMedia({ video: true, audio: true }) 
 
    .then(stream => video.srcObject = stream) 
 
    .catch(e => console.log(e.name + ": "+ e.message));
<video id="video" width="160" height="120" autoplay></video>

+1

是啊,我最終檢查是否在'successCallback'中同時存在'audio'和'video'軌道。謝謝你的回答! –