Notice
Recent Posts
Recent Comments
Link
투케이2K
184. (TWOK/LOGIC) [Aws] 디바이스 기기 마스터 입장에서 peerConnection 이벤트 감지를 통해 WebRTC 에 연결 된 실제 뷰어 연결 및 해제 관리 로직 본문
투케이2K 로직정리
184. (TWOK/LOGIC) [Aws] 디바이스 기기 마스터 입장에서 peerConnection 이벤트 감지를 통해 WebRTC 에 연결 된 실제 뷰어 연결 및 해제 관리 로직
투케이2K 2026. 5. 6. 20:14728x90
반응형
[로직 정리]
정리 로직 : AWS / KVS / WebRTC
제 목 : [Aws] 디바이스 기기 마스터 입장에서 peerConnection 이벤트 감지를 통해 WebRTC 에 연결 된 실제 뷰어 연결 및 해제 관리 로직

[설 명]
// --------------------------------------------------------------------------------------
[사전) 설정 및 정보 확인 사항]
// --------------------------------------------------------------------------------------
1. 제 목 : [Aws] 디바이스 기기 마스터 입장에서 peerConnection 이벤트 감지를 통해 WebRTC 에 연결 된 실제 뷰어 연결 및 해제 관리 로직
2. 테스트 환경 : Aws / Kvs / WebRTC
3. 사전) 👉 AWS KVS WebRTC 설명 :
>> WebRTC 란 웹, 애플리케이션, 디바이스 간 중간자 없이 오디오나 영상 미디어를 포착하고 실시간 스트림할 뿐 아니라, 임의의 데이터도 교환할 수 있도록 하는 기술입니다
>> WebRTC 는 간단한 API 를 통해 웹 브라우저, 모바일 애플리케이션 및 커넥티드 디바이스 간에 실시간 통신을 활성화할 수 있습니다
>> WebRTC 주요 용어 :
- SDP (Session Description Protocol) : 오디오/비디오 코덱, 해상도, 포트 등 스트리밍 정보를 담은 텍스트 포맷
- Offer / Answer : 통신 연결을 협상하기 위한 SDP 메시지 (초기 연결 설정)
- ICE (Interactive Connectivity Establishment) : NAT/P2P 환경에서도 연결 가능한 경로(IP, 포트 등)를 찾기 위한 기술
- Candidate : 가능한 연결 경로 (IP + Port 조합)
>> WebRTC [ICE] 연결 형태 :
- Relayed Address : TURN 서버가 패킷 릴레이를 위해 할당하는 주소
- Server Reflexive Address : NAT 가 매핑한 클라이언트의 공인망 (Public IP, Port)
- Local Address : 클라이언트의 사설주소 (Private IP, Port)
>> WebRTC STUN 및 TURN 서버 설명 :
- (같은 와이파이 망) STUN 서버는 HOST 를 거쳐 >> Server Reflexive Address 만을 응답하지만,
(릴레이서버 사용) TURN 서버는 Relayed Address와 Server Reflexive Address 를 모두 응답한다
- STUN, TURN 서버를 이용해 SDP Answer IP주소 를 취득 >> RTCPeerConnection Remote 연결 수행
>> WebRTC SDP 오퍼 생성 (뷰어) 및 응답 (마스터) 스트리밍 플로우 :
[Viewer → Signaling Server] -- SDP Offer --> [Master] : 뷰어는 마스터로 스트리밍 오퍼 신호 보낸다
[Master] -- SDP Answer --> [Viewer] : 마스터는 특정 뷰어의 오퍼 신호 확인 후 응답을 보낸다
[Viewer] -- ICE Candidate --> [Master] : 스트리밍을 할 수 있는 경로 확인
[Master] -- ICE Candidate --> [Viewer] : 스트리밍을 할 수 있는 경로 확인
P2P 연결 성립 → 스트리밍 시작
4. 사전) 👉 자바스크립트 AWS Kvs WebRTC 사용 라이브러리 의존성 부여 코드 첨부 :
<script src="https://code.jquery.com/jquery-latest.min.js"></script>-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/spin.js/2.3.2/spin.js"></script>
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<script src="https://unpkg.com/amazon-kinesis-video-streams-webrtc/dist/kvs-webrtc.min.js"></script>
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.1416.0.min.js"></script>
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[로직 설명]
// --------------------------------------------------------------------------------------
1. ✅ (중요) WebRTC peerConnection.connectionState 상태 간략 정리 :
>> peerConnection.connectionState 란 WebRTC 연결 전체 상태 (통합 상태 머신) 감지 콜백 리스너 입니다.
>> peerConnection.connectionState 는 마스터 입장에서 뷰어의 연결 완료 여부 판단용으로 가장 적합하게 사용할 수 있습니다.
>> peerConnection.connectionState 주요 상태 :
- new 상태 : PeerConnection이 생성됨 / Viewer 가 아직 접속 안 함 상태
- connecting 상태 : 연결을 구성 중 상태 (ICE candidate 교환, ICE 후보 체크, DTLS Handshake, SRTP 세션 준비)
- connected 상태 : Viewer 가 연결이 완료되었으며, Video/Audio 전송 시작 및 Viewer가 실제로 화면을 보기 시작
- disconnected 상태 : 일시적으로 네트워크가 끊김 상태 (재연결 가능성 있음) / disconnected 가 발생 후 연결 된 뷰어가 종료 될 수도 있지만, 잠시 기다리면 다시 connected 로 돌아올 수 있는 상태
- failed 상태 : 복구 불가한 연결 실패 상태 / Viewer 세션 실패 상태로 PeerConnection 재생성 필요
- closed 상태 : PeerConnection 이 명시적으로 닫힘 상태 ( ex : pc.close(); ) / Viewer 종료 처리 완료 상태
2. 디바이스 기기는 WebRTC 객체 생성 완료 및 Viewer 의 접속 대기 상태 중 ..
3. 디바이스 기기는 signalingClient.on('sdpOffer') 이벤트 처리 부분에서 실제 WebRTC 에 연결 된 뷰어 관리 로직 수행
// ✅ Viewer 연결 객체 관리를 위한 전역 변수 선언
const peerConnections = new Map();
// ✅ [Viewer 의 SDP Offer 수신 대기]
signalingClient.on('sdpOffer', async (offer, remoteClientId) => {
// [RTCPeerConnection 만들기]
const peerConnection = new RTCPeerConnection(config);
// [미디어 스트림 추가]
localStream.getTracks().forEach(track => peerConnection.addTrack(track, localStream)); // [카메라 스트림 트랙에 추가]
// [peerConnection remoteClientId 지정]
peerConnection.onicecandidate = event => {
if (event.candidate) {
signalingClient.sendIceCandidate(event.candidate, remoteClientId);
}
};
// [상대방 오퍼를 내 Remote 에 추가]
await peerConnection.setRemoteDescription(offer);
// [Answer 옵션 지정 및 생성]
const answer = await peerConnection.createAnswer();
// [Answer 를 내 local 로 저장]
await peerConnection.setLocalDescription(answer);
// [SDP Answer 응답 전송]
signalingClient.sendSdpAnswer(peerConnection.localDescription, remoteClientId); // [접속 시도한 기기 아이디를 지정해 줘야함]
console.log("=========================================");
console.log("[setSystem] : [로컬 <-> 원격 연결 신호 확인] : [signalingClient] : [sdpOffer] : [Start]");
console.log("-----------------------------------------");
console.log("[VIEWER] Received SDP Offer from Viewer : ", remoteClientId);
console.log("-----------------------------------------");
console.log("[설 명] : 뷰어 SDP Offer 확인 및 Answer 응답 전송 수행");
console.log("=========================================");
// --------------------------------------------
// ✅ [RTCPeerConnection 해제 상태 감지를 위한 이벤트 리스너 등록]
// --------------------------------------------
// [클로저로 remoteClientId 캡처] : 다중 뷰어 상태 동시 감지
// --------------------------------------------
(function(id) {
peerConnection.onconnectionstatechange = () => {
console.log("=========================================");
console.log(`[peerConnection Connection state] : ${peerConnection.connectionState}`);
console.log("--------------------------------------");
console.log(`뷰어 Client ID : ${id}`);
console.log("=========================================");
if (peerConnection.connectionState === 'connected') { // 연결 완료 된 상태
console.log('[peerConnection Connection Viewer] : [connected]');
peerConnections.set(id, peerConnection); // ✅ 뷰어 추가 수행
}
if (peerConnection == null
|| peerConnection.connectionState === 'disconnected'
|| peerConnection.connectionState === 'failed'
|| peerConnection.connectionState === 'closed') { // 피어 연결 해제 상태 감지
console.log('[peerConnection Connection Viewer] : [disconnected]');
// [여기서 리소스 정리 및 UI 업데이트]
try {
peerConnections.delete(id); // ✅ 뷰어 삭제 수행
}
catch (error) {
console.error("[peerConnection.onconnectionstatechange] : [Exception] : ", error.message);
}
}
};
})(remoteClientId)
});
4. ✅ 필요 시점에 특정 뷰어 연결 상태 확인 수행
const pc = peerConnections.get('viewer-123'); // 특정 뷰어 아이디 지정 및 객체 확인
const isConnected = pc && (pc.connectionState === 'connected' || pc.iceConnectionState === 'connected');
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------
▶️ [Aws Kinesis Video Streams] WebRTC peerConnection.connectionState 뷰어 연결 상태 감지 설명
https://kkh0977.tistory.com/8782
https://blog.naver.com/kkh0977/224260331927
▶️ [android] 안드로이드 AWS KVS WebRTC 실시간 비디오 재생 뷰어 로직 정리 - google-webrtc
https://kkh0977.tistory.com/8771
https://blog.naver.com/kkh0977/224254825523
▶️ [Aws Kinesis Video Streams] IceServer ICE 서버 리스트 와 ICE_CANDIDATE ICE 캔디 데이트 설명 정리
https://kkh0977.tistory.com/8772
https://blog.naver.com/kkh0977/224254833429
▶️ [Aws Kinesis Video Streams] WebRTC onSignalingChange PeerConnection 내부의 SDP 상태 설명
https://kkh0977.tistory.com/8781
https://blog.naver.com/kkh0977/224260325153
▶️ [기능 개선] 자바스크립트 aws kvs webRtc 디바이스 마스터 영상 송출 시 뷰어 다중 접속 설정 - Multi PeerConnection
https://kkh0977.tistory.com/8057
https://blog.naver.com/kkh0977/223898870074?trackingCode=blog_bloghome_searchlist
▶️ [Web/JavaScript] AWS Kvs WebRtc 마스터 비디오 스트림 다중 뷰어 영상 송출
https://kkh0977.tistory.com/8058
https://blog.naver.com/kkh0977/223899701921?trackingCode=blog_bloghome_searchlist
// --------------------------------------------------------------------------------------
728x90
반응형
'투케이2K 로직정리' 카테고리의 다른 글
Comments
