我希望能夠在與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