2014-10-07 229 views
3

在我的nexus4(Android 4.4.4)上,我正在嘗試在面向相機的'用戶'和麪向相機的'環境'之間切換用新約束調用getUserMedia會導致黑屏(MediaStream.ended = true)

訪問任何一個直接工作。 在它們之間切換bij再次調用navigator.getUserMedia()設置新約束失敗。失敗導致黑屏視頻& MediaStream.ended = true

爲什麼MediaStream.ended = true在我第二次調用getUserMedia時?

在我看來,我動態創建視頻源數量的按鈕。兩個在這種情況下。點擊按鈕將調用camera.getUserMedia()並通過在媒體源:

camera.getUserMedia = function(source){ 
     var constraints = { 
      video: true, 
      audio: false 
     }; 
     if(source){ 
      constraints.video = {optional: [{ 
       sourceId: source.id 
      }]}; 
     } 
     navigator.getMedia(
      constraints, 
      function(stream) { 
       var vendorURL = window.URL || window.webkitURL; 
       video.src = vendorURL.createObjectURL(stream); 
       video.play(); 
       streaming = true; 
      }, 
      function(err) { 
       ... 
      } 
     ); 
    }; 

enter image description here

+0

我假設,因爲你只能有一個攝像頭的時間和殺死另一個殺死原始流...您將需要重新談判整個對等連接,一旦加入,將其與創建新流其他相機。 – 2014-10-08 00:52:20

+0

@BenjaminTrent你在談論'重新談判對等連接'。我再次使用包含其他相機ID的新約束來調用「navigator.getUserMedia()」(重新協商?)。這不是你說'重新談判對等連接'的意思嗎? – Timo 2014-10-08 18:17:33

+0

忽略我以前的評論...我完全錯了:)。這兩個電話的源ID是什麼? – 2014-10-08 18:48:45

回答

0

我已經解決了這個問題存放照相機對象上的流,然後將料流結合到視頻元素之前我會呼叫停止吧。不確定究竟發生了什麼(也許有人可以在評論中添加解釋)。

camera.getUserMedia = function(source){ 
     if(camera.stream){ 
      camera.stream.stop(); 
     } 
     ... 
     navigator.getMedia(
      constraints, 
      function(stream) { 
       camera.stream = stream; 
       ... 
      }, 
      function(err) { 
       ... 
      } 
     ); 
    }; 
+0

停止流對我沒有任何影響 – pthalacker 2017-04-13 21:07:47

+0

嘿,我知道已經過去了一段時間,但是當我遇到完全相同的問題時,我使用了這個主題。 @pthalacker您的問題可能是由於某些流尚未關閉而導致的,您已嘗試訪問下一個流。這是我用於我的解決方案的代碼位if(window.stream){window.stream.getTracks()。forEach(function(track){ track.stop(); }); }' 您需要在MediaTracks上操作。 – 2017-07-26 13:15:54