Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WEBRTC——在通信中改变视频流 我的目标是使用WebRTC Web应用程序在视频或音频呼叫中间启用屏幕共享。_Javascript_Google Chrome_Video Streaming_Webrtc_Audio Streaming - Fatal编程技术网

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中运行,以备将来可能的复制