본문 바로가기
연구소👨‍💻/CS연구소

[미디어 서버] 대환장 미디어 서버 제작

by 신그자체김상범 2024. 5. 2.

프로젝트로 실시간 미디어 스트리밍 서비스를 만들고자 했다. 일단 처음엔 기세좋게 kurento서버를 미디어서버로 두고 통신을 하려했으나 문제가 한 두개가 아니었다. 일단 납기 문제가 제일 중요하기 때문에 빠르게 기존의 방식을 버리고 갈아타기로했다.
 
다른 방식이 예제가 많은 nginx방식인데 많이들 한다는 점에서 쉬운점이 있겠으나 한 번도 안써봤으니 예상못한 문제로 터져버릴 수도 있을 것 같았다. 그런 점에서 이번엔 하나하나 문제점을 써가면서 풀어가기로했음
 
일단 시나리오는 

  1. 스트리머가 서버에 방을 만들겠다고 요청을 보냄
  2. 서버가 채널을 열어줌
  3. 스트리머가 자신의 미디어 내용을 보냄

이렇게 하려했고 빠르게 G쌤과 대화했다

나는 nginx로 실시간 미디어 서버를 하기로 결정했어

내 지금 시나리오상으론 두개가 필요해

[스트리머가 http 요청을 보냄] -> [서버가 이를 받아서 사용자가 미디어 스트림을 보낼 수 있는 rtp 채널을 열고 이 주소를 알려줌] -> [스트리머가 이를 받고 해당 url로 자신의 미디어 스트림을 보냄] -> [nginx가 여기서 이걸 받고 서버에 보내줌] 

이런 과정에서
1. 서버가 nginx에게 특정 채널을 준비시키는 과정
2. 클라이언트가 열린 채널로 문제없이 데이터를 보내는 과정

그리고 이 과정에서 클라이언트가 nginx와 sdp같은 연결 통신도 해야되는데 이 모든 과정이 가능한지 먼저 물어보자.

 
G쌤은 이렇게 대답하신다

nginx를 실시간 미디어 서버로 사용하는 것은 가능하지만, 기본적인 nginx 설정만으로는 비디오 스트리밍 요구사항을 모두 충족시키기 어려울 수 있습니다. nginx는 주로 HTTP 기반의 스트리밍을 지원하고, 실시간 미디어 처리에 필요한 RTP/RTCP 등의 프로토콜은 직접 지원하지 않습니다.
그러나, nginx에는 RTMP (Real-Time Messaging Protocol) 모듈을 추가하여 비디오 스트리밍 기능을 확장할 수 있습니다. 이를 통해 실시간 비디오 스트리밍 서버를 구축할 수 있습니다. 여러분의 요구사항에 맞춰 설명드리면 다음과 같습니다:

1. **서버가 nginx에게 특정 채널을 준비시키는 과정**: RTMP 모듈을 사용하면 nginx 서버 설정 파일에 스트리밍 채널을 미리 정의할 수 있습니다. 각 스트리밍 채널은 고유의 `application` 이름을 가지며, 이를 통해 스트리머가 해당 채널로 데이터를 보낼 수 있습니다.

2. **클라이언트가 열린 채널로 문제없이 데이터를 보내는 과정**: 클라이언트는 RTMP 프로토콜을 사용하여 정의된 채널(application)로 스트림을 전송할 수 있습니다.

이때, OBS (Open Broadcaster Software)나 다른 스트리밍 소프트웨어를 사용하여 스트림을 nginx 서버로 전송할 수 있습니다. SDP(Session Description Protocol) 같은 연결 통신을 구현하기 위해서는 추가적인 미디어 서버 구성 요소가 필요할 수 있습니다.

예를 들어, WebRTC 기반의 솔루션을 통해 더 복잡한 미디어 스트리밍과 상호작용을 구현할 수 있으며, 이 경우 추가적인 미디어 서버(예: Janus, Jitsi)가 필요할 수 있습니다. nginx와 RTMP를 사용한 실시간 미디어 서버 구축을 위해 필요한 주요 단계는 다음과 같습니다: - nginx에 RTMP 모듈 설치 - nginx 설정 파일에 스트리밍 채널 설정 - 스트리머가 OBS나 유사한 소프트웨어를 사용하여 설정된 채널로 스트림 전송 - 필요에 따라 추가 미디어 서버 구성 이러한 설정을 통해 기본적인 실시간 스트리밍 요구사항을 충족시킬 수 있습니다.

한마디로 nginx 의 rtmp모듈을 이용해서 데이터를 주고받을 수 있다는 것. 그런데 내 서버에서는 방을 열겠다는
Http 통신 이후에야 방송을 시작할 수 있다. 그러다보니 nginx를 안통하고 백엔드 서버에서 일을 할 수는 없을까 하고 생각했다. 물론 나중에 nginx를 써야할 것 같지만 일단은 그래서 내 장고 백엔드 서버에 요청을 보내는 방식으로 생각해봤다.