[WebRTC] 5. 라이브 스트리밍 구현 (1) offer & answer

2022. 12. 15. 15:49·개발/Projects

WebRTC 라이브 스트리밍은 다음의 흐름을 따라 구성됩니다.

  • Peer A가 Offer를 생성하여 서버를 통해 Peer B에 전달합니다.
  • Peer B는 해당 Offer를 받고 Answer를 생성하여 서버를 통해 Peer A에게 전달합니다.
  • Peer A가 candidate를 전달하고 Peer B는 이를 추가합니다.
  • Peer B가 candidate를 전달하고 Peer A는 이를 추가합니다.
  • 스트리밍이 진행됩니다.

RTC 연결 생성하기

아래와 같이 RTCPeerConnection을 통해 새로운 RTC 연결을 생성할 수 있습니다.


// app.js

function showVideoOption() {
  videoInteface.hidden = true;
  streamingInterface.hidden = false;

  makeConnection();
}

function makeConnection() {
  myPeerConnection = new RTCPeerConnection();
    console.log(myStream.getTracks()); // stream 데이터 받기
}

getTracks를 통해 로그를 찍어보면 아래와 같이 스트림 데이터가 표시됩니다.

Offer 전송 및 수신

1. Offer 생성하기

이제 Peer A에서 Offer를 생성하여 전달해보도록 하겠습니다. Peer B가 접속하면 트리거 되는 videoGreeting에서 다음과 같이 Offer를 만들어줄 수 있습니다.

// app.js

socket.on("videoGreeeting", async () => {
  const offer = await myPeerConnection.createOffer();
  console.log(offer);
});

로그를 찍어보면 아래와 같이 생성된 offer를 볼 수 있습니다.

2. localDescription 설정하고 전달하기

이제 위에서 생성한 offer를 통해 localDescription을 설정하고 이를 전달해주도록 하겠습니다.

// app.js

socket.on("videoGreeeting", async () => {
  const offer = await myPeerConnection.createOffer();
  myPeerConnection.setLocalDescription(offer);
  socket.emit("offer", offer, videoRoomName);
});

다음으로 서버에서 해당 offer를 수신하고 다시 전달해줍니다. 이렇게 전달된 offer는 Peer B에서 수신할 것입니다.

// server.js

socket.on("videoRoomName", (videoRoomName, showVideoOption) => {
    socket.join(videoRoomName);
    showVideoOption();
    socket.to(videoRoomName).emit("videoGreeeting");
  });
  socket.on("offer", (offer, videoRoomName) => {
    socket.to(videoRoomName).emit("offer", offer);
  });

3. 서버에서 오는 offer 받기

이제 Peer B쪽에서 서버에서 넘어오는 offer를 받아줍니다.

// app.js

socket.on("offer", (offer) => {
  console.log(offer);
});

Answer 전송 및 수신

이제 Peer B에서는 해당 offer를 통해 remoteDescription을 설정하고 answer를 생성합니다.

// app.js

socket.on("offer", async (offer) => {
  myPeerConnection.setRemoteDescription(offer);
  const answer = await myPeerConnection.createAnswer(offer); // createAnswer

  console.log(answer);
});

로그를 찍어보면 이번에는 answer가 잘 생성된 것을 볼 수 있습니다.

이제 해당 answer로 localDescription을 설정하고 서버에 answer를 전달해줍니다.

// app.js

socket.on("offer", async (offer) => {
  myPeerConnection.setRemoteDescription(offer);
  const answer = await myPeerConnection.createAnswer(offer);
  myPeerConnection.setLocalDescription(answer);
    socket.emit("answer", answer, videoRoomName);
});
// server.js

socket.on("answer", (answer, roomName) => {
    socket.to(roomName).emit("answer", answer);
  });

서버에서 answer를 전송해주면 마지막으로 Peer A 측에서 answer를 받아 remoteDescription으로 설정하면 과정이 완료됩니다.

// app.js

socket.on("answer", (answer) => {
  myPeerConnection.setRemoteDescription(answer);
});

'개발 > Projects' 카테고리의 다른 글

[WebRTC] 6. 라이브 스트리밍 구현 (2) IceCandidate & Track  (0) 2022.12.15
[WebRTC] 4. 채팅방 기능 구현하기  (0) 2022.12.15
[WebRTC] 3. 카메라 오디오 전환하기  (0) 2022.12.14
'개발/Projects' 카테고리의 다른 글
  • [WebRTC] 7. 라이브 스트리밍 구현 (3) Sender / 카메라 및 오디오 전환하기
  • [WebRTC] 6. 라이브 스트리밍 구현 (2) IceCandidate & Track
  • [WebRTC] 4. 채팅방 기능 구현하기
  • [WebRTC] 3. 카메라 오디오 전환하기
휘Hwi
휘Hwi
여행, 사진, 개발, 책 이야기를 기록하는 여행자 휘의 블로그 𓂍
Klook.com
  • 휘Hwi
    휘: 끝나지 않은 이야기
    휘Hwi
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기록
        • 일상 에세이
        • 인사이트
        • 투자와 재테크
        • 코인 이야기
        • 아카이빙
        • 집무실 레터
        • 사랑에 대하여
        • 번역 이야기(完)
        • 프리랜서 일지(完)
      • 여행
        • 🌎 세계 여행기 S1 (完)
        • 🌊 삼삼한 여행기 (完)
        • 🚶 온더로드
        • 🇯🇵 일본
        • 🏝️ 발리
        • 🇻🇳 베트남
        • 🇱🇰 스리랑카
        • 🇮🇳 인도
        • 🇹🇭 태국
        • 🇸🇬 싱가포르
        • 🇦🇺 호주
        • 🇭🇰 홍콩
        • 🇰🇷 한국
        • 🍚 여행자의 한 끼
        • ℹ️ 여행 정보
      • 사진
        • 사진가
        • 사진 이론과 생각
        • 사진 관련 정보
      • 영상
        • 파이널컷 모션 공부
        • 고프로 GoPro
        • 영상 관련 정보
      • 책
        • 책 읽고 쓰기
      • 개발
        • 티스토리
        • Internet
        • HTML
        • CSS
        • JavaScript
        • Typescript
        • React
        • Node.js
        • Express
        • NestJS
        • Python
        • Django
        • MySQL
        • MongoDB
        • AWS
        • Deployment
        • Terminal
        • Git
        • Glossaries
        • Articles
        • Projects
        • TIL;
      • 미분류
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
휘Hwi
[WebRTC] 5. 라이브 스트리밍 구현 (1) offer & answer
상단으로

티스토리툴바