Обработка треков и IceCandidates
This commit is contained in:
@@ -92,10 +92,27 @@ export function CallProvider(props : CallProviderProps) {
|
|||||||
* Другая сторона отправила нам ICE кандидата для установления WebRTC соединения
|
* Другая сторона отправила нам ICE кандидата для установления WebRTC соединения
|
||||||
*/
|
*/
|
||||||
const candidate = JSON.parse(packet.getSdpOrCandidate());
|
const candidate = JSON.parse(packet.getSdpOrCandidate());
|
||||||
|
console.info(candidate);
|
||||||
await peerConnectionRef.current?.addIceCandidate(new RTCIceCandidate(candidate));
|
await peerConnectionRef.current?.addIceCandidate(new RTCIceCandidate(candidate));
|
||||||
info("Received WebRTC ICE candidate and added to peer connection");
|
info("Received WebRTC ICE candidate and added to peer connection");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(signalType == WebRTCSignalType.OFFER){
|
||||||
|
/**
|
||||||
|
* SFU сервер отправил нам оффер, например при renegotiation, нам нужно его принять и
|
||||||
|
* отправить ответ (ANSWER)
|
||||||
|
*/
|
||||||
|
const sdp = JSON.parse(packet.getSdpOrCandidate());
|
||||||
|
await peerConnectionRef.current?.setRemoteDescription(new RTCSessionDescription(sdp));
|
||||||
|
let answer = await peerConnectionRef.current?.createAnswer();
|
||||||
|
await peerConnectionRef.current?.setLocalDescription(answer);
|
||||||
|
let answerSignal = new PacketWebRTC();
|
||||||
|
answerSignal.setSignalType(WebRTCSignalType.ANSWER);
|
||||||
|
answerSignal.setSdpOrCandidate(JSON.stringify(answer));
|
||||||
|
send(answerSignal);
|
||||||
|
info("Received WebRTC offer, set remote description and sent answer");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}, [activeCall, sessionKeys, callState]);
|
}, [activeCall, sessionKeys, callState]);
|
||||||
|
|
||||||
usePacket(26, async (packet: PacketSignalPeer) => {
|
usePacket(26, async (packet: PacketSignalPeer) => {
|
||||||
@@ -201,6 +218,34 @@ export function CallProvider(props : CallProviderProps) {
|
|||||||
{ urls: 'stun:stun.l.google.com:19302' }
|
{ urls: 'stun:stun.l.google.com:19302' }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* Подписываемся на ICE кандидат
|
||||||
|
*/
|
||||||
|
peerConnectionRef.current.onicecandidate = (event) => {
|
||||||
|
if(event.candidate){
|
||||||
|
let candidateSignal = new PacketWebRTC();
|
||||||
|
candidateSignal.setSignalType(WebRTCSignalType.ICE_CANDIDATE);
|
||||||
|
candidateSignal.setSdpOrCandidate(JSON.stringify(event.candidate));
|
||||||
|
send(candidateSignal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Соединение установлено, можно начинать звонок, переходим в активное состояние звонка
|
||||||
|
*/
|
||||||
|
peerConnectionRef.current.onconnectionstatechange = () => {
|
||||||
|
console.info("Peer connection state changed: " + peerConnectionRef.current?.connectionState);
|
||||||
|
if(peerConnectionRef.current?.connectionState == "connected"){
|
||||||
|
setCallState(CallState.ACTIVE);
|
||||||
|
info("WebRTC connection established, call is active");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
peerConnectionRef.current.ontrack = (event) => {
|
||||||
|
/**
|
||||||
|
* При получении медиа-трека с другой стороны
|
||||||
|
*/
|
||||||
|
console.info("TRACK RECV!!!!!");
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Запрашиваем Аудио поток с микрофона и добавляем его в PeerConnection, чтобы другая сторона могла его получить и воспроизвести,
|
* Запрашиваем Аудио поток с микрофона и добавляем его в PeerConnection, чтобы другая сторона могла его получить и воспроизвести,
|
||||||
* когда мы установим WebRTC соединение
|
* когда мы установим WebRTC соединение
|
||||||
|
|||||||
Reference in New Issue
Block a user