프로젝트에서 Kurento Media Server를 활용한 1:N 스트리밍 서비스를 구현하기 위해서는 크게 5가지의 구성요소가 필요합니다.
KMS는 미디어 서버를 오픈소스로 제공하는 Kurento의 미디어 서버입니다.
Kurento는 Coturn을 이용한 Turn서버와 각종 기능을 제공하고 있으며 Nodejs, Java Spring을 이용한 시그널링 및 클라이언트 예시 코드를 제공하고 있어서 참고하여 개발하기 수월합니다. 다소 어려운 부분이 있으나 상용 프로그램을 구매하지 않고 공부하기 좋은 것 같습니다.
KMS를 사용할 경우 Peer가 KMS와 브라우저로 이루어집니다. ICE를 하는 대상이 KMS와 브라우저가 되는 것입니다. 따라서 시그널링 서버에서는 KMS를 대신해서 상대 Peer와 SDP교환, ICE를 대신 처리해줍니다. 그리고 KMS의 연결 상태를 관리합니다.
KMS는 따로 설정하지 않고 Docker로 사용하지만 Coturn과 사용하거나 특수한 목적으로 사용해야할 때는 필요에 따라 내부의 환경 설정을 변경해야합니다.
Coturn은 Turn 서버의 표준을 구현한 오픈 소스 Turn 서버입니다. ICE를 위해서는 Stun과 Turn 둘 다 필요하다고 말했는데 Coturn은 Stun 기능을 제공하기 때문에 Stun 서버가 따로 필요하지 않습니다. Coturn이 둘 다 제공합니다.
Turn 서버는 릴레이 서버이기 때문에 서버에 Inbound, Outbound가 발생합니다. 그래서 한 대의 Turn 서버에 많은 리소스가 생기면 지연이 심해질 수도 있고 네트워크 사용 비용이 많이 청구될 수 있습니다. Turn 서버를 사용하기 위해서는 Credential을 요구합니다. Credential을 구현하는 방법은 다양하지만 저는 lt-cred-mech을 사용했고 이 방식은 username:password을 Coturn 내부에 설정하고 Coturn에서는 이 username:password을 검증합니다.
Kurento는 NodeJS를 활용한 코드도 제공해주고 있지만 저는 Spring을 사용해서 시그널링 서버를 구현했습니다. 이후 포스팅에서 상세하게 설명하겠습니다.
Peer는 브라우저나 모바일이 WebRTC API만 지원되면 가능합니다. 저는 브라우저로 개발했습니다. MDN에서 제공하는 WebRTC의 PeerConnection API를 활용해서 SDP를 만들고 Ice Candidate를 송수신합니다. 이후 ICE 연결이 완료되면 미디어 스트림을 관리합니다. 이후 포스팅에서 스트리밍 구현 내용 설명하겠습니다.
굳이 EC2일 필요는 없고 공인 IP를 할당받을 수 있는 서버면 됩니다. 본인 컴퓨터라도 포트 포워딩을 하거나 공인 IP을 구매후 할당하셔도 충분합니다. 다만 이 프로젝트에서는 EC2로 서버를 관리하고 있습니다.