我想从音频/视频流改为“屏幕共享”流:
peerConnection.removeStream(streamA) // __o_j_sep... in Screenshots below
peerConnection.addStream(streamB) // SSTREAM in Screenshots belowstreamA是来自我的相机和麦克风的视频/音频流。streamB是我从分机处得到的画面。


*1评论
但是,如果我把streamA 从 peerConnection 和 addStream(streamB) 中删除,像上面那样,似乎什么都不会发生。
以下工作按预期进行(移除两端的流并重新添加)
peerConnection.removeStream(streamA) // __o_j_sep...
peerConnection.addStream(streamA) // __o_j_sep...更多细节
我已经找到了这个例子,它做的是“相反的”(从屏幕截图切换到带摄像头的音频/视频),但是找不到明显的差别。
peerConnection RTCPeerConnection对象实际上是由这个SIPML库 源代码可在此获得创建的。我是这样访问的:
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>元素中播放,看起来“工作”。我就是这样得到它的:
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

我在跑:
发布于 2014-06-17 15:54:22
要回答您的第一个问题,在一个活动的对等连接中修改MediaStream时,对等连接对象将触发一个onnegotiationneeded事件。您需要处理该事件并重新交换SDP。这背后的主要原因是让双方都知道他们之间正在发送什么流。当交换mediaStream ID时,如果有一个具有新ID的新流(所有其他条件相同的事件),则必须进行重新协商。
关于你的第二个问题(关于SSTREAM)。它确实包含视频轨道,但是webkitMediaStreams没有视频跟踪属性。不过,你可以通过他们的身份证找到踪迹。
由于每种媒体类型都有可能有多个音轨,因此视频音轨或音轨没有单一的属性,而是有一个这样的数组。.getVideoTracks()调用返回当前videoTracks的数组。因此,您可以通过指示其索引.getVideoTracks()[0]来获取特定的视频跟踪。
发布于 2014-09-17 13:47:07
我做类似的事情,在单击一个按钮时,我删除活动流并添加另一个。
我就是这样做的,它对我来说是完美的,
_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不允许音频和“屏幕”一起使用,所以我为它创建了一个单独的流。您将需要做相反的,以切换回您的旧视频流或实际上任何其他流您想要。
希望这能有所帮助
https://stackoverflow.com/questions/24239522
复制相似问题