WebRTC의 구현 방식은 그림과 같이 크게 3가지 방식이 존재합니다.
이 중에서 저희는 SFU 방식을 사용하였습니다.
SFU방식은 mesh 방식에 비해 클라이언트의 미디어 송신 스트림을 1개로 줄여 클라이언트의 부하를 줄일 수 있고, MCU방식에 비해서는 서버에서 미디어 혼합, 가공 과정을 거치지 않고, 중계 역할만 하므로 서버의 부하 역시 줄일 수 있습니다.
이처럼 클라이언트와 서버의 부하를 줄임으로써 하나의 티클에 더 많은 사용자가 참여할 수 있도록 SFU를 선택하였습니다.

WebRTC를 이용하여 SFU 방식을 구현한 라이브러리는 여러가지가 있지만, 그 중에서 Mediasoup를 선택하였습니다.
Mediasoup는 다른 WebRTC 라이브러리와 비교했을 때, Node.js를 지원하며 자체적인 시그널링 프로토콜을 강제하지 않는 유연한 아키텍처를 제공하기 때문에 커스텀이 용이합니다.
node.js를 지원하는 다른 라이브러리인 openVidu는 Mediasoup을 기반으로 추상화된 라이브러리이기 때문에 개발하기는 편리합니다.
하지만 저희만의 요구사항에 맞는 세밀한 로직을 직접 고민하고 구현하는 경험을 통해 기술적 성장을 이루고자 했습니다.
ai 요약 기능을 추가하거나, 카메라와 마이크를 제어하는등 원하는 기능을 구현해 내기 위해서는 MediaSoup이 적절하다고 판단하였습니다.
기존의 다른 SFU 구현과 달리 mediasoup는 독립형 서버가 아니라 더 큰 애플리케이션에 통합될 수 있는 독립적인 Node.js 모듈입니다.
따라서 내부적으로 mediasoup는 두 개의 별도 구성요소로 분할될 수 있습니다.
두 구성 요소 모두 프로세스 간 통신을 통해 서로 통신합니다.
그러나 개발자의 관점에서 볼 때 애플리케이션은 JavaScript API 통합에만 관심을 가져야 합니다.
→ js api를 활용하기만 해서 어플을 만들라는 소리 같습니다.(영어 이슈)

워커는 Mediasoup에서 중심이 되는 리소스입니다.
worker는 CPU Core의 수 만큼 생성하여 병렬로 처리할 수 있습니다.
SendTransport와 수신용 RecvTransport로 구분됩니다Producer로 생성합니다SendTransport를 통해 미디어를 서버로 전송합니다RecvTransport를 통해 서버로부터 미디어를 수신합니다Producer의 미디어를 구독하여 클라이언트에서 재생합니다데이터그램 전송 계층 보안 (DTLS)은 데이터그램 기반 통신을 보호하는 데 사용되는 프로토콜입니다.
사용
Transport 생성 시transport를 생성하거나 연결을 설정할 때 전달됩니다.클라이언트와의 연결RTP(Real-time Transport Protocol) Parameters는 WebRTC 연결에서 오디오와 비디오 스트림을 설정하고 전송하는 데 필요한 정보입니다.
Mediasoup의 Producer나 Consumer 생성 시 사용되며, 미디어 스트림의 코덱, 형식, SSRC, 확장 헤더 등 다양한 정보를 포함합니다.
logLevel
logTags
rtcMinPort
rtcMaxPort

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