본문 바로가기
Web/WebRTC

[Kurento] 이게 MCU일까 SFU일까

by 정고정 2022. 2. 28.
반응형

WebRTC N:N통신을 구현하다 보면 헷갈리는 게 하나 있다. 

우리가 구현한 게 결국 무슨 연결구조를 가지는지에 관련한 의문이다. 

이걸로 멘토님들 정말 많이 괴롭히고... 정말 많이 괴롭혔다...

 

WebRTC로 다대다 통신을 구현하기 위해 돌린 서버는 다음과 같다. 

 

클라이언트(Peer)
Signalling Server(App Server)
Kurento Media Server
Coturn

 

이게 MCU인지 SFU인지 모르겠어서 Kurento 연결 구조를 다시 봤다.

이해한 대로, Media Traffic은 KMS로 바로 흘러가는 게 맞다. 그래서 Client와 KMS 안에 coturn url을 명시해줬어야 했다. 

그러면 시그널링 서버로 쏘는 건 정말 시그널일 뿐이고, UDP로 쏘는 실질적인 미디어나 데이터는 KMS를 거치게 되는 건가?

 

KMS에서 미디어를 싹 다 받아다가 믹싱해서 사용자한테 보내주는 거라면 이건 MCU 아닌가..? 

갈수록 모르겠길래 일단 Kurento가 둘 모두를 지원하는지부터 찾아봤다.

 

SFU와 MCU 모두를 지원한다고 한다.

(https://doc-kurento.readthedocs.io/en/latest/user/intro.html)

 

원래 MCU용으로 개발된 매체 서버.Kurento자체는 C++로 실장 되어 있으며 JS/Node/Java용 SDK가 존재한다.개발자는 SDK를 이용하고 Kurento를 조작 가능하다. 현재는 MCU기능 뿐만 아니라 SFU기능도 존재한다. NUBOMEDIA라는 Kurento의 매니지먼트 서비스도 있다. (발췌)
WebRTC Service SFU MCU 녹화 녹음 OS License
Intel Collaboration Suite for WebRTC O O O O   N/A
Janus O O O O O GPL v3
Jitsi VideoBridge O   O O O Apache2
 Kurento O O O O O Apache2
Licode/Erizo O O O O O MIT
MediaSoup O       O ISC
 MeDooze   O O O O ?
PowerMedia XMS   O O O   N/A
SORA O   O O   N/A
OpenTok Mantis O ? O O   N/A
SkyLink O O O O   N/A

(http://iwashi.co/2016/09/03/webrtc-sfu-mcu-summary)

 

 

둘 다 지원한다고 하는데 KMS로 뭘 해야 SFU구조로 구축할 수 있고 뭘 해야 MCU로 구축할 수 있는 걸까?

그래서 우리가 만든 건 뭘까?

 

SFU와 MCU의 차이를 다시 봤다.

 

WebRTC Media Servers - SFUs vs MCUs – WebRTC.ventures

There are many different ways to handle the video and audio streams in your WebRTC application. In this post, Arin Sime considers the line of decisions around open source media servers. First, whether to use one at all, as opposed to pure peer-to-peer arch

webrtc.ventures

어 composite

MCU의 특징이자 정의가 미디어 스트림을 composite하는 건데, kurento 공부하려고 돌아다니다가 분명 composite 관련한 유틸을 본 기억이 있었다.

 

Kurento API Reference — Kurento 6.2.1-dev documentation

Kurento API Reference Kurento Media Server exposes an API to high level languages that allow application programmers to control it. This high level API can be used with a Kurento Client for Java or JavaScript. If you prefer another programming language, yo

files.kurento.org

Kurento에서는 Hub를 통해 모든 input 미디어를 하나의 output media로 합성할 수 있다. 그럼 Hub를 통해 MCU 방식으로 망을 가져갈 수 있다는 건데, 우리의 Kurento 코드에는 Hub가 없다. 

 

키워드 잡고 또 찾아봤더니 이런 글이 나왔다.

 

MCU Kurento

Thank you.  then to be able to have access to the compound files, hub, etc. I must connect to the kurento API, is correct ?

groups.google.com

Kurento를 MCU 방식으로 가져가고 싶다는 질문인데, 답변으로 올라 온 코드를 보니 하나의 atendee가 들어올 때마다 hubPort를 명시해 준다. 

헐 그치그치 hub로 composite해서 같은 pipeline 쓰는 거 이거 MCU지

 

지금까지는 미디어를 믹싱하고 encoding/decoding하는 게 MCU라고 알고 있었다. 

모든 미디어는 KMS를 거쳐가니까 KMS가 붙으면 그게 MCU고 encoding/decoding도 되는 줄 알았다. 

mixing 보다는 composition이라고 이해했어야 하는데 거기서부터 이해가 꼬인 거다.

MCU와 SFU를 구분하는 가장 큰 기준은 stream의 composition 유무였던 거다.  

 

우리가 쓴 server에서도 Endpoint가 N*N개 있었는데, MCU도 WebRTC라 P2P라면 그만큼의 엔드포인트가 나오지 않나 싶었다. 그래서 더 혼동이 왔었는데, server 단에서의 엔드포인트는 MCU든 SFU든 peer 수만큼 N*N개가 있는 게 맞는 것 같다. 

 

여기까지 모으고 보니까 지금까지 공부한 게 아귀가 맞는 기분이다. 

 

 

결론

Kurento에서 Hub를 쓰지 않고 서버망을 구축하면 SFU 방식이다.  

Hubport를 잡아주면 MCU 방식으로 구축할 수 있다. 

그러니까 우리는 SFU였던 거다. 

  SFU MCU
stream 전부 따로 들어 옴 composition
encoding/decoding x o

master와 viewer가 같은 stream에 존재하면 SFU라고 해도 좋다고 한다.

 

 

 

번외

Kurento 기반인 openvidu도 SFU다. 

openvidu는 각 peer마다 stream을 두고 타 사용자에게서 들어오는 미디어나 정보를 각각 관리/제어한다. 그러면 stream이 다 따로 들어온다는 거니까 기본적인 openvidu server도 SFU임

 

반응형

댓글