我的目标是使用webrtc网络应用程序在视频或音频通话中启用屏幕共享。
我发现我可以使用MediaStreamTrack.applyConstraints()
更改视频属性,但是可以更改视频源吗?还有更多我如何将视频添加到现有音频流。
我现在需要这个才能使用chrome。
答案 0 :(得分:3)
localStream.stop();
peerconnection.removeStream(localStream);
我能够通过以下步骤找到解决方案
删除当前流
添加新流
制作新优惠
请注意removeStream
已弃用,不再在规范中,也未在所有浏览器中实现。例如。这在Firefox中不起作用。 {I}也弃用了stream.stop()
答案 1 :(得分:1)
到目前为止,对于您的情况,我觉得更好的方法是使用RTCRtpSender.replaceTrack方法。
假设您的摄像机流是“ camStream”,则可以使用以下方法获取所需的RTCRtpSender对象:
var camVideoTrack = camStream.getVideoTracks()[0];
var camAudioTrack = camStream.getAudioTracks()[0];
var videoSender = peerConnection.addTrack(camVideoTrack, camStream);
var audioSender = peerConnection.addTrack(camAudioTrack, camStream);
...
最后两行将视频和音频功能添加到连接中。
...
假设您的屏幕流是“ screenStream”,那么您可以像这样从摄像头切换到屏幕共享视频:
var screenVideoTrack = screenStream.getVideoTracks()[0];
videoSender.replaceTrack(screenVideoTrack);
...
无需替换音轨,因为我们只对更改视觉效果感兴趣,同时保持音频输入不变。
使用这种方法的好处是不需要对等方重新协商即可切换视频源。
此方法的另一个好处是您不需要停止camStream。完成共享屏幕后,您可以使用以下方法切换回视频源:
videoSender.replaceTrack(camStream.getVideoTracks()[0]);
您可以查看replaceTrack here的文档
我有一个有效的webrtc会议解决方案,该解决方案支持使用这些类似步骤进行屏幕共享和屏幕录制。您可以查看here
它在firefox上是开箱即用的,但是要使其在chrome上运行,您需要启用“ Experimental Web Platform”标志(转到chrome:// flags /)
答案 2 :(得分:0)
使用你的方法产生以下错误
代码如下:
var camVideoTrack = options.attachStream.getVideoTracks()[0];
var camAudioTrack = options.attachStream.getAudioTracks()[0];
var videoSender = peer.addTrack(camVideoTrack, options.attachStream);
var audioSender = peer.addTrack(camAudioTrack, options.attachStream);
var videoTrack = stream.getVideoTracks()[0];
videoSender.replaceTrack(videoTrack);
结果:
adapter-latest.js:629 Uncaught (in promise) DOMException: Failed to execute 'addTrack' on 'RTCPeerConnection': A sender already exists for the track.
at RTCPeerConnection.addTrack (https://education.abc.dev:9559/adapter-latest.js:629:31)
答案 3 :(得分:0)
代码如下:
addMixedVideo: function(stream, peer) {
if (!stream) return;
var videoTrack = options.attachStream.getVideoTracks()[0];
var sender = peer.getSenders().find(function(s) {
return s.track.kind == videoTrack.kind;
});
console.log('addMixedVideo -- found sender: ', sender);
var videoTrackMixer = stream.getVideoTracks()[0];
sender.replaceTrack(videoTrackMixer);
},
答案 4 :(得分:-1)
获取 rtpSender,同时 addTrack 到 localPeerConnection
然后替换您需要的任何曲目
rtpSender.setTrack(camVideoTrack, true); //用于摄像头视频跟踪
或
rtpSender.setTrack(screenShareTrack, true); //用于屏幕共享 videoTrack