Я пытаюсь сделать приложение WebRT C p2p с socket.io в соответствии с курсом O'Reilly WebRT C. Первое, что нужно сделать, это инициализировать одноранговое соединение с конфигурацией сервера STUN:
var configuration = {
'iceServers': [{
'urls': 'stun:stun.l.google.com:19302'
}]
};
rtcPeerConn = new webkitRTCPeerConnection(configuration);
Следующая часть сигнализации запуска определяет несколько обработчиков, необходимых для установления соединения WebRT C. Когда это кандидат в лед, готовый к отправке равноправному узлу, запускается этот первый обработчик событий, и этот кандидат будет отправляться по каналу socket.io всем, кто на нем.
// send any ice candidates to the other peer
rtcPeerConn.onicecandidate = function (evt) {
if (evt.candidate)
io.emit('signal',{"user_type":"signaling", "command":"icecandidate", "user_data": JSON.stringify({ 'candidate': evt.candidate })});
console.log("completed sending an ice candidate...");
};
Следующий обработчик должен создать предложение, когда одноранговое соединение сообщает, что оно готово к переговорам
// let the 'negotiationneeded' event trigger offer generation
rtcPeerConn.onnegotiationneeded = function () {
console.log("on negotiation called");
rtcPeerConn.createOffer(sendLocalDesc, logError);
};
Полный код:
io.on('signal', function(data) {
if (myUserType == "manager") {
// here is checking user type customer/manager and show the elements for this user type
}
// ... //
else if (data.user_type == 'signaling') {
if (!rtcPeerConn) startSignaling();
var message = JSON.parse(data.user_data);
if (message.sdp) {
rtcPeerConn.setRemoteDescription(new RTCSessionDescription(message.sdp), function () {
// if we received an offer, we need to answer
if (rtcPeerConn.remoteDescription.type == 'offer') {
rtcPeerConn.createAnswer(sendLocalDesc, logError);
}
}, logError);
}
else {
rtcPeerConn.addIceCandidate(new RTCIceCandidate(message.candidate));
}
}
});
Создать RTCPeerConnection:
function startSignaling() {
console.log("starting signaling...");
rtcPeerConn = new webkitRTCPeerConnection(configuration);
// send any ice candidates to the other peer
rtcPeerConn.onicecandidate = function (evt) {
if (evt.candidate)
io.emit('signal',{"user_type":"signaling", "command":"icecandidate", "user_data": JSON.stringify({ 'candidate': evt.candidate })});
console.log("completed sending an ice candidate...");
};
// let the 'negotiationneeded' event trigger offer generation
rtcPeerConn.onnegotiationneeded = function () {
console.log("on negotiation called");
rtcPeerConn.createOffer(sendLocalDesc, logError);
};
// once remote stream arrives, show it in the main video element
rtcPeerConn.onaddstream = function (evt) {
console.log("going to add their stream...");
mainVideoArea.srcObject = evt.stream;
};
// get a local stream, show it in our video tag and add it to be sent
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
navigator.getUserMedia({
'audio': false,
'video': true
}, function (stream) {
console.log("going to display my stream...");
smallVideoArea.srcObject = stream;
rtcPeerConn.addStream(stream);
}, logError);
}
function sendLocalDesc(desc) {
rtcPeerConn.setLocalDescription(desc, function () {
console.log("sending local description");
io.emit('signal',{"user_type":"signaling", "command":"SDP", "user_data": JSON.stringify({ 'sdp': rtcPeerConn.localDescription })});
}, logError);
}
Почему удаленное видео не отображается? Если кто-нибудь знает, как исправить код из этого курса, я был бы очень признателен