π Preview
π κ°μ
λ°κ°μ΅λλ€.
WebRTC μ΄λ‘ μ μ΄μ΄μ νμ μ±ν μ€μ΅μ ν΄λ³΄λ €κ³ ν©λλ€.
[WebRTC] WebRTC μ°’μ΄λ²λ¦¬κΈ° - μ΄λ‘ μ 리
π κ°μλ°κ°μ΅λλ€. WebRTC κ΄λ ¨ κΈμ΄ μ μ 첫 ν¬μ€ν μ΄ λμλ€μ. μ΄ λ΄μ©μ μμ±νκ² λ λ°λ λλ¦μ κ³κΈ°κ° μμ΅λλ€. λΆνΈμΊ νμμ ν νλ‘μ νΈλ₯Ό μ§ννλ©΄μ, κΈ°λ₯ μꡬμ¬νμ λ§μ‘±μν€κΈ°
phellinus-linteus.tistory.com
ν΄λΉ κΈμ μ½κ³ μ€μ λ€λ©΄ μ€μ΅ μ½λλ₯Ό λ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
GitHub - BenchPress200/webrtc-tutorial: A WebRTC tutorial for learning peer-to-peer audio/video communication with custom signal
A WebRTC tutorial for learning peer-to-peer audio/video communication with custom signaling. - BenchPress200/webrtc-tutorial
github.com
μ€μ΅ μ½λλ λ‘컬νκ²½μμ μ€νν μ μμ΅λλ€.
READMEμ μμ€ μ½λ μ£Όμμ μμΈνκ² μμ±νμΌλ, λ³Έ κΈμμ λ λν μΌν μ€λͺ μ μ λ¬ν©λλ€.
Signalingμ ν¬ν¨νμ¬ λͺ¨λ μλ²μμ ν΅μ μ WebSocketμΌλ‘ μ§νν©λλ€.
κ°λ¨νκ² μ΄λ¦ μ λ ₯λ§μΌλ‘ κ°μ νλ©°, ν΄λΉ μ 보λ λ°±μλ μΈ‘ λ©λͺ¨λ¦¬μ μ μ₯λ©λλ€. ν΅ν μμ²μ ν΅ν΄μ κ°μ ν μ μ κ° νμμ±ν μ΄ κ°λ₯ν©λλ€.
μ΄λ² ν¬μ€ν μ ꡬμ±μ λ€μκ³Ό κ°μ΅λλ€.
- μ€ννκ²½ λ° μ ν리μΌμ΄μ ꡬ쑰
- μ€μ΅ μ½λ λ°λΌκ°κΈ°
- λ§μΉλ©°
βοΈ μ€ννκ²½ λ° μ ν리μΌμ΄μ ꡬ쑰
μ€μ΅ μ½λμ μ€ν νλ¦μ μ΄ν΄νκΈ° μν΄ WebRTCμ P2P μ°κ²° μ리λ₯Ό λμ§μ΄λ³΄κ³ νλ‘ νΈμλ μ½λμ λ°±μλ μ½λμ ꡬ쑰, μ£Όμ APIμ λμμ μ΄ν΄λ³΄κ² μ΅λλ€.
κΈ°μ μ€ν
- νλ‘ νΈμλ: TypeScript, React, Styled-component, Zustand, WebSocket, WebRTC
- λ°±μλ: Java, SpringBoot, WebSocket
νμ μ±ν μ μν P2P μ°κ²°κ³Όμ
λ λͺ μ μ μ κ° μκ³ , νμμ±ν μ μν P2P μ°κ²°μ립 κ³Όμ μ λ€μ ν λ² μ΄ν΄λ΄ μλ€.
Signaling κ³Όμ μ WebSocketμΌλ‘ μ§ννλ€κ³ κ°μ νκ² μ΅λλ€.
- λ±μ΄μ μ€ν°μ§λ°₯μ΄ Signaling Server μ WebSocket μ°κ²°
- λ±μ΄κ° Signaling Server λ‘ offer μ μ‘ (callerμ SDP)
- offer μ μ‘κ³Ό λμμ, λ³ΈμΈμ ICE Candidate μμ§ λ° μ μ‘
- STUN/TURN μλ²λ₯Ό μ¬μ©ν΄μ ICE Candidate μμ§
- μ€ν°μ§λ°₯μ΄ Signaling Server λ‘λΆν° λ±μ΄μ offer (callerμ SDP) μμ λ° μ€μ
- λ±μ΄μ SDP κ° μ€μ λλ©΄, λ±μ΄κ° 보λ΄κ³ μλ ICE Candidate μΆκ° λ° ν μ€νΈ μ§ν
- μ€ν°μ§λ°₯μ΄ Signaling Server λ‘ λ°μ offerμ λν answer μ μ‘ (calleeμ SDP)
- answer μ μ‘κ³Ό λμμ, λ³ΈμΈμ ICE Candidate μμ§ λ° μ μ‘
- STUN/TURN μλ²λ₯Ό μ¬μ©ν΄μ ICE Candidate μμ§
- λ±μ΄κ° Signaling Server λ‘λΆν° μ€ν°μ§λ°₯μ answer(calleeμ SDP) μμ λ° μ€μ
- μ€ν°μ§λ°₯μ SDP κ° μ€μ λλ©΄, μ€ν°μ§λ°₯μ΄ λ³΄λ΄κ³ μλ ICE Candidate μΆκ° λ° ν μ€νΈ μ§ν
- offerμ answer, ICE Candidate κ΅νμ΄ μλ£λκ³ μ μ μ°κ²° ν μ€νΈλ₯Ό λ§μ³€λ€λ©΄ νμμ±ν μ€λΉ μλ£
- νμμ±ν μμ
WebSocket λ©μμ§ κ΅¬μ‘°
{
"type" : λ©μμ§μ νμ
,
"sender" : λ³΄λΈ μ μ λλ€μ,
"receiver" : λ°μ μ μ λλ€μ,
"data" : any
}
μ JSONμ μνν λ©μμ§λ₯Ό μ£Όκ³ λ°κΈ°μν΄ μμλ‘ μ μν λ©μμ§ κ΅¬μ‘°μ λλ€.
κ° νλμ λν μ€λͺ μ λ€μκ³Ό κ°μ΅λλ€.
- type: μ΄λ€ λ©μμ§μΈμ§ νμ
μ λͺ
μν©λλ€.
- join: νμκ°μ
- activeUsers: νμ±μ μ λλ€μ 리μ€νΈ μ‘°ν
- call: ν΅ν μμ²
- acceptCall: κ±Έλ €μ¨ ν΅ν μλ½
- cancelCall: κ±Έλ €μ¨ ν΅ν κ±°μ
- hangUp: ν΅νμ’ λ£
- offer: offer λ©μμ§ μ μ‘
- answer: answer λ©μμ§ μ μ‘
- candidate: ICE Candidate λ©μμ§ μ μ‘
- sender: 보λ΄λ μ μ μ λλ€μμ λͺ μν©λλ€.
- receiver: λ°λ μ μ μ λλ€μμ λͺ μν©λλ€.
- data: κ° λ©μμ§ νμ μ λ°λΌμ νμν λ°μ΄ν°λ₯Ό ν λΉν©λλ€.
νλ‘ νΈμλ μ€ννλ¦
νμ΄μ§μ ν΄λΉνλ μ»΄ν¬λνΈκ° μΈ κ° μκ³ , WebSocket μ°κ²°μ Zustandλ₯Ό ν΅ν΄ μ μμΌλ‘ κ΄λ¦¬νκ³ μμ΅λλ€.
νμκ°μ λΆν° ν΅ν μ°κ²°κΉμ§ μμλλ‘ μ΄ν΄λ³΄κ² μ΅λλ€.
- Join νμ΄μ§
- μνλ μ΄λ¦μ μ λ ₯νμ¬ κ°λ¨νκ² κ°μ μ μ§νν μ μμ΅λλ€.
- μ€λ³΅ κ²μ¬μ ν΅κ³Όνμ¬ κ°μ μ μ±κ³΅νλ©΄ Home νμ΄μ§λ‘ μ΄λν©λλ€.
- Home νμ΄μ§
- κ°μ μ μ λͺ©λ‘μ μ€μκ°μΌλ‘ λ°μμ€λ©°, ν΅νμ€ μνκ° μλ μ μ μκ² ν΅νμμ²μ ν μ μμ΅λλ€.
- λν, λ€λ₯Έ μ μ μκ² ν΅ν μμ²μ΄ μ€λ©΄ μλ½ νΉμ κ±°μ ν μ μμ΅λλ€.
- ν΅νλ₯Ό μλ½νλ€λ©΄ Call νμ΄μ§λ‘ μ΄λν©λλ€.
- Call νμ΄μ§
ν΅ν μμ²μ ν μ μ λ caller, ν΅ν μμ²μ μλ½ν μ μ λ calleeλ‘μ ꡬλΆλ©λλ€.
Signalingμ μννκΈ° μν΄ λ€μκ³Ό κ°μ μ μ°¨λ₯Ό λ°λ¦ λλ€.- λ―Έλμ΄ μ€νΈλ¦Ό μ€μ - caller callee
- offer μμ± λ° μ μ‘ - caller
- offer μμ±λλ©΄, ICE Candidate μμ§ λ° μ μ‘
- offer μμ λ° μ€μ - callee
- offer μ€μ λλ©΄, λ°μ ICE Candidate μΆκ° μμ
- answer μμ± λ° μ μ‘ - callee
- answer μμ±λλ©΄, ICE Candidate μμ§ λ° μ μ‘
- answer μμ λ° μ€μ - caller
- answer μ€μ λλ©΄, λ°μ ICE Candidate μΆκ° μμ
- κ΅ννκ³ κ° νΌμ΄ μ 보μ μΆκ°νμλ ICE Candidate μ€μμ μ ν¨νκ³ κ°μ₯ μνν ν보λ₯Ό μ°Ύμλ€λ©΄ μ°κ²° μνκ° connected, νΉμ completedλ‘ μ λ°μ΄νΈ - caller callee
- νμ ν΅ν μμ
λ°±μλ μ€ννλ¦
λ°±μλμμλ WebSocket μ°κ²°μ μ²λ¦¬νκΈ° μν μ€μ κ³Ό νΈλ€λ¬κ° μ‘΄μ¬ν©λλ€.
λ©μμ§λ₯Ό μλ²λ‘ μ μ‘νμ λ νμ±νμ¬ νμ μ νμΈν ν ν΄λΉνλ μλΉμ€ λ‘μ§μ μνν©λλ€.
λ©μμ§ νμ μ λ°λ₯Έ λ‘μ§ μ²λ¦¬λ λ μ΄μ΄λ μν€ν μ²λ₯Ό λ°λ₯΄κ³ μμ΅λλ€.
κ° κ³μΈ΅μ μν μ λ€μκ³Ό κ°μ΅λλ€.
- presentation
- WebSocket μ°κ²°, ν΄μ , λ©μμ§ νμ μ λ°λ₯Έ μλΉμ€ ν΄λμ€μ λ©μλλ₯Ό νΈμΆν©λλ€.
- application
- WebSocket μ°κ²°, ν΄μ , λ©μμ§ νμ μ λ°λ₯Έ μ μ€μΌμ΄μ€λ₯Ό μ²λ¦¬ν©λλ€.
- domain
- application λ μ΄μ΄μμ νμλ‘νλ ν΅μ¬ λλ©μΈ λ‘μ§μ μνν©λλ€.
- μ μ μ μ΄λ¦κ³Ό μΈμ μ μ μ₯νλ ν΄μλ§΅μ ν΄λμ€ λ³μλ‘ κ΄λ¦¬ν©λλ€.
WebRTC μ£Όμ API
WebRTCμ P2P μ°κ²°μ νμν μ£Όμ APIλ₯Ό ν¨κ³Όμ μΌλ‘ λ€λ£¨κΈ° μν΄ μ»€μ€ν ν μ μμ±νμ΅λλ€.
κ·Έ μ€ μΌλΆ μ½λλ₯Ό ν¨κ» μ΄ν΄λ³΄κ² μ΅λλ€.
const peerConnection = new RTCPeerConnection();
peerConnection.ontrack = (event) => {}
peerConnection.onicecandidate = (event) => {}
peerConnection.oniceconnectionstatechange = (event) => {}
- new RTCPeerConnection()
- P2P ν΅μ μ μν WebRTC 컀λ₯μ κ°μ²΄λ₯Ό μμ±ν©λλ€.
- ontrack
- μλ peerλ‘λΆν° μ λ¬λ λ―Έλμ΄ νΈλ(μμ/μμ± λ±)μ μμ νμ λ μ€νλλ μ΄λ²€νΈ νΈλ€λ¬μ λλ€.
- onicecandidate
- ν보λ₯Ό λΉλκΈ°μ μΌλ‘ μμ§νκ³ νλ λ°κ²¬λ λλ§λ€ μ€νλλ μ΄λ²€νΈ νΈλ€λ¬μ λλ€.
- oniceconnectionstatechange
- ICE μ°κ²° μνκ° λ³κ²½λ λλ§λ€ νΈμΆλλ μ΄λ²€νΈ νΈλ€λ¬μ λλ€.
navigator.mediaDevices.getUserMedia()
- getUserMedia()
- λΈλΌμ°μ μμ λ―Έλμ΄ μ₯μΉ(μΉ΄λ©λΌ/λ§μ΄ν¬)λ₯Ό μ¬μ©μλ‘λΆν° κΆνμ μ»μ΄ μ κ·Όν©λλ€.
- λΉλκΈ°λ‘ λμνλ©°, MediaStream κ°μ²΄λ₯Ό λ°νν©λλ€.
peerConnection.createOffer()
peerConnection.createAnswer()
peerConnection.setLocalDescription()
peerConnection.setRemoteDescription()
peerConnection.addIceCandidate()
- createOffer()
- P2P μ°κ²°μ μμνλ callerκ° μλμκ² λ³΄λΌ SDPλ₯Ό μμ±ν©λλ€.
- Promise<RTCSessionDescriptionInit> κ°μ²΄λ₯Ό λ°νν©λλ€.
- createAnswer()
- offerλ₯Ό λ°μ calleeκ° μλ΅μ λ³΄λΌ SDPλ₯Ό μμ±ν©λλ€.
- λ§μ°¬κ°μ§λ‘, Promise<RTCSessionDescriptionInit> κ°μ²΄λ₯Ό λ°νν©λλ€.
- setLocalDescription()
- createOffer() λ createAnswer() λ‘ μμ±ν μκΈ° μμ μ SDP μ 보λ₯Ό μ€μ ν©λλ€.
- μ€μ μ΄ λ μ΄νμ ICE Candidate μμ§μ΄ μμλ©λλ€.
- setRemoteDescription()
- μλλ°©μΌλ‘λΆν° λ°μ SDP (offer λλ answer) μ 보λ₯Ό μ€μ ν©λλ€.
- μ€μ μ΄ λ μ΄νμ μλκ° λ³΄λΈ ICE Candidateλ₯Ό λ±λ‘ν μ μμ΅λλ€.
- addIceCandidate()
- μλλ°©μ΄ λ³΄λ΄μ€ ICE Candidate ν보λ₯Ό λ±λ‘ν©λλ€.
μ ν리μΌμ΄μ μ ꡬ쑰λ₯Ό μ΄ν΄λ΄€μΌλ, μ΄μ μ€μ΅μΌλ‘ λμ΄κ° λ΄ μλ€ !
π μ€μ΅ μ½λ λ°λΌκ°κΈ°
λλμ΄ μ€μ΅ μ½λλ₯Ό μ€νν μ°¨λ‘κ° μμ΅λλ€.
μ½λλ₯Ό μ€νν μ μλ νκ²½μ κ°μΆκ³ , μ΅μ’ λͺ©μ μΈ νμμ±ν μ΄ λμν μ μλλ‘ λ¨κ³λ³λ‘ λ°λΌκ° λ³΄κ² μ΅λλ€.
π μ¬μ μ€λΉ
κΉνλΈμ μλ μ€μ΅ μ½λλ₯Ό μ€ννκΈ° μν΄μ μ¬μ μ μ€λΉν΄μΌν μ¬νμ΄ λͺ κ°μ§ μμ΅λλ€.
- λΈλΌμ°μ (Chrome, Safari λ±)
- VS Code
- node (v22.10.0 μ΄μ)
- npm (v10.9.0 μ΄μ)
- IntelliJ IDEA
- JDK 17
π μ ν리μΌμ΄μ μ€ν
1. μ μ₯μ ν΄λ‘
git clone https://github.com/BenchPress200/webrtc-tutorial
- λ‘컬νκ²½μ μ€μ΅ μ½λ μ μ₯μλ₯Ό ν΄λ‘ ν©λλ€.
2. 리μ‘νΈ μμ€ μ½λ μ΄κΈ°
- VS Codeλ₯Ό ν΅ν΄ ν΄λ‘ λ°μ webrtc-tutorial λλ ν°λ¦¬ νμμ μλ frontend λλ ν°λ¦¬λ₯Ό μ€νν©λλ€.
3. νμν ν¨ν€μ§ μ€μΉ
npm install
- μ€νν frontend λλ ν°λ¦¬μμ ν°λ―Έλμ μ΄κ³ npm install μ μ λ ₯ν΄μ νμν ν¨ν€μ§λ₯Ό μ€μΉν©λλ€.
4. 리μ‘νΈ μ± μ€ν
npm start
- ν¨ν€μ§ μ€μΉκ° μλ£λμμΌλ©΄, npm start λ₯Ό μ λ ₯ν΄μ 리μ‘νΈ μ±μ μ€νν©λλ€.
- μ μ μ€νλμμμ νμΈν©λλ€.
5. μ€νλ§ λΆνΈ μμ€ μ½λ μ΄κΈ°
- IntelliJλ₯Ό ν΅ν΄ ν΄λ‘ λ°μ webrtc-tutorial νμμ μλ backend/build.gradle μ μ€νν©λλ€.
6. 둬볡 μ€μ
- IntelliJμμ 둬볡μ μΈμνκ³ μ μ λμμν€κΈ° μν΄ μ€μ μ νμΈν©λλ€.
7. μ€νλ§ λΆνΈ μ± μ€ν
- μ°μΈ‘ μλ¨μ μ€ν λ²νΌμ ν΄λ¦νμ¬ μ€νλ§ λΆνΈ μ±μ΄ μ μ μ€νλμμμ νμΈν©λλ€.
π νμ μ±ν
μ΄μ λΈλΌμ°μ μ λμκ³Ό μμ€ μ½λλ₯Ό λμμ νμΈνλ©΄μ νμ μ±ν κΉμ§ μ΄λ€ κ³Όμ μ μννλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
1. 리μ‘νΈ μ± μ κ·Ό
- μ¬μ©νλ λΈλΌμ°μ λ₯Ό ν΅ν΄ 2κ°μ νμ μ΄κ³ localhost:3000λ‘ μ΄λν©λλ€.
2. λ―Έλμ΄ μ₯μΉ κΆν μ€μ
- μνν μ§νμ μν΄ localhost:3000μ λ―Έλμ΄ μ₯μΉ κΆνμ νμ©ν©λλ€.
- μ κ·Όμ νμ©νμ§ μλλ€λ©΄ μλ¬κ° λ°μν μ μμ΅λλ€.
3. ν μ€νΈ μ μ κ°μ
- κ° νμμ 'λ±μ΄'μ 'μ€ν°μ§λ°₯'μ μ λ ₯νκ³ join λ²νΌμ ν΄λ¦ν©λλ€.
νλ‘ λμλ λμ - caller callee
- μνλ μ΄λ¦μ μ λ ₯νκ³ join λ²νΌμ ν΄λ¦νλ©΄ Join.tsx νμ΄μ§μ μλ handleJoin() ν¨μλ₯Ό νΈμΆν©λλ€.
- joinμ μ±κ³΅νλ©΄ Call.tsx νμ΄μ§λ‘ μ΄λν©λλ€.
λ°±μλ λμ
- presentation.SignalingHandler
- handleTextMessage(): JOINμ ν΄λΉνλ application λ©μλ νΈμΆν©λλ€.
- application.SignalingService
- join() : κ°μ μ²λ¦¬λ₯Ό μν domain λ©μλ νΈμΆν©λλ€.
- domain.SignalingDomainService
- existsName(): μ μ μ΄λ¦ μ€λ³΅κ²μ¬λ₯Ό μ§νν©λλ€
- sendJoinResultMessage(): κ°μ κ²°κ³Ό λ©μμ§ μ μ‘ν©λλ€.
- broadcastUpdatedActiveUsers(): κ°μ κ²°κ³Όμ λ°λ₯Έ μ΅μ μ μ λͺ©λ‘μ λͺ¨λ μ μ μκ² μ μ‘ν©λλ€.
4. μ νκ±ΈκΈ°
- λ±μ΄κ° μ€ν°μ§λ°₯μκ² ν΅νλ₯Ό μμ²ν©λλ€.
- μ€ν°μ§λ°₯μ λ±μ΄μ ν΅νλ₯Ό μλ½ν©λλ€.
νλ‘ λμλ λμ - caller
- ν΅ν μλλ₯Ό ν΄λ¦νλ©΄ Home.tsx νμ΄μ§μ μλ handleRequestCall() νΈμΆλ©λλ€.
- callerλ μλμ ν΅ν μλ½μ λκΈ°νλ UIκ° λνλ©λλ€.
λ°±μλ λμ
- presentation.SignalingHandler
- handleTextMessage(): CALLμ ν΄λΉνλ application λ©μλ νΈμΆν©λλ€.
- application.SignalingService
- call(): ν΅ν μμ² μ²λ¦¬λ₯Ό μν domain λ©μλ νΈμΆν©λλ€.
- domain.SignalingDomainService
- call(): μ‘μμ μμ ν΅νμνλ₯Ό νμΈνκ³ μμ μμκ² ν΅ν μμ² λ©μμ§ μ μ‘ν©λλ€.
- broadcastUpdatedActiveUsers(): ν΅νμν λ³νμ λ°λ₯Έ μ΅μ μ μ λͺ©λ‘μ λͺ¨λ μ μ μκ² μ μ‘ν©λλ€.
νλ‘ λμλ λμ - callee
- ν΅νμμ² λ©μμ§λ₯Ό μμ νλ©΄ Home.tsx νμ΄μ§μ μλ handleWebSocketMessageμμ handleReceiveCall() λ₯Ό νΈμΆν©λλ€.
- ν΅ν μμ²μ΄ μλ€λ UIκ° νμλ©λλ€.
- ν΅ν μμ² μλ½ μμ΄μ½μ ν΄λ¦νλ©΄, handleAcceptCall() λ₯Ό νΈμΆν©λλ€.
- callerμκ² ν΅νλ₯Ό μλ½νλ€λ λ©μμ§λ₯Ό 보λ΄κ³ Call.tsx νμ΄μ§λ‘ μ΄λν©λλ€.
λ°±μλ λμ
- presentation.SignalingHandler
- handleTextMessage(): ACCEPT_CALLμ ν΄λΉνλ application λ©μλ νΈμΆν©λλ€.
- application.SignalingService
- acceptCall(): ν΅ν μμ² μλ½ μ²λ¦¬λ₯Ό μν domain λ©μλ νΈμΆν©λλ€.
- domain.SignalingDomainService
- acceptCall(): ν΅ν μμ²μ μλ½νλ€λ λ©μμ§λ₯Ό callerμκ² μ μ‘ν©λλ€.
νλ‘ νΈμλ λμ - caller
- ν΅ν μμ² μλ½ λ©μμ§λ₯Ό μμ νλ©΄ Home.tsx νμ΄μ§μ μλ handleWebSocketMessageμμ handleEnterCallRoom() λ₯Ό νΈμΆν©λλ€.
- μλμ μλ½μ΄ νμΈλμμΌλ―λ‘ Call.tsx νμ΄μ§λ‘ μ΄λν©λλ€.
5. Signaling
Call.tsx νμ΄μ§μμ μ§ννλ Signaling κ³Όμ μ λλ€.
μ΄ν΄λ₯Ό λκΈ° μν΄, μ€μ΅ μ½λμμλ μ μ μ λμμ λ°λΌ Signalingμ΄ λ¨κ³μ μΌλ‘ μ§νλλλ‘ κ΅¬μ±λμ΄ μμ΅λλ€.
μ€μ λ‘ κΈ°λ₯μ ꡬννλ€λ©΄, μ μ μ νλμμ΄ ν΅νλ₯Ό μλ½νμ λ κ³§λ°λ‘ offerμ answerλ₯Ό μ£Όκ³ λ°κ³ ICE Candidateλ₯Ό κ΅ννλλ‘ νλ κ²μ΄ μΌλ°μ μ λλ€.
β SDPμ ICE Candidate λ₯Ό μ£Όκ³ λ°λ νλ¦μ μμ μ€λͺ ν λ΄μ©μ ν΅ν΄ μΆ©λΆν μ΄ν΄ν μ μλ€κ³ νλ¨νμ¬, μ΄ν μ½λ λ 벨μ μ€λͺ μ μλ΅νμ΅λλ€. WebRTCμ°κ²°μ μ¬μ©λ ν΅μ¬ APIκ° κΆκΈνλ€λ©΄ μ€μ΅ μ μ₯μμ useWebRTC.ts λ₯Ό μ°Έκ³ νμλ©΄ λ©λλ€.
λ―Έλμ΄ μ€νΈλ¦Ό μ€μ
- λ±μ΄μ μ€ν°μ§λ°₯μ κ°κ° λ―Έλμ΄ μ€νΈλ¦Ό μΈν
λ²νΌμ ν΄λ¦ν©λλ€.
- λ±μ΄λ offerλ₯Ό λ³΄λΌ μ μλ μνκ° λ©λλ€.
- μ€ν°μ§λ°₯μ λ±μ΄μ offerλ₯Ό κΈ°λ€λ¦¬λ μνκ° λ©λλ€.
- κ°μ μ₯μΉλ₯Ό μ¬μ©νλ λ λͺ μ μ μ λ₯Ό μκ°μ μΌλ‘ λͺ νν ꡬλΆνκΈ° μν΄μ μμ΄ν° μ°μμ±μ νμ©νμ΅λλ€.
offer μ μ‘ λ° μ€μ
- λ±μ΄κ° Create and Send Offer λ²νΌμ ν΄λ¦ν©λλ€.
- μμ μ SDP(offer)κ° μμ±λκ³ μ€μ λλ©΄ ICE Candidate μμ§ λ° μ μ‘μ μμν©λλ€.
- μ€ν°μ§λ°₯μκ² offer μ μ‘μ΄ μλ£λλ©΄ answerλ₯Ό κΈ°λ€λ¦¬λ μνκ° λ©λλ€.
- μ€ν°μ§λ°₯μ λ±μ΄μ offerλ₯Ό κΈ°λ€λ Έλ€κ° Set Offer λ²νΌμ ν΄λ¦ν©λλ€.
- λ±μ΄μ SDP(offer)κ° μ€μ λλ©΄, answer μμ± λ° μ μ‘ λ²νΌμ΄ νμ±νλ©λλ€.
- λ±μ΄μ SDP(offer)κ° μ€μ λλ©΄, λ³λμ μ μ λμμμ΄ λ°μ ICE Candidateλ₯Ό μλμΌλ‘ μΆκ°ν©λλ€.
answer μ μ‘ λ° μ€μ
- μ€ν°μ§λ°₯μ΄κ° Create and Send Answer λ²νΌμ ν΄λ¦ν©λλ€.
- μμ μ SDP(answer)κ° μμ±λκ³ μ€μ λλ©΄ ICE Candidate μμ§ λ° μ μ‘μ μμν©λλ€.
- λ±μ΄μ μ€ν°μ§λ°₯μ answerλ₯Ό κΈ°λ€λ Έλ€κ° Set Answer λ²νΌμ ν΄λ¦ν©λλ€.
- μ€ν°μ§λ°₯μ SDP(answer)κ° μ€μ λλ©΄, λ³λμ μ μ λμμμ΄ ICE Candidateλ₯Ό μλμΌλ‘ μΆκ°ν©λλ€.
- μλ‘ κ΅νν ICE Candidateλ₯Ό μΆκ°νμ λ, μ ν¨ν μ°κ²°μ΄ μμ±λλ€λ©΄ ν΅νμμ κ°λ₯ μνκ° λ©λλ€.
6. νμ μ±ν μμ
- λ±μ΄μ μ€ν°μ§λ°₯μ΄ μ μμ μΌλ‘ SDPμ ICE Candidateλ₯Ό κ΅ννκ³ νμμ±ν μ μμν©λλ€.
β λ‘컬νκ²½μ λ―Έλμ΄ μ€νΈλ¦Όκ³Ό peerμ λ―Έλμ΄ μ€νΈλ¦Όμ useWebRTC 컀μ€ν ν μμ MediaStream νμ μΌλ‘ μνκ΄λ¦¬λ₯Ό νκ³ μμ΅λλ€.
ν΄λΉ κ°μ²΄λ₯Ό video νκ·Έμ refμμ±μ ν λΉν΄μ£Όλ©΄ μ μμ μΌλ‘ λ―Έλμ΄ μ€νΈλ¦Όμ΄ λ λλ§ λ©λλ€. video νκ·Έμ μ νν μ΄λ»κ² μ λ¬νκ³ , μ΄λ€ μμ±μ΄ μΆκ°μ μΌλ‘ νμνμ§λ frontend/src/components ν¨ν€μ§μ μλ λΉλμ€ κ΄λ ¨ μ»΄ν¬λνΈμμ νμΈνμ€ μ μμ΅λλ€.
ππ» λ§μΉλ©°
μ΄μ μ ν νλ‘μ νΈλ₯Ό μ§ννλ©΄μ, λ―Έλμ΄ μ€κ³ μλ²μΈ Kurentoλ₯Ό μ¬μ©νμ¬ Nλ N νμμ±ν μλΉμ€λ₯Ό ꡬννμμ΅λλ€.
WebRTC APIλ₯Ό ν λ² κ°μΌ Kurento API, λ€μμ peerκ° μ€λ³΅μΌλ‘ Signaling μν, λͺ ννμ§ μμ μν κ΄λ¦¬, WebSocket μΈμ μ΄ μλμΉ μκ² λ«νμ λμ λμ, Nginxμ WebSocket μ°κ²° 리λ²μ€ νλ‘μ λ¬Έμ , coturn λ°°ν¬ λ± μ λ§ λ§μ λ¬Έμ λ₯Ό λ§λ¬μμ΅λλ€.
λ¬Έμ κ° λ°μν κ·Όλ³Έμ μΈ μμΈμ WebRTC μ μ°κ²° λ°©μμ μ νν μ΄ν΄νμ§ λͺ»νκ³ μλ€κ³ νλ¨νμ΅λλ€.
κ·Έλμ λ€μ νμ΅νκ³ μ€μ΅ μ½λλ₯Ό μ§μ μμ±νλ©΄μ μ΄ν΄λλ₯Ό λμΌ μ μμμ΅λλ€. λν, μ΄λ κ² κΈλ‘ λ¨κΈΈμλ μκ² λμꡬμ.
WebRTC κΈ°μ μ λν΄ νΈκΈ°μ¬ νΉμ νμνμ λΆμκ² λμμ΄ λμμΌλ©΄ μ’κ² μ΅λλ€.
μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€. κΆκΈν μ μ λν μ§λ¬Έ νμν©λλ€!
λΆμ‘±ν, μλͺ»λ μ€λͺ μ΄ μλ€λ©΄ μλ €μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€ ππ»
'DrillDown > WebRTC' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[WebRTC] WebRTC μ°’μ΄λ²λ¦¬κΈ° - μ΄λ‘ μ 리 (6) | 2025.05.30 |
---|