(내용 출처)
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() 호출한다.
'학습 기록 > 교내 기업과제 프로젝트' 카테고리의 다른 글
[postgreSQL] AWS RDS 에서 온프레미스 서버로 DB 옮기기 (0) | 2024.01.12 |
---|---|
mediasoup 에서 다른 유저의 비디오/오디오 조작 (1) | 2023.09.21 |
typescript 간단히 익히기 .. (0) | 2023.08.23 |