Javascript WEBRTC——在通信中改变视频流 我的目标是使用WebRTC Web应用程序在视频或音频呼叫中间启用屏幕共享。
我发现我可以使用Javascript WEBRTC——在通信中改变视频流 我的目标是使用WebRTC Web应用程序在视频或音频呼叫中间启用屏幕共享。,javascript,google-chrome,video-streaming,webrtc,audio-streaming,Javascript,Google Chrome,Video Streaming,Webrtc,Audio Streaming,我发现我可以使用MediaStreamTrack.applyConstraints()来更改视频属性,但是可以更改视频源吗?进一步了解如何将视频添加到现有音频流 我现在只需要在chrome上使用这个 localStream.stop(); peerconnection.removeStream(localStream); 我通过以下步骤找到了解决方案 删除当前流 添加新流 创建新优惠 请注意,removeStream已被弃用,不再在规范中使用,并且不是在所有浏览器中都实现。这在Firefox中
MediaStreamTrack.applyConstraints()
来更改视频属性,但是可以更改视频源吗?进一步了解如何将视频添加到现有音频流
我现在只需要在chrome上使用这个
localStream.stop();
peerconnection.removeStream(localStream);
我通过以下步骤找到了解决方案
请注意,
removeStream
已被弃用,不再在规范中使用,并且不是在所有浏览器中都实现。这在Firefox中不起作用stream.stop()
也被弃用,取而代之的是stream.getTracks().forEach(track=>track.stop())
从今天起,我觉得对于您的情况,更好的方法是使用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);
最后两行为连接添加了视频和音频功能
假设您的屏幕流为“屏幕流”,则您可以从摄像头切换到屏幕共享视频,如下所示:
var screenVideoTrack = screenStream.getVideoTracks()[0];
videoSender.replaceTrack(screenVideoTrack);
不需要更换音轨,因为我们只想在保持音频输入不变的情况下改变视觉效果
使用这种方法的好处是不需要对等方重新协商来切换视频源
这种方法的另一个好处是,您不需要停止camStream。共享完屏幕后,您可以使用以下方式切换回视频源:
videoSender.replaceTrack(camStream.getVideoTracks()[0]);
您可以查看replaceTrack的文档
我有一个工作的webrtc会议解决方案,它支持使用这些类似的步骤进行屏幕共享和屏幕录制。你可以去看看
它可以在firefox上开箱即用,但要在chrome上运行,需要启用“实验Web平台”标志(转到chrome://flags/ )使用您的方法生成以下错误 代码如下:
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);
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);
},
结果是:
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)
将跟踪添加到localPeerConnection时获取rtpSender
然后更换您需要的任何曲目
rtpSender.setTrack(camVideoTrack,真)//用于摄像机视频跟踪
或
设置跟踪(screenShareTrack,true)//对于屏幕共享videoTrack,代码如下:
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);
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);
},
请注意,
removeStream
已被弃用,不再在规范中使用,并且不是在所有浏览器中都实现。这在Firefox中不起作用stream.stop()
也被弃用,取而代之的是stream.getTracks().forEach(track=>track.stop())
。谢谢jib。。我的目标是让它在chrome中运行,以备将来可能的复制