WebRTC - SFU, Mediasoup

배고픈 징징이 ㅣ 2024. 8. 27. 10:47

1. 설명

일단 WebRTC에 대해 알지 못한다면 아래 글을 참조하도록 하자.

 

 

WebRTC

1.WebRTC 란?Web Real-Time Communications웹 기반의 실시간 음성, 영상 통신 기술.별도의 플러그인이나 소프트웨어 없이 통신할 수 있도록 설계된 API.브라우저 간 실시간 미디어 통신에 최적화된 기술.  2

pinokio5600.tistory.com

 

이전까지 포스팅했던 SocketIO의 경우 지연 이슈로 포기하게 되었다.

이에 WebRTC의 SFU 방식으로 구현하는 방법을 다시 분석하기로 하였다.

 

2. 왜 SFU 인가?

WebRTC의 세가지 방법 중에 화면공유와 시청자들의 공동 작업이 메인 기능인 프로젝트에서 Mesh 방법은 클라이언트가 많아질수록 클라이언트들의 부담이 커지는 이슈로 소규모 통신이 아닌 프로젝트에서는  부적합하다고 판단했고, 

MCU 방법은 MCU 서버가 미디어 스트림을 수정하는 목적으로 만들어진 방법으로, 굳이 미디어 스트림을 수정하지 않을 프로젝트에서 지연이 더 긴 MCU 방법을 사용할 필요가 없다고 판단하였다.

이에 미디어 스트림을 전달만 해주며, MCU 방법에 비해 지연이 적은 SFU 방법을 선택하게 되었다.

 

3. SFU를 구현한 오픈 소스 라이브러리

  1. Mediasoup
    Node.js 기반의 고성능 저수준 SFU
    낮은 지연 시간과 높은 처리량이 특징 -> 대규모 비디오 회의에 적합
    ISC license / star 6110 / last update 2024.08.13
  2. Janus
    C 기반의 SFU 및 MCU 기능을 모두 제공하는 멀티 플랫폼 미디어 서버
  3. Jitsi VideoBridge
    Java 기반의 실시간 비디오 회의에 최적화된 SFU
    각 클라이언트의 미디어 스트림을 자동으로 포워딩하여, 효율적인 비디오 회의를 지원
    Jitsi Meet과 원활하게 통합되어, 즉시 사용 가능한 비디오 회의 솔루션을 제공한다.
    Apache-2.0 license  / star 2888 / last update 2024.08.26
  4. Kurento
    C++ 기반의 SFU 및 MCU 기능을 모두 제공
    미디어 처리와 스트림 관리를 위한 강력한 API 제공
  5. OpenVidu
    JAVA 기반의 Kurento 기반으로 만들어진 라이브러리
    개발자 친화적인 API 제공
    확장성이 뛰어남
    Mediasoup에 비해 사용자가 많아지면, 성능이 떨어질 수 있다.
    Apache-2.0 license  / star 1861 / last update 2024.08.26
  6. Pion
    Go 기반의 SFU
    높은 성능과 경량화된 메모리 사용을 제공
    모듈화
  7. Ant
    Java 기반의 SFU
    클러스터링 및 스케일 기능을 지원하며, 대규모 배포 가능.
    상용 버전과 무료 버전이 따로 있다.

 

4. 라이브러리 선택

일단 Mediasoup과 Jitsi, OpenVidu, Ant 이외에는 사용할 수 없는 언어이기 때문에 제외하였다.

Ant는 상용 버전이 있어서 제외하고 세개의 특징을 간추리자면

  1. Mediasoup은 높은 성능과 유연성을 필요로 하는 커스터마이징이 필요한 프로젝트에 적합
  2. OpenVidu는 WebRTC의 복잡성을 추상화하여, 간단한 API로 다양한 실시간 통신 기능을 구현하고자 하는 경우에 적합
  3. Jitsi VideoBridge는 빠르게 배포 가능한 완성형 화상회의 솔루션이 필요하거나, 대규모 회의를 지원해야 하는 경우에 유리

최종적으로 현재 프로젝트와 언어도 동일하며 대규모 비디오 회의에서 좀 더 나은 퍼포먼스를 보여주는 MediaSoup이 낫다고 판단하게 되었다.

 

5. Mediasoup Architecture 및 주요 용어

 

https://github.com/versatica/mediasoup/blob/v3/art/mediasoup-v3-architecture-01.svg

 

  • Worker
    Mediasoup의 기본 실행 단위
    CPU Core의 수만큼 생성하여 병렬 처리를 한다.
  • Router
    Mediasoup의 중심 구성 요소
    같은 Router에서 나온 Producer와 Consumer 사이에서 , Producer로부터 받은 패킷을 Consumer에게 라우팅 해준다.
    하나의 방 개념으로 이해하면 쉽다. 방 A, B가 있다면, Router A, RouterB가 각각의 방 패킷을 방에 있는 인원들에게 전달해준다.
  • Transport
    네트워크 연결을 나타내는 추상화 개념.
    클라이언트를 Router와 연결해서 Producer와 Consumer간 미디어 전송을 담당한다.
    송신은 send transport, 수신은 receive transport
  • Producer
    실시간 미디어 스트림을 생성하는 엔티티
    각각의 스트림은 따로 취급한다. (Audio와 Video는 각각의 Producer를 갖는다.)
  • Consumer
    실시간 미디어 스트림을 수신하는 엔티티
    Mediasoup 서버로부터 receive transport를 통해 미디어 스트림을 받아 클라이언트에게 전송하는 역할.

5. Mediasoup Flow

반응형

'NodeJS' 카테고리의 다른 글

Web Terminal Ssh  (0) 2024.11.14
WebTerminal - Prototype  (0) 2024.10.28
4. Screen Sharing - Advancement  (0) 2024.08.14
3.Screen Sharing - Mouse Event  (0) 2024.08.12
2.Screen Sharing - Sharing  (0) 2024.08.09