MediaSoup

seongha_h·2024년 12월 26일

Ticle

목록 보기
5/5

SFU 방식의 Mediasoup 선택 이유

WebRTC의 구현 방식은 그림과 같이 크게 3가지 방식이 존재합니다.

이 중에서 저희는 SFU 방식을 사용하였습니다.

SFU방식은 mesh 방식에 비해 클라이언트의 미디어 송신 스트림을 1개로 줄여 클라이언트의 부하를 줄일 수 있고, MCU방식에 비해서는 서버에서 미디어 혼합, 가공 과정을 거치지 않고, 중계 역할만 하므로 서버의 부하 역시 줄일 수 있습니다.

이처럼 클라이언트와 서버의 부하를 줄임으로써 하나의 티클에 더 많은 사용자가 참여할 수 있도록 SFU를 선택하였습니다.

MediaSoup 선택 이유

WebRTC를 이용하여 SFU 방식을 구현한 라이브러리는 여러가지가 있지만, 그 중에서 Mediasoup를 선택하였습니다.

Mediasoup는 다른 WebRTC 라이브러리와 비교했을 때, Node.js를 지원하며 자체적인 시그널링 프로토콜을 강제하지 않는 유연한 아키텍처를 제공하기 때문에 커스텀이 용이합니다.

node.js를 지원하는 다른 라이브러리인 openVidu는 Mediasoup을 기반으로 추상화된 라이브러리이기 때문에 개발하기는 편리합니다.

하지만 저희만의 요구사항에 맞는 세밀한 로직을 직접 고민하고 구현하는 경험을 통해 기술적 성장을 이루고자 했습니다.

ai 요약 기능을 추가하거나, 카메라와 마이크를 제어하는등 원하는 기능을 구현해 내기 위해서는 MediaSoup이 적절하다고 판단하였습니다.

MediaSoup

기존의 다른 SFU 구현과 달리 mediasoup는 독립형 서버가 아니라 더 큰 애플리케이션에 통합될 수 있는 독립적인 Node.js 모듈입니다.

따라서 내부적으로 mediasoup는 두 개의 별도 구성요소로 분할될 수 있습니다.

  • Node.js용 최신 ECMAScript API를 노출하는 JavaScript 레이어
  • 미디어 계층(ICE, DTLS, RTP 등)을 처리하는 C/C++ 하위 프로세스 집합입니다.

두 구성 요소 모두 프로세스 간 통신을 통해 서로 통신합니다.
그러나 개발자의 관점에서 볼 때 애플리케이션은 JavaScript API 통합에만 관심을 가져야 합니다.
→ js api를 활용하기만 해서 어플을 만들라는 소리 같습니다.(영어 이슈)

특징

  • ECMAScript 저수준 API.
  • 멀티 스트림: 단일 ICE + DTLS 전송을 통한 다중 오디오/비디오 스트림.
  • IPv6이 준비되었습니다.
  • UDP 및 TCP를 통한 ICE/DTLS/RTP/RTCP.
  • 동시방송 및 SVC 지원.
  • Congestion control.혼잡 제어.
  • 공간/시간 레이어 분포 알고리즘을 이용한 송신 및 수신 대역폭 추정.
  • 매우 강력합니다(libuv 위에 C++로 코딩된 미디어 작업자 하위 프로세스).

용어 정리

Worker

워커는 Mediasoup에서 중심이 되는 리소스입니다.

  • 미디어 처리를 담당하는 중심 리소스입니다
  • CPU 코어와 1:1로 매핑되는 가장 낮은 레벨의 프로세스입니다
  • 하나의 Worker는 여러 개의 Router를 가질 수 있습니다
  • CPU 코어에서 실행되기 때문에 개수를 제한해야 합니다

worker는 CPU Core의 수 만큼 생성하여 병렬로 처리할 수 있습니다.

Router

  • Audio/Video RTP를 교환하는 단위입니다.
  • 일반적으로 하나의 방(Room)에 하나의 Router가 생성됩니다
  • Producer로부터 받은 패킷을 Consumer에게 라우팅하는 SFU 역할을 합니다
  • 하나의 Worker에 속해 있어 하나의 코어를 점유합니다.

Transport

  • 클라이언트와 MediaSoup Router를 연결하는 통로입니다
  • Producer와 Consumer 간의 미디어 전송을 가능하게 합니다
  • Router로부터 생성됩니다
  • 송신용 SendTransport와 수신용 RecvTransport로 구분됩니다

Producer

  • 클라이언트에서 서버로 미디어를 전송하는 엔티티입니다
  • 오디오, 비디오, 데이터 스트림을 각각 별도의 Producer로 생성합니다
  • SendTransport를 통해 미디어를 서버로 전송합니다

Consumer

  • 서버에서 클라이언트로 미디어를 수신하는 엔티티입니다
  • RecvTransport를 통해 서버로부터 미디어를 수신합니다
  • Producer의 미디어를 구독하여 클라이언트에서 재생합니다

DTLS

데이터그램 전송 계층 보안 (DTLS)은 데이터그램 기반 통신을 보호하는 데 사용되는 프로토콜입니다.

사용

  • Transport 생성 시
    dtlsParameters는 transport를 생성하거나 연결을 설정할 때 전달됩니다.
  • 클라이언트와의 연결
    dtlsParameters를 교환하여 보안을 설정합니다.

Rtp Parameter

RTP(Real-time Transport Protocol) Parameters는 WebRTC 연결에서 오디오와 비디오 스트림을 설정하고 전송하는 데 필요한 정보입니다.

Mediasoup의 ProducerConsumer 생성 시 사용되며, 미디어 스트림의 코덱, 형식, SSRC, 확장 헤더 등 다양한 정보를 포함합니다.

Worker 생성

옵션

logLevel

  • 미디어 워커 하위 프로세스에서 생성되는 로그의 레벨을 설정
  • 가능한 값: "debug", "warn", "error", "none"
  • 기본값: "error"

logTags

  • 디버깅을 위한 로그 태그 배열
  • 특정 기능에 대한 로그만 볼 수 있도록 필터링
  • 예시: ["ice", "dtls", "rtcp"]
  • 기본값: [ ]

rtcMinPort

  • ICE, DTLS, RTP 등에 사용될 최소 포트 번호
  • 기본값: 10000

rtcMaxPort

  • ICE, DTLS, RTP 등에 사용될 최대 포트 번호
  • 기본값: 59999

동작 과정

확장 방법 참고자료

https://getstream.io/glossary/sfu-cascading/
https://getstream.io/resources/projects/webrtc/architectures/sfu-cascading/#how-sfu-cascading-works

참고자료

https://mediasoup.org/documentation/v3/
https://smaivnn.tistory.com/28
https://github.com/Dirvann/mediasoup-sfu-webrtc-video-rooms
https://stay-present.tistory.com/106
https://olive-su.tistory.com/390

profile
https://github.com/Fixtar

0개의 댓글