20

我想从音频/视频流更改为“屏幕共享”流:

peerConnection.removeStream(streamA) // __o_j_sep... in Screenshots below
peerConnection.addStream(streamB)  // SSTREAM in Screenshots below
  • streamA是来自我的相机和麦克风的视频/音频流。
  • streamB是我从我的扩展中获得的屏幕截图。
  • 它们都是MediaStream对象,如下所示:

流A

流B

* 1 备注

但是,如果我streamA从上面的peerConnectionand addStream(streamB)like 中删除,似乎什么也没有发生。

以下按预期工作(两端的流被删除并重新添加)

peerConnection.removeStream(streamA) // __o_j_sep...
peerConnection.addStream(streamA) // __o_j_sep...

更多细节

我已经找到这个例子是“相反的”(从屏幕捕捉切换到带摄像头的音频/视频),但无法发现显着差异。

RTCPeerConnection对象实际上是由这里提供的这个peerConnection SIPML 源代码创建的。我像这样访问它:

var peerConnection = stack.o_stack.o_layer_dialog.ao_dialogs[1].o_msession_mgr.ao_sessions[0].o_pc

(是的,这看起来不对,但没有官方方法可以访问对等连接,请参阅此处的讨论)和此处

最初我试图只是(交换)将 videoTracks 更改streamAstreamB. 请参阅此处的问题。有人建议我应该尝试重新协商对等连接(通过删除/添加流到它),因为 addTrack 不会触发re-negotiation

我也在这里寻求帮助,但维护人员似乎很忙,还没有机会回复。


* 1备注:为什么没有streamB属性videoTracks?流在 HTML<video>元素中播放,似乎“工作”。这是我得到它的方法:

navigator.webkitGetUserMedia({
  audio: false,
  video: {
    mandatory: {
      chromeMediaSource:  'desktop',
      chromeMediaSourceId: streamId,
      maxWidth: window.screen.width,
      maxHeight: window.screen.height
      //,   maxFrameRate: 3
    }
  }
  // success callback
}, function(localMediaStream) {
  SSTREAM = localMediaStream; //streamB

  // fail callback
}, function(error) {
  console.log(error);
});

它似乎也有一个videoTrack

streamB 的 videoTrack

我在跑:

  • OS X 10.9.3
  • Chrome 版本 35.0.1916.153
4

2 回答 2

11

要回答您的第一个问题,在活动对等连接中修改 MediaStream 时,对等连接对象将触发一个onnegotiationneeded事件。您需要处理该事件并重新交换您的 SDP。这背后的主要原因是双方都知道他们之间正在发送哪些流。交换 SDP 时,会包含 mediaStream ID,如果有新 ID 的新流(所有其他条件相同的事件),则必须重新协商。

对于你的第二个问题(关于SSTREAM)。它确实包含视频轨道,但没有 videotrack 属性webkitMediaStreams。但是,您可以通过他们的 ID 抓取曲目。

由于每种媒体类型都可能有许多轨道,因此视频轨道或音频轨道没有单一属性,而是一个数组。该.getVideoTracks()调用返回当前 videoTrack 的数组。因此,您可以通过指示其索引来抓取特定的视频轨道.getVideoTracks()[0]

于 2014-06-17T15:54:22.567 回答
1

我做了类似的事情,在单击一个按钮时,我删除了活动流并添加了另一个。

我就是这样做的,它对我很有效,

_this.rtc.localstream.stop();
_this.rtc.pc.removeStream(_this.rtc.localstream);

gotStream = function (localstream_aud){
var constraints_audio={
    audio:true
   }

_this.rtc.localstream_aud = localstream_aud;
_this.rtc.mediaConstraints= constraints_audio;   
_this.rtc.createOffer();
}
getUserMedia(constraints_audio, gotStream);

gotStream = function (localstream){
var constraints_screen={
        audio:false,
        video:{
            mandatory:{
                chromeMediaSource: 'screen'
            }
        }
    }
  _this.rtc.localstream = localstream;
  _this.rtc.mediaConstraints=constraints_video;


  _this.rtc.createStream();  
  _this.rtc.createOffer();
}
getUserMedia(constraints_video, gotStream);

Chrome 不允许音频与“屏幕”一起使用,因此我为它创建了一个单独的流。您需要执行相反的操作才能切换回旧视频流或实际切换到您想要的任何其他流。

希望这可以帮助

于 2014-09-17T13:47:07.893 回答