RTCPeerConnection
to główny interfejs interfejsu WebRTC API. it
reprezentuje połączenie między lokalnym i zdalnym połączeniem peera i zapewnia obsługę
funkcji i zdarzeń niezbędnych do nawiązania połączenia.
Nawiązywanie połączenia z inną aplikacją
Aplikacje implementujące funkcje WebRTC w dużym stopniu polegają na
Interfejs RTCPeerConnection
. Po stronie rozmówcy (czyli
zainicjowanie połączenia), proces nawiązywania połączenia jest zwykle
:
- Utwórz nową instancję
RTCPeerConnection
za pomocą odpowiedniej platformy ICE konfiguracji. - Utwórz lokalny opis SDP za pomocą właściwości
RTCPeerConnection.createOffer()
. - Ustaw opis lokalnego SDP za pomocą
RTCPeerConnection.setLocalDescription()
- Przenieś lokalny opis SDP (przy użyciu usługi sygnalizacyjnej) na pilota w porównaniu z innymi wydawcami.
- Zarejestruj detektor zdarzeń
icecandidate
w:RTCPeerConnection
. - W przypadku każdego zdarzenia
icecandidate
przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnym peerem. - Poczekaj na przychodzący zdalny opis SDP z usługi sygnalizacji
ustaw go za pomocą funkcji
RTCPeerConnection.setRemoteDescription()
. - Poczekaj na przychodzących zdalnych kandydatów ICE z usługi sygnalizacji i dodaj
za pomocą
RTCPeerConnection.addIceCandidate()
Jeśli chodzi o odbiorcę, ten proces jest nieco inny.
- Utwórz nową instancję
RTCPeerConnection
za pomocą odpowiedniej platformy ICE konfiguracji. - Poczekaj na przychodzący zdalny opis SDP z usługi sygnalizacji
ustaw go za pomocą funkcji
RTCPeerConnection.setRemoteDescription()
. - Utwórz odpowiedź na opis zdalnego SDP, wywołując
RTCPeerConnection.createAnswer()
- Przekaż odpowiedź (korzystając z usługi sygnalizacji) do zdalnego peera.
- Zarejestruj detektor zdarzeń
icecandidate
w:RTCPeerConnection
. - W przypadku każdego zdarzenia
icecandidate
przenieś je (za pomocą usługi sygnalizacyjnej) do zdalnym peerem. - Poczekaj na przychodzących zdalnych kandydatów ICE z usługi sygnalizacji i dodaj
za pomocą
RTCPeerConnection.addIceCandidate()
Problem z tym interfejsem API polega na tym, że większość tych operacji jest asynchronicznych,
co często komplikuje faktyczną implementację aplikacji WebRTC.
Wiele funkcji zwraca wartość Promise
, którą należy rozwiązać, zanim funkcja
może kontynuować proces.
Zaleca się, aby przy implementowaniu aplikacji za pomocą tego interfejsu API
deweloper używa interfejsów async
i await
, zamiast rejestrować detektorów
(za pomocą Promise.then()
), co ułatwia śledzenie kodu. Rozważ
następujący przykład:
function createAndSendOffer(peerConnection, signallingService) {
peerConnection.createOffer()
.then(offer => {
signallingService.send({
type: 'offer',
data: offer
});
});
}
Po wpisaniu powyższego kodu za pomocą funkcji async
i await
otrzymujemy:
async function createAndSendOffer(peerConnection, signallingService) {
const offer = await peerConnection.createOffer();
signallingService.send({
type: 'offer',
data: offer
});
}