중계

사설 중계 서버 내용 정리

chocosobo

Table of Contents


사용 소프트웨어

  • Oven Media Engine (서버)
GitHub - AirenSoft/OvenMediaEngine: OvenMediaEngine (OME) is a Sub-Second Latency Live Streaming Server with Large-Scale and High-Definition. #WebRTC #LLHLS
OvenMediaEngine (OME) is a Sub-Second Latency Live Streaming Server with Large-Scale and High-Definition. #WebRTC #LLHLS - GitHub - AirenSoft/OvenMediaEngine: OvenMediaEngine (OME) is a Sub-Second…
  • OvenPlayer (플레이어)
GitHub - AirenSoft/OvenPlayer: OvenPlayer is JavaScript-based LLHLS and WebRTC Player for OvenMediaEngine.
OvenPlayer is JavaScript-based LLHLS and WebRTC Player for OvenMediaEngine. - GitHub - AirenSoft/OvenPlayer: OvenPlayer is JavaScript-based LLHLS and WebRTC Player for OvenMediaEngine.

서버 사양

  • Linode - Shared CPU (linode 2 GB)
    - 월 10$
    - 1 CPU / 50GB 용량 /2GB RAM
    - 40 Gbps In / 2 Gbps Out
  • 리전 : JP
  • OS : Ubuntu 20.04 LTS

경험상 8인까지 해당 사양으로 송출하는데 문제 없었음

부하의 대략적인 계산 상 대역폭 한계까지 한번에 이용하는데 문제 없을듯

이번 대회(2023 Lima Major)의 경우 QHD 18000 Kbps (2.25 MB/s) 로 송출이니 동일 사양 기준 최대 110명 가량 수용 가능해보임

서버의 준비가 끝나면 즉시 IP를 확인해 도메인과 연결할 필요가 있음

추후 https 연동 때 지연될 일 없도록


서버 설정

Getting Started - OvenMediaEngine

해당 문서를 따라하면 끝이지만 일부 기능의 경우 Git 버전과 가이드 버전이 상이해 설치 시 문제가 발생할 수 있음

일단 처음 vps를 열면 기본으로 다음 줄을 실행해야한다

sudo apt-get update & sudo apt-get upgrade

1. Oven Media Engine (이하 OME) 다운로드

(curl -LOJ https://github.com/AirenSoft/OvenMediaEngine/archive/v0.15.0.tar.gz && tar xvfz OvenMediaEngine-0.15.0.tar.gz)

OvenMediaEngine-0.15.0/misc/prerequisites.sh
버전 및 버전에 따른 다운로드 폴더명 확인 필요

2. OME 빌드 및 실행

sudo apt-get update

cd OvenMediaEngine-0.15.0/src
make release
sudo make install
systemctl start ovenmediaengine

#부트 시 자동 실행
systemctl enable ovenmediaengine.service 
1과 마찬가지로 버전 확인 필요

3. 방화벽 설정

sudo ufw allow 3333/tcp
sudo ufw allow 3334/tcp
sudo ufw allow 1935/tcp
sudo ufw allow 9999/udp
sudo ufw allow 4000/udp
sudo ufw allow 3478/tcp
sudo ufw allow 9000/tcp
sudo ufw allow 10000-10005/udp

4. OME 준비

nano /usr/share/ovenmediaengine/conf/Server.xml

<Application>
  <Name>앱이름(event)</Name>
  ...
  ...
</Application>

---

<OutputProfiles>
  <OutputProfile>
      <Name>스트림이름(hawawa)</Name>
      ...
  </OutputProfile>
</OutputProfiles>

이후 앱이름과 스트림이름은 방송 설정 중 사용

5. https 준비

  • certbot 설치
apt-get install snapd
sudo snap install core; sudo snap refresh core

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot certonly --standalone
  • ome와 인증키 연결
nano /usr/share/ovenmediaengine/conf/Server.xml

<virtualHosts>
    
<!-- 
	<!-- 삭제
-->
    <Host>
      <Names>
        <Name>도메인주소</Name>
      </Names>
      <TLS>
        <CertPath>/etc/letsencrypt/live/도메인/cert.pem</CertPath>
        <KeyPath>/etc/letsencrypt/live/도메인/privkey.pem</KeyPath>
        <ChainCertPath>/etc/letsencrypt/live/도메인/chain.pem</ChainCertPath>
      </TLS>
    </Host>
<!-- 
	-- > 삭제
-->
</virtualHosts>
3 개의 pem 파일 인증 연결

송출 설정

비트레이트 등의 자유이며 해상도의 경우 OvenPlayer가 자동으로 변형됨

1. 프로토콜

  • RTMP
    - h264 로 방송
    - 안정적임

OBS 송출 설정
URL      : RTMP://도메인.주소:포트/앱이름
Stream Key : 스트림이름

위 앱이름 스트림 이름은 서버 설정 4. 항목에서 가져옴

  • SRT (Beta)
    - 요즘들어 어느정도 대중화된 H.265 (HEVC) 사용 가능
    - 하드웨어 인코딩 (NVENC) 사용하여 부담줄일 수 있음
    - 다만 송신에 H.265 이용 불가해 x264 강제
    - 새 오픈소스 코덱인 AV1까지는 x264 쭉 가야할듯

OBS 송출 설정
URL      : srt://도메인주소:포트?streamid=srt%3A%2F%2F도메인주소%3A포트%2F앱이름%2F스트림이름
Stream Key    : 불필요

  • WebRTC 등 기타
    - 더욱 저지연 프로토콜도 있으나 안정성 문제로 이용 안함
    - 해당 글은 양방향 통신, 초저지연 컨텐츠보다는 일반 방송 서버에서 제공하지 못하는 대역폭의 고화질 이벤트 방송용임

OvenPlayer 설정

이전 이벤트 (TI 11) 의 경우 두가지 송신 프로토콜을 제공함

WebRTC (더 낮은 지연, 비교적 불안정) / llhls (낮은 지연, 비교적 안정)

ll-dash 등을 사용해봤으나 당시 훨씬 불안정한 모습을 보여 위 두가지만 지웠했으며 대부분의 경우 이 2가지 프로토콜로 원활한 시청이 가능했다고 함

OvenPlayer 용 스크립트

<!--js 2개 로드-->
<!--llhls js 받기-->
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js"></script>
<!--ovenplayer js 받기-->
<script src="https://cdn.jsdelivr.net/npm/ovenplayer/dist/ovenplayer.js"></script>

<!--플레이어 생성-->
<div id="플레이어이름"></div>

<!--플레이어 설정-->
<script>

  // Initialize OvenPlayer
  const player = OvenPlayer.create('플레이어이름', {
      sources: [
        {
            label: 'WebRTC 라벨이름',
            type: 'webrtc',
            file: 'ws://도메인주소:3333/앱이름/스트림이름'
        },
        {
            label: 'hls 라벨이름',
            type: 'llhls',
            file: 'https://도메인주소:3334/앱이름/스트림이름/llhls.m3u8'
        }
        ]
  });
</script>

위 내용에서도 나와있듯 두 url
- ws://도메인주소:3333/앱이름/스트림이름
- https://도메인주소:3334/앱이름/스트림이름/llhls.m3u8
의 경우 웹플레이어 외 설치형 플레이어 (VLC, 팟플레이어 등) 에 주소로 입력해 시청 가능함


덤 1

AirenSoft
On-Premise Online Video Platform

최근 ome 와 ovenplayer를 개발해 공개하던 회사가 OvenVideo 라는 비디오 관리 플랫폼 서비스를 출시함

해당 서비스 내용은 생각중이던 커뮤니티 플랫폼 제작에 용이해보이나 결국 본인이 개발자가 아니고, 자세한 내용까지 나와있지는 않아 이후 관리가 필요해질 때 확인 필요해보임

특히 현 고객으로 SK, KT, 카카오, KBS 등이 있는걸로 보아 일반적인 개인 수준에서 이용할 서비스로 보이지는 않음

덤 2

AV1 - Wikipedia

VP9 등이 망하고 h.26x는 라이센스 문제로 잘 이용되지 않던 중 AV1이 이번 그래픽카드 세대에 들어 하드웨어 인코딩을 지원하기 시작함

오픈소스고 구글 애플 등 여러기업에서 미니 향후 2~3년 내에는 어지간하면 다 지원할 것으로 보임

특히 인코딩의 경우 인텔 Arc, AMD RDNA 3 (7천번대), nVidia ada (4천번대) 에서 지원하며 그중 Arc의 인코더로서의 가성비가 매우 뛰어난 편

나중에 다시 스트리밍 PC를 쓰레드리퍼로 돌리게 된다면 현재 사용중인 A4000에 추가로 A770 생각중