프로젝트로 실시간 미디어 스트리밍 서비스를 만들고자 했다. 일단 처음엔 기세좋게 kurento서버를 미디어서버로 두고 통신을 하려했으나 문제가 한 두개가 아니었다. 일단 납기 문제가 제일 중요하기 때문에 빠르게 기존의 방식을 버리고 갈아타기로했다.
다른 방식이 예제가 많은 nginx방식인데 많이들 한다는 점에서 쉬운점이 있겠으나 한 번도 안써봤으니 예상못한 문제로 터져버릴 수도 있을 것 같았다. 그런 점에서 이번엔 하나하나 문제점을 써가면서 풀어가기로했음
일단 시나리오는
- 스트리머가 서버에 방을 만들겠다고 요청을 보냄
- 서버가 채널을 열어줌
- 스트리머가 자신의 미디어 내용을 보냄
이렇게 하려했고 빠르게 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를 써야할 것 같지만 일단은 그래서 내 장고 백엔드 서버에 요청을 보내는 방식으로 생각해봤다.
'CS연구소👨💻' 카테고리의 다른 글
[AWS] 책 AWS 구조와 서비스 읽기 : Chapter 2 (0) | 2024.06.01 |
---|---|
[C++] 메모리 구조 (0) | 2024.05.30 |
[GIT] 깃 특정파일을 지워야할때 필요한 작업들 (0) | 2024.05.26 |
[미디어 서버] ffmpeg 미디어 서버 프로젝트 (0) | 2024.05.15 |
[C++] 포인터와 스마트 포인터 (0) | 2024.05.11 |