Skip to content

방송 송출 및 시청 구현

Sunny edited this page Dec 2, 2024 · 3 revisions

1. 🔍 Mediasoup 핵심 개념 이해하기

📦 기본 구성 요소

🔄 Worker & Router

  • Worker: 미디어 처리의 기본 단위입니다. CPU 코어당 하나의 워커를 생성하여 효율적인 미디어 처리를 담당합니다.
  • Router: 가상의 컨퍼런스 룸과 같은 개념으로, 하나의 독립된 공간에서 참가자들의 미디어를 관리합니다.

🔌 Transport

미디어 데이터의 전송을 담당하는 채널입니다. 각 클라이언트는 두 종류의 transport가 필요합니다:

  • Producer Transport: 미디어를 서버로 보내는 전송 채널
  • Consumer Transport: 서버에서 미디어를 받는 전송 채널

🎬 Producer & Consumer

  • Producer: 미디어를 생성하는 엔드포인트로, 실제 방송을 송출하는 지점입니다.
  • Consumer: 미디어를 소비하는 엔드포인트로, 방송을 시청하는 지점입니다.

🛠 주요 기술 요소

  • DTLS: UDP 통신에서 보안을 제공하는 프로토콜로, WebRTC에서 안전한 미디어 스트림 전송을 위해 사용됩니다.
  • WebRTCTransport: WebRTC 표준을 따르는 전송 방식으로, 일반적인 클라이언트 연결에 사용됩니다.
  • PlainTransport: 미디어 서버 간 통신이나 레코딩 등 특수 목적으로 사용되는 단순화된 전송 방식입니다.
  • rtpCapabilities: 지원하는 코덱과 미디어 기능을 정의하는 객체입니다.
  • Device: 클라이언트의 미디어 기능을 캡슐화한 객체입니다.

📐 mediasoup의 디자인

image

💻 가설을 세우기 위해 구현해 본 프로토타입

방송 송출 프로토타입 Client-Server code

2. ⚙️ 구현 과정

📝 가설 .ver1

각자의 탐구해온 내용을 바탕으로 우리 팀만의 방송 송출 및 시청 흐름도를 구현해보았습니다.

image

⚡ 검증 .ver1

가설이 맞는지 확인하기 위해 코드 구현을 진행하였습니다. 흐름도를 3부분으로 나눠서 각자 섹션을 구현해오고, 이를 합치는 과정에서 페어 프로그래밍을 하며 병합하였습니다.

image

image

image

image

⚠️ 문제점 발견 및 개선

가설에 맞게 구현하는 과정에서 2가지의 문제점을 발견했습니다.

  1. RTP Capabilities의 종속성 문제
    • 발견된 문제
      • RTP Capabilities가 Room(Router)에 종속되어야 함을 발견
    • 해결
      • Router 생성 시점에 RTP Capabilities를 설정하도록 수정
  2. Transport 구조의 이해 오류
    • 초기 가정
      • Transport connect 후 Producer 생성이 순차적으로 일어날 것으로 예상
    • 실제 동작
      • 클라이언트 Transport에 connect 이벤트와 produce 이벤트를 먼저 등록
      • produce() 메서드 호출 시점에 등록된 이벤트들이 콜백으로 실행
    • 핵심 깨달음
      • 클라이언트와 서버의 Transport가 독립적으로 동작해야 함

📝 가설 .ver2

문제점 발견 후 개선하기 위한 새로운 가설을 작성해보았습니다.

image

⚡ 검증 .ver2

새롭게 정의 된 가설을 바탕으로 기능 구현을 진행했습니다.

image

image

🔨 최종 개선 단계

모든 기능이 정상 작동하는 것을 확인한 후, 다음과 같은 리팩토링을 진행했습니다

  • 계층 구조 명확화
  • DTO 설계 및 적용
  • 퍼사드 패턴 도입으로 인터페이스 단순화
  • 코드 모듈화 및 재사용성 개선

image

image

💻 관련 PR

⚡ 검증 .ver1

https://github.com/boostcampwm-2024/web20-camon/pull/115

https://github.com/boostcampwm-2024/web20-camon/pull/123

https://github.com/boostcampwm-2024/web20-camon/pull/124

https://github.com/boostcampwm-2024/web20-camon/pull/125

https://github.com/boostcampwm-2024/web20-camon/pull/128

⚡ 검증 .ver2

https://github.com/boostcampwm-2024/web20-camon/pull/153

https://github.com/boostcampwm-2024/web20-camon/pull/154

🔨 최종 개선 단계

https://github.com/boostcampwm-2024/web20-camon/pull/138

https://github.com/boostcampwm-2024/web20-camon/pull/166

👥 팀 강점

🧑‍💻 개발 일지

📌 ALL

📌 FE

📌 BE

💥 트러블 슈팅

📌 FE

📌 BE

🤔 고민

📚 학습 정리

📌 김광현

📌 백지연

📌 전희선

📌 한승헌

🤝 회의록

🗒️ 데일리 스크럼

💬 팀 회고


👨‍👩‍👧‍👦 소개

🌱 문화

🔨 기술 스택

⚙️ 서비스 아키텍쳐

🚧 CI/CD

🌊 Flow

💭 6주를 보내면서

Clone this wiki locally