首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变MediaStream of RTCPeerConnection

改变MediaStream of RTCPeerConnection
EN

Stack Overflow用户
提问于 2014-06-16 08:35:17
回答 2查看 10.1K关注 0票数 20

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

代码语言:javascript
复制
peerConnection.removeStream(streamA) // __o_j_sep... in Screenshots below
peerConnection.addStream(streamB)  // SSTREAM in Screenshots below
  • streamA是来自我的相机和麦克风的视频/音频流。
  • streamB是我从分机处得到的画面。
  • 它们都是如下所示的MediaStream对象:

*1评论

但是,如果我把streamA peerConnection addStream(streamB) 中删除,像上面那样,似乎什么都不会发生。

以下工作按预期进行(移除两端的流并重新添加)

代码语言:javascript
复制
peerConnection.removeStream(streamA) // __o_j_sep...
peerConnection.addStream(streamA) // __o_j_sep...

更多细节

我已经找到了这个例子,它做的是“相反的”(从屏幕截图切换到带摄像头的音频/视频),但是找不到明显的差别。

peerConnection RTCPeerConnection对象实际上是由这个SIPML库 源代码可在此获得创建的。我是这样访问的:

代码语言:javascript
复制
var peerConnection = stack.o_stack.o_layer_dialog.ao_dialogs[1].o_msession_mgr.ao_sessions[0].o_pc

(是的,这看起来不对,但是没有正式的方式来访问对等连接见这里的讨论)和这里

最初,我试图将videoTracks of streamA改为videoTrack of streamB见这里的问题。有人建议我尝试重新协商对等连接(通过移除/添加流到它),因为addTrack不触发再谈判

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

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

代码语言:javascript
复制
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

我在跑:

  • OS X 10.9.3
  • Chrome版本35.0.1916.153
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 15:54:22

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

关于你的第二个问题(关于SSTREAM)。它确实包含视频轨道,但是webkitMediaStreams没有视频跟踪属性。不过,你可以通过他们的身份证找到踪迹。

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

票数 11
EN

Stack Overflow用户

发布于 2014-09-17 13:47:07

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

我就是这样做的,它对我来说是完美的,

代码语言:javascript
复制
_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不允许音频和“屏幕”一起使用,所以我为它创建了一个单独的流。您将需要做相反的,以切换回您的旧视频流或实际上任何其他流您想要。

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24239522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档