WebRTC:切换摄像头 [英] WebRTC: Switch camera
问题描述
我希望能够在与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屋!