2014-10-07 230 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