WebRTC:切换摄像头 [英] WebRTC: Switch camera

查看:55
本文介绍了WebRTC:切换摄像头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望能够在与WebRTC交谈的过程中切换摄像机,而无需重新协商呼叫。

假设我们有2个"mediaSources"对象,使用MediaStreamTrack.getSources方法:

{
    id: "id_source_1" | "id_source_2",
    facing: "user" | "environment",
    kind: "kind_1" | "kind_2",
    label: "label_1" | "label_2"
 }

我们以"source_1"(面向"user")开始调用,希望用户能够切换到"source_2"(面向"环境")。

在我的当前代码中,当用户单击"切换摄像头"按钮时,将执行以下命令:(callingSession是当前的WebRTC会话)

var mediaParams = {
       audio: true,
       video: { deviceId : source_2.id},
       options: {
           muted: true,
           mirror: true
       },
       elemId: 'localVideo'
};

callingSession.getUserMedia(mediaParams, function (error, stream) {
if (error) {
   console.error('error getting user media');
} else {
          var oldVideoTracks = callingSession.localStream.getVideoTracks();      
          var newVideoTracks = stream.getVideoTracks();

          if (oldVideoTracks.length > 0 && newVideoTracks.length > 0) {
               callingSession.localStream.removeTrack(oldVideoTracks[0]);
               callingSession.localStream.addTrack(newVideoTracks[0]);
          } 
       }
 });
如您所见,mediaParams约束现在设置为"source_2",我们将此mediaParams与新约束一起传递给getUserMedia方法。然后,我们将从旧的和新的流中获取视频轨道。

此代码中的主要问题是,即使将新的约束传递给getUserMedia方法,旧的流仍然与新的流完全相同,因此显然是相同的视频轨道,当然不会发生任何事情,摄像机也不会切换!

我是否在此代码中做错了什么?有什么方法可以在不重新协商WebRTC中的呼叫的情况下切换摄像机吗?applyConstraint()我看不到铬版的实验方法怎么样?

谢谢您。

更新 我的WebRTC应用程序是一个带CrossWalk的离子型应用程序=>Webview为Chrome

WebRTC

在撰写本文时,推荐答案specification非常有前途,但是该规范的实现因浏览器而异。目前,Chrome实现仍然很旧。不过,多亏了Jib的评论和这个SO answer以及对SDP (Session Description Protocol)的更多了解,我现在可以使用Chrome切换摄像头了。

首先,我的getUserMedia方法的约束是错误的,下面是我如何设法传递正确的约束:

var mediaParams = {
            // the other constraints
            video: {mandatory: {sourceId: source_2.id}}
            // ...
        };

使用mediaParams参数调用getUserMedia后,我们需要从对等连接中移除当前流,然后添加新的流,如下所示:

peerConnection.removeStream(peerConnection.getLocalStreams()[0]);
peerConnection.addLocalStream(stream);
这两行代码将触发peerConnection对象上的onnegotiationneeded,这意味着对等体1必须告诉对等体2他更改了流,因此他需要新的描述。这就是我们需要创建报价、设置新描述并将此新描述发送给对等方的原因:

peerConnection.createOffer()
.then(function (offer) {
      peerConnection.setLocalDescription(offer);
})
.then(function () {
      send(JSON.stringify({ "sdp": peerConnection.localDescription }));
});
在这一点上,您希望如何使用SDP由您决定。(在我的用例中,我必须使用WebSockets发送它们。)

一旦另一个对等方收到新的SDP,他就必须在自己的对等方连接中进行设置:

var obj = JSON.parse(answer).sdp;
peerConnection.setRemoteDescription(new RTCSessionDescription(obj));

我希望有一天这会对某人有所帮助。

这篇关于WebRTC:切换摄像头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆