티스토리 뷰
WebRTC 3가지 주요기능
- MediaStream
- 카메라, 마이크 등의 데이터 스트림 접근
- RTCPeerConnection
- 암호화, 대역폭 관리 및 오디오/비디오 연결
- RTCDataChannel
- 일반적인 데이터의 P2P통신
ICE (Interactive Connectivity Establishment)
- 두 Peer간 데이터 송수신시 최적의 경로를 찾아주는 프레임워크
- 두 Peer간 연결 테스트를 위해 SDP를 이용해 미디어 패킷을 보내 연결 가능한지 확인 함
ICE Candidate
- STUN, TURN 서버를 이용해 얻어낸 IP주소, 프로토콜, 포트의 조합으로 구성된 네트워크 주소들
- private IP , 포트번호
- public IP, 포트번호 (STUN, TURN 서버에서 구해옴)
- TURN 서버의 IP, 포트번호 (TURN 서버에서 구해옴)
ICE를 이용해 P2P 통신할수 있는 주소 후보(ICE Candidate)들을 찾고, 정보들을 주고받게 해줘야 하는데 이때 사용하는게 SDP
SDP(Session Description Protocol)
해상도, 형식, 코덱, 암호화등 멀티미디어 컨텐츠 연결을 설명하기 위한 표준.
두 peer간 다른 한쪽이 데이터가 전송되고 있다는걸 알게 해줌.
구조
SDP는 한줄 이상의 UTF-8 텍스트로 구성 되어있음.
등호기호(”=”) 를 기준으로,
좌측: letter-lines
우측: 포맷에 맞게 값이나 설명이 적혀있음.
예)
v=0 /// 프로토콜 버전
o=- 6137031273746274589 2 IN IP4 127.0.0.1 /// SDP를 생성한 Peer의 식별자
/// (유저이름), sessionId, sessionVersion, network type, address type, unicast address
s=- /// 세션이름 (여기선 생략)
t=0 0 /// 세션이 활성화 됐을 시간 (좌측: start time / 우측: end time 세션만료없이 영구적)
a=group:BUNDLE audio video data ///미디어 라인들 간 관계 (오디오, 비디오, 데이터채널 사용)
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 126 /// 미디어라인
/// 미디어타입, 포트번호, 프로토콜, 코덱 프로파일 번호 (peer간 협상과정에 번호. 코덱이 상호 간 가능한지 확인하고 실패시 순서대로 적용)
/// ...
SDP Offer ↔ Answer 흐름
Device A
- getUserMedia() 로 미디어 캡처
- RTCPeerConnection 생성, RTCPeerConnection.addTrack() 호출 (addStream deprecated)
- RTCPeerConnection.createOffer() 메서드로 offer를 생성
- RTCPeerConnection.setLocalDescription() 메서드로 offer를 localDescription으로 설정
- setLocalDescription() 호출 후, Ice candidates를 STUN 서버에 요청
- 시그널링 서버(AWS)를 이용해 Device B에 Offer를 전송
Device B
- Device A의 Offer 를 수신
- RTCPeerConnection.setRemoteDescription()호출해서 remoteDescription 기록
- 호출 종료시, local media 캡처, 각 mediaTrack을 RTCPeerConnection.addTrack()을 통해 peer connection에 연결
- RTCPeerConnection.createAnswer() 메서드로 answer 생성
- RTCPeerConnection.setLocalDescription() 으로 생성된 answer에 localDescription을 설정
- 시그널링 서버를 사용해 Device A에 answer를 전달
Device A
- answer을 받고
- RTCPeerConnection.setRemoteDescription() 호출로 answer를 remoteDescription으로 설정
- 이제 Device A ↔ Device B 서로의 구성을 모두 알 수 있음.
요약 짤
위의 과정을 Signaling 이라고 합니다.
즉, RTCPeerConnection 통신에 사용할 프로토콜, 채널, 미디어 코덱, 데이터 전송방법, 라우팅 정보, NAT 통과방법을 포함한 통신 규격을 교환하기 위해 두 장치의 제어 정보를 교환하는 과정을 말합니다.
Signaling은 WebRTC자체에서 지원하는 기능이 아니라
Signaling 서버를 직접 만들거나, 외부 솔루션을 이용해 적용할 수 있습니다.
직접 구축한다면 WebSocket이나,
XHR/XMLHttpRequest (.NET, PHP용),
대표적으로 아마존의 KVS(Kinesis Video Stream)이 있습니다.
ICE Trickle
보통 각 Peer(기기)는 ICE Candidate들을 수집해서 그 목록을 완성한 후 한꺼번에 교환하게 됩니다.
동기적으로 교환 하는 방식을 비동기적으로 교환하도록 하는 방식을 ICE Trickle 라고 합니다.
해당 기능은 옵션이며, 기본적으로는 동기적으로 처리합니다.
비동기적으로 처리하다 보니 두 Peer 간 연결이 더 빠르고, 최적화된 경로를 계속해서 찾아낼 수 있겠죠!
'iOS' 카테고리의 다른 글
[iOS] 화면회전 감지 및 스트리밍화면 방향설정 (RTCCameraVideoCapturer) (2) | 2024.01.07 |
---|---|
[iOS] 비디오 플레이어 닫힘 감지 (9) | 2023.12.23 |
[iOS] Localization - 다국어 지원 (0) | 2023.05.16 |
[iOS]긴급심사 요청 (0) | 2023.05.07 |
[Swift] required init, super init (0) | 2023.04.20 |
- Total
- Today
- Yesterday
- RTCCameraVideoCapturer
- 2023년 회고
- swift 고차함수
- CS 네트워크
- Swift 내림차순
- swift protocol
- 원티드 프리온보딩
- swift property
- Swift init
- Swift Leetcode
- Swift 프로퍼티
- swift programmers
- Swift joined()
- removeLast()
- Swift inout
- swift reduce
- iOS error
- Swift joined
- Swift ModernRIBs
- RIBs tutorial
- Swift final
- swift (programmers)
- Combine: Asynchronous Programming with Swift
- ios
- Swift Error Handling
- Swift
- Class
- Swift 프로그래머스
- Swift RIBs
- Swift 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |