(내용 출처) 

https://www.youtube.com/watch?v=DOe7GkQgwPo&ab_channel=AmirEshaq

 

 

 

 

1. 기본적인 흐름

mediasoup은 producer로 미디어를 보내고 consumer로 미디어를 받는 기본적인 흐름을 가지고있다. producer와 consumer는 transport에 의해 만들어지며 각 transport당 여러개의 producer와 consumer를 가질 수 있다. producer와 consumer는 router를 통해 미디어를 주고받는다. transport는 router 당 여러개 만들어질 수 있다. router는 room(화상채팅방) 개념으로 이해할 수 있다. router는 worker에 의해 생성되며 각 worker당 여러개의 router를 가질 수 있다. worker는 cpu 코어 당 하나씩만 만들어질 수 있다.

 

구조 예시:

worker

|--router1

|       |--transport1

|       |         |--producer1

|       |         |--producer2

|       |--transport2

|       |         |--consumer1

|       |         |--consumer2

|--router2

...

 

2. 이번에 알아볼 것들

* connect 되었을 때 주고받는 parameter 들

* disconnect 되었을 때 무엇을 해야하는가?

 

 

3. socket 통신을 이용한 Client(producer/consumer) 와 Media Server 연결 과정

(1) 각 client에서 createDevice 메소드를 실행하여 producer peer와 consumer peer의 Device 객체 생성

(2) 각 producer/cosumer peer 는 서버에서 rtpCapabilities 를 받고 이를 인자로 받는 Device의 메소드 실행

(3) 서버에서 자신이 사용할 producer와 consumer용 webRtcTransport 두 개를 만든다. 만들 때 지정할 수 있는 옵션은 다음과 같다. listenIps: [{...}, {...}], enableUdp: true(v) / false, enableTcp: true(v) / false, preferUdp: true(v) / false

(4) 미디어 서버의 producer / consumer 용 각 webRtcTransport 는 각 client(producer/client) 로 여러 parameter를 보내고 producer client는 create SEND Transport를, consumer client는 create RECV Transport 를 수행한다. 아래는 미디어 서버가 client에게 보내는 parameter 들이다. Transport id, iceParameters, iceCandidates, dtlsParameters

(5) create SEND Transport / create RECV Transport 로 producer client와 consumer client 는 각각 자기의 local Transport 객체를 받는다.

(6-1) producer client 는 local Transport(SEND Transport) 객체의 produce 메소드를 실행하고 producer 객체를 받는다. produce 메소드는 local Transport 객체의 on Connect / on Produce 이벤트를 발생시킨다. produce 메소드는 아래 parameter를 받는다. encodins, codecOptions

(6-2) on Connect 이벤트는 dtlsParameters 를 반환하고 이를 미디어 서버로 보낸다. 미디어 서버는 자신의 local Transport (producer side webRtcTransport) 의 connect 메소드를 실행한다. connect 메소드는 dtlsParameters를 인자로 받는다. dtlsParameters

(6-3) on Produce 이벤트는 명확히 kind, rtpParameters 를 반환하고 callback, errback 메소드와 함께 이를 미디어 서버로 보낸다. 미디어 서버는 자신의 local Transport (producer side webRtcTransport) 의 produce 메소드를 실행한다. produce 메소드는 미디어 서버의 producer 객체를 반환한다. produce 메소드는 client에서 받은 parameter들을 인자로 받는다. kind, rtpParameters

(6-4) 우리는 미디어 서버측 producer의 producer id 를 필요로 한다. 미디어 서버는 producer id 를 producer client로 보낸다. producer client 는 producer id 를 받아서 callback 을 실행한다. callback 은 local Transport(SEND Transport)에게 '미디어 서버로 parameter 들을 잘 보냈다'는 사실을 알리고 producer id를 제공한다. 에러가 발생하면 errback 을 실행한다. * 이제 producer client 는 미디어 서버로 미디어를 스트리밍한다.

(7-1) 이제 consumer client 는 스트리밍 중인 미디어를 consume 해야한다. consumer client 의 Device 객체에서 rtpCapabilities 를 추출해서 미디어 서버로 보낸다.

(7-2) 미디어 서버는 consumer client가 보낸 rtpCapabilities 와 자신의 router로 consumer client가 자신의 producer 가 스트리밍하는 미디어를 잘 consume 할 수 있는지 producer id 와 함께 체크한다. consumer client 가 consume 할 수 있다고 판단되면 미디어 서버는 자신의 local Transport(consumer side webRtcTransport) 의 consume 메소드를 실행한다. consume 메소드는 미디어 서버측의 consumer 객체를 반환한다.

(7-3) 미디어 서버는 consumer 객체에서 parameter 들을 추출해서 consumer client 로 보낸다. consumer client는 parameter들을 받아 local Transport(RECV Transport) 의 consume 메소드를 실행한다. consumer client 의 consume 메소드는 consumer 객체를 반환하고 on Connect 이벤트를 발생시킨다.

(7-4) on Connect 이벤트는 dtlsParameters 를 반환하고 미디어 서버로 보낸다. 미디어 서버는 dtlsParameters 를 받고 이를 인자로 받는 local Transport(consumer side webRtcTransport) 의 connect 메소드를 호출한다. * 이제 consumer client 는 미디어 서버로부터 스트리밍 미디어를 consume 한다.

 

 

 

4. producer client 가 연결을 종료했을 때 ... 

* mediasoup은 연결이 종료된걸 자동으로 감지하지 않기때문에 socket.io 를 사용해서 disconnect 이벤트가 발생하면 그 후속조치를 취해줘야한다.

(1) Producer client가 connection 닫고 disconnect 이벤트 발생

(2) 미디어 서버의 producer side webRTCTransport 로 transport.close() 호출하고 producer.close() 호출한다.

(3) producer.close() 가 호출되면 미디어 서버의 consumer side webRtcTransport 에게 close 이벤트가 발생한다. 그 때 transport.close() 호출한다.

(4) 미디어 서버의 consumer side webRtcTransport 가 close 되면 consumer client의 local transport(RECV Transport)에게 transport.close() 를 호출하고 그 후 consumer.close() 를 호출한다.

 

5. consumer client 가 연결을 종료했을 때 ... 

* mediasoup은 연결이 종료된걸 자동으로 감지하지 않기때문에 socket.io 를 사용해서 disconnect 이벤트가 발생하면 그 후속조치를 취해줘야한다.

(1) consumer client 가 connection 닫고 disconnect 이벤트 발생

(2) 미디어 서버의 consumer side webRtcTransport 로 transport.close() 호출하고 consumer.close() 호출한다.

+ Recent posts