如何在调用中交换webrtc中的摄像头源(javascript API)

如何在调用中交换webrtc中的摄像头源(javascript API),javascript,webrtc,Javascript,Webrtc,在iOS上,我可以做到: // set a new camera id cameraId = ([cameraId isEqualToString:frontCameraId]) ? backCameraId : frontCameraId; // determine if the stream has a video track BOOL hasActiveVideoTrack = ([self.localMediaStream.videoTracks count] > 0); //

在iOS上,我可以做到:

// set a new camera id
cameraId = ([cameraId isEqualToString:frontCameraId]) ? backCameraId : frontCameraId;

// determine if the stream has a video track
BOOL hasActiveVideoTrack = ([self.localMediaStream.videoTracks count] > 0);

// remove video track from the stream
if (hasActiveVideoTrack) {
    [self.localMediaStream removeVideoTrack:self.localVideoTrack];
}

// remove renderer from the video track
[self.localVideoTrack removeRenderer:self.localVideoView];

// re init the capturer, video source and video track
localVideoCapturer = nil;
localVideoSource = nil;
localVideoCapturer = [RTCVideoCapturer capturerWithDeviceName:cameraId];
localVideoSource = [peerConnectionFactory videoSourceWithCapturer:localVideoCapturer constraints:mediaConstraints];

// create a new video track
self.localVideoTrack = [peerConnectionFactory videoTrackWithID:@"ARDAMSv0" source:localVideoSource];
[self.localVideoTrack addRenderer:self.localVideoView];

// add video track back to the stream
if (hasActiveVideoTrack) {
    [self.localMediaStream addVideoTrack:self.localVideoTrack];
}
在前后摄像头之间切换。我可以在通话中调用上述代码,遥控器将短暂停止接收帧,然后继续接收帧,但现在是从另一个摄像头接收帧。如何在javascript中实现同样的功能?你没有像我在iOS中那样专门创建视频跟踪,那么我如何告诉流使用不同的摄像设备而不启动新呼叫呢?

这是一项实验性技术


WebRTC Javascript代码示例包含相机选择示例:

github上提供了源代码:


使用媒体设备获取视频|音频源。枚举设备(在chrome和firefox上)

  • 支持MediaDevices.enumerateDevices()


这是一项实验技术


WebRTC Javascript代码示例包含相机选择示例:

github上提供了源代码:


使用媒体设备获取视频|音频源。枚举设备(在chrome和firefox上)

  • 支持MediaDevices.enumerateDevices()



很抱歉,我应该指定我正在尝试在通话中更改摄像头设备,我们的应用程序在通话视图中有一个按钮来更改摄像头设备,我们希望在web客户端中使用相同的功能。在所有这些链接中,我找不到任何关于如何在通话中更改摄像头设备的示例,只有如何在呼叫getUserMedia之前选择设备。不用担心,您的问题很好,我在上找到了这个问题,以便回答您的问题谢谢,我会查看它注意到这个链接我更喜欢不需要重新协商的东西(比如iOS示例),但我想现在就可以了,谢谢你的帮助。对不起,我应该在电话中指定我正在尝试更改摄像头设备,我们的应用程序在“通话”视图中有一个按钮,用于更改摄像头设备,我们希望在web客户端中具有相同的功能。在所有这些链接中,我找不到任何关于如何在通话中更改摄像头设备的示例,只有如何在呼叫getUserMedia之前选择设备。不用担心,您的问题很好,我在上找到了这个问题,以便回答您的问题谢谢,我会查看它注意到这个链接,我更喜欢不需要重新协商的东西(比如iOS示例),但我想现在就可以了,谢谢你的帮助。如果你只想在前后摄像头之间切换,你可以使用。如果你只想在前后摄像头之间切换,你可以使用。
navigator.mediaDevices.enumerateDevices =
        navigator.mediaDevices.enumerateDevices || function() {
          return new Promise(function(resolve) {
            var infos = [
              {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},
              {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}
            ];
            resolve(infos);
          });
        };

    if (browserDetails.version < 41) {
      // Work around http://bugzil.la/1169665
      var orgEnumerateDevices =
          navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);
      navigator.mediaDevices.enumerateDevices = function() {
        return orgEnumerateDevices().then(undefined, function(e) {
          if (e.name === 'NotFoundError') {
            return [];
          }
          throw e;
        });
      };
    }
  }
_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);