본문 바로가기

서버, 네트워크/서버

[DOCKER] mediamtx를 통한 H.265 120fps 스트리밍 서버 구축&테스트

반응형

많은 스트리밍 플랫폼이 60프레임까지만 지원하는 것을 보고

 

친구들한테 게임 화면을 공유할 때 120프레임 이상이 지원되면 좋지 않을까? 하는 생각에

 

이것저것 테스트해보던 중, mediamtx를 이용해 H.265, AV1 스트리밍 서버를 구축할 수 있다고 하여

 

이번 글에서는 mediamtx 서버를 구축한 뒤 H.265 1440p 120fps 스트리밍을 진행한 과정/결과를 적어보려 합니다.

 

<구축 환경>

SW : Proxmox 8.1.4

- Container로 Ubuntu 생성 후 여기에 Docker, Portainer(Docker Web UI 관리 툴) 설치

 

Ubuntu Container 리소스 세팅 : 2 cores, 1GB RAM, 120G SSD

 

<목표(?)>

1. H.265 혹은 AV1을 사용하여 트래픽 감소

2. 클라이언트(친구들)가 쉽게 영상을 확인할 수 있도록 웹페이지를 통한 재생(HLS 이용)

 

- 원래는 4K 120fps를 목표로 잡았으나, NVENC 인코더 성능 문제로 1440p 120fps로 조정하였습니다

 

1. mediamtx 서버 구축 과정

이미 Portainer 환경까지 구축되어 있는 상태인데다 mediamtx 자체가 대부분의 기능이 구현되어 있는 상태라

mediamtx 서버 구축은 되게 단순하였습니다.

 

(Portainer 세팅 방법은 여기 참고 추후 업로드 예정)

 

 

1. portainer Home 화면에서 Local - Containers 탭으로 이동 후 오른쪽 위의 Add container 클릭

 

 

 

2. 생성할 컨데이너 이름 및 이미지에 bluenviron/mediamtx 입력

 

 

3. 아래 Advanced container settings로 이동해 network에서 bridge -> Host로 변경

(포트가 많아 일일이 매핑해주기 힘드니 그냥 host에서 동작하도록 해주는 게 편합니다)

 

 

혹은 bridge 상태에서 위 포트들을 수동으로 매핑해주셔도 됩니다.

 

 

4. 중간의 Deploy the container 버튼을 클릭하여 생성

 

 

이후 Container list에 위처럼 mediamtx가 올라오면 완료입니다

 

 

2. OBS에서 RTMP 서버 및 스트리밍 세팅

현재 제가 사용중인 그래픽카드는 RTX 3080으로, 아쉽게도 AV1 인코딩을 지원하지 않습니다(RTX 4000시리즈에서 지원)

 

따라서 우선 H.265를 통해 구축을 완료하였으며 추후 송출 테스트용 PC 그래픽카드를 교체하게 된다면 AV1 또한 테스트해보도록 하겠습니다.

 

<OBS 세팅 과정>

 

1. OBS의 설정 창을 연 뒤 방송 탭으로 이동해

 

서비스 : 사용자 지정

서버 : rtmp://서버 IP/아무 글자

스트림 키 : 아무 글자2

 

로 설정해 줍니다.

(추후 스트리밍 접속 시 https://서버IP/아무 글자/아무 글자 2를 이용하므로, 주로 구분하기 쉬운 단어 2개를 입력하시면 됩니다. 저는 rtmpstreaming과 test를 이용해 https://서버IP/rtmpstreaming/test라는 도메인으로 접속할 수 있도록 하였습니다)

 

 

2. 이후 아래 출력 탭으로 이동해 아래와 같이 인코더를 설정합니다.

 

출력 방식 : 고급

 

비디오 인코더 : 사용할 인코더 (그래픽카드에 따라 NVENC, Quicksync 등이 있으며 저는 엔비디아 그래픽카드를 이용할 예정이므로 NVENC HEVC를 선택하였습니다. HEVC = H.265입니다)

 

데이터율 제어: VBR (아프리카, 치지직 등에 방송할 때는 비트레이트가 일정한 CBR을 권장하지만, 이번 글에서는 자체 서버의 트래픽 절감을 위해 VBR을 사용할 예정입니다)

 

비트레이트: 15000Kbps (배틀그라운드 영상으로 테스트한 결과, 4k 120fps 영상임에도 불구하고 15000kbps 수준에서도 꽤 깔끔한 영상이 송출되었습니다)

 

최대 비트레이트: 25000Kbps

 

키프레임 간격: 2s

 

사전 설정 / 조정 / 프로파일 : 기본 설정(느림, 우수한 품질, main)

 

멀티패스 모드 : 2패스(1/4 해상도) (VBR 송출 중 순간적으로 화면이 바뀌는 경우 화질이 저하될 수 있는데 이를 방지하게 위해 2패스 인코딩을 사용하였습니다)

 

사용하시는 환경에 맞춰 세팅하시면 됩니다.

 

3. 이후 비디오 탭으로 이동해 해상도/프레임을 아래와 같이 설정합니다.

 

기본 해상도 : 2560x1440 (직접 키보드로 입력하시면 됩니다)

출력 해상도 : 2560x1440

분수 FPS 값 / 분자 12002 분모 100

(정수 FPS를 통해 120을 설정해도 됩니다. 저는 화면이 미세하게 버벅이는게 느껴져서 분수를 통해 프레임을 살짝 더 주었습니다)

 

저는 기존에 4k 세팅을 사용하고 있었기에 3840x2160으로 설정하였습니다(아까 인코더 설정에서 배율 재조정을 통해 2560x1440으로 조정)

 

4. 확인을 눌러 창을 닫은 뒤, 각 소스를 추가한 후 방송 시작을 눌러 방송이 생성되는지 확인합니다.

 

오른쪽 아래 비트레이트와 프레임이 정상적으로 표시되면 됩니다

 

 

3. HLS를 통해 스트리밍중인 영상 확인

 

이 과정은 매우 간단합니다. 웹 브라우저에서(아무거나 상관 X) http://서버 IP/아까 입력한 아무 단어 1/아무 단어 2에 접속하시면 됩니다.

 

저는 스트리밍 정보 확인을 위해 우선 팟플레이어를 통해 접속해 보았는데요

 

Input에 정상적으로 1440p, 120fps가 표시되는 것을 확인할 수 있었습니다.

 

또한 웹 브라우저를 통해 접속하니

 

Windows Chrome
ipad Safari
Galaxy 삼성 브라우저

 

접속 환경에 상관 없이 모두 잘 재생되네요

(아이패드의 경우 레이턴시를 너무 낮게 가져가려고 하는지 끊김이 발생하기에 1초 정도 일시정지 후 다시 재생하니 괜찮아졌습니다)

 

 

공유기에서 해당 주소를 열어 준다면 외부에서도 접근이 가능할 것으로 예상됩니다.

 

 

많은 스트리밍 플랫폼이 H.264 / 60fps만 지원되기에 이 이상이 가능하지 않을까? 하는 생각에 만들어 보았는데 과정도 어렵지 않았고 결과도 꽤 만족스럽게 나온 것 같네요

 

최근 RTX 4000번대가 AV1 인코딩을 지원한다고 하여 송출 테스트 PC를 RTX 4060으로 바꾸려고 계획 중인데 교체가 완료되면 해당 서버를 통해 AV1 스트리밍도 테스트해볼 예정입니다.

 

이상입니다

 

 

+ 서버 리소스 사용량입니다. 스트리밍 중에도 RAM ~200MB, CPU ~3%로 매우 낮은 사용량을 보여줍니다.

(CPU는 i5 10600 중 2코어만 할당했는데, 그 중 ~3%를 사용하는 것이므로 전체 CPU로 본다면 0.5~1% 수준으로 예상됩니다)

 

반응형