【发布时间】:2016-12-31 18:26:18
【问题描述】:
我希望能够在与 WebRTC 通话的过程中切换摄像头,而无需重新协商通话。
假设我们有 2 个使用 MediaStreamTrack.getSources 方法的“mediaSources”对象:
{
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怎么看不到?
谢谢。
更新 我的 WebRTC 应用程序是带有人行横道的离子应用程序 => webview 是 chrome
【问题讨论】:
-
我会先隔离并确保您可以在本地同时查看两个摄像头(例如,许多手机不允许同时使用前置和后置摄像头),然后再搞乱对等连接。此外,使用
video: {deviceId: {exact: source_2.id}}强制约束。最后,MediaStreamTrack.getSources已被navigator.mediaDevices.enumerateDevices取代,所以试试吧。如果一切正常,请在弄乱之前尝试从对等连接中删除流,然后重新添加。 -
@jib 使用当前的实现,我可以在本地切换源(也适用于移动设备)。我无法切换发送到对等方的流。
-
我不是 Chrome 专家(这在支持
replaceTrack的 Firefox 中不是问题),但在 Chrome 中我认为你可能仍然需要 renegotiate,你可以重新做一个数据通道,所以它几乎是无缝的。 -
@jib 感谢提供非常有用的链接。我正在尝试使用数据通道重新协商。我可以用当前的 peerConnection 创建一个 offer,然后设置本地描述。仍然当我创建数据通道
peerConnection.createDataChannel时,它的状态永远不会打开。打开数据通道有什么额外的步骤吗? -
pc.createDataChannel与pc.addStream类似,因为您在 创建报价之前调用它。 Sample.
标签: webrtc