我希望能够在与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”(面向“用户”)的号召,我们希望用户能够切换到“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()
我无法在Chrome中看到它?
谢谢。
UPDATE 我的WebRTC应用是离子应用程式人行横道=> web视图是铬
我会隔离并确保您可以在本地首先同时查看两个摄像头(许多手机不允许在同一时间使用前后摄像头),然后再与对等连接进行混淆。另外,使用'video:{deviceId:{exact:source_2.id}}'强制约束。最后,'MediaStreamTrack.getSources'已被'navigator.mediaDevices.enumerateDevices'取代,所以试试。如果一切正常,请先尝试从对等连接中移除流,然后再重新添加。 – jib
@jib使用当前实现,我可以在本地切换源(也适用于移动设备)。我无法切换发送给对等体的流。 – dafriskymonkey
我不是Chrome上的专家(这在Firefox中不是问题,它支持'replaceTrack'),但是在Chrome中我认为你可能还需要[renegotiate](http://stackoverflow.com/questions/35504214/如何在媒体流中添加媒体流/ 35515536#35515536),你可以通过数据通道做到这一点,所以它将接近无缝。 – jib