+ 24.07.20 추가, 아래 세팅으로 스트리밍을 할 경우 프레임 드랍이 발생하는 것을 확인했습니다. 원인은 1. 시놀로지 나스에 오븐미디어엔진 도커 이미지를 깔고 PC->나스->외부로 영상을 송출하는 과정에서 오버헤드 현상이 발생. 2. Radium 도커 이미지에 내장된 오븐플레이어가 과거 버전인 탓. 두 가지로 추측됩니다.
현재 저는 프레임 드랍 현상을 해결했습니다. 오븐미디어엔진 컨테이너와 최신 오븐플레이어가 있는 NGINX 웹서버 컨테이너, 두 컨테이너를 윈도우 PC에서 직접 동작하도록 했습니다. 이 과정에서 시놀로지 나스는 단지 역방향 프록시 서버로만 동작합니다.
위 해결 방법을 토대로 아래 가이드를 수정할 예정입니다.
'폐쇄적인 환경'에서 'OBS를 활용해' '저지연', '고화질'로 내 PC 화면을 지인과 실시간 공유하고자 한다면 어떤 방법이 있을까요?
1. 바로 떠오르는 방법이 있죠. 트위치, 치지직, 아프리카TV, 유튜브 같은 상용 스트리밍 서비스를 사용하는 겁니다. 그런데 이 방법은 폐쇄성이 부족합니다. 운영자를 비롯한 불특정 다수가 언제든지 들어와서 내가 공유하는 화면을 볼 수 있으니까요. 레이턴시도 아쉽구요.
유튜브에서 일부 공개로만 방송을 켜서 링크를 공유하는 것도 방법이죠. 허나 유튜브는 레이턴시(화면 지연)가 너무 심합니다. 저작권 침해 소지가 있는 영상을 트는 순간 바로 방송이 다운됩니다.
상기 서비스를 사용하는 것은 포기합시다.
2. 폐쇄성이 문제네요. 원격 화면 공유 프로그램을 써봅시다. 줌이나 디스코드같은 훌륭한 서비스가 있습니다. 폐쇄성은 걱정하지 않아도 되겠습니다. 레이턴시도 낮구요. 이 방법도 단점이 있죠. 화질입니다. 저의 경우 디스코드 니트로를 결제했음에도 화면 공유할때 끊김이나 깍두기 현상이 발생했습니다. 크고 작은 버그도 있었구요. 또한 프레임을 60프레임으로 설정해도 화면이 그다지 부드럽지 않았습니다. OBS 활용도 어려웠습니다.
화질이 중요하지 않거나 저와 같은 문제를 겪고 계신 것이 아니라면, 줌이나 디스코드로 해결보세요. 디스코드 니트로 시험 결제해보시고 결과가 만족스럽다면 이 방법으로 해결보는 게 가장 간단합니다. 보이스 챗도 동시에 해결이 가능하니 좋네요.
저는 화질이 아쉬워서 포기했습니다.
3. 원격 제어 프로그램은 어떨까요? parsec, 문라이트를 쓰는 겁니다. 저는 대부분 이 방법으로 화면 공유 문제를 해결하실 수 있을 거라 생각합니다. 저지연, 고화질, 폐쇄성을 완벽하게 만족하기 때문입니다.
문라이트는 내 PC를 내가 외부에서 조종할 때 쓰기에 적합해보였고, 타인과 화면을 공유하는 용도라면 parsec이 나아보였습니다. parsec을 통해 타인과 원격 제어 연결을 하고 마우스, 키보드 권한을 뺏어 화면만 공유하면 됩니다. 내장 채팅 기능이 있으나 영어만 지원하는데요. 디스코드를 써서 해결하면 됩니다.
이 완벽해보이는 방법의 단점은 단 한 가지입니다. OBS를 활용하지 못한다는 점. 그것만 제외하면 정말 완벽합니다.
4. 어떤 방법이든 아쉬운 점이 다 한가지씩 있군요. 서두로 돌아와서, 1) 폐쇄성 2) OBS 활용 3) 저지연 4) 고화질을 동시에 충족해서 화면을 공유하려면 어떻게 해야할까요?
자체 실시간 스트리밍 서버를 구축하면 됩니다.
이 글에서는 ovenmediaengine을 사용해서 자체 실시간 스트리밍 서버를 구축해보고자 합니다. 시놀로지 NAS와 도커를 활용해서요.
준비물
시놀로지 NAS
도커(Container Manager)
DSM 7.2에서 도커가 컨테이너 매니저로 바뀌었죠. 컨테이너 매니저를 켜고 -> 레지스트리 -> ovenmediaengine 검색 -> latest 태그 버전으로 다운로드 받아줍니다.
파일 스테이션에 들어가면 최상위에 docker 폴더가 있죠. 거기에 폴더명 ome 폴더를 만들고, 안에다가 conf, logs 폴더도 각각 생성해줍니다.
이제 제어판을 켜고->보안->인증서 탭으로 가주세요.
시놀로지 나스를 사용 중이시라면 대부분 *.synology.me 도메인을 사용하고 계실겁니다. 저도 마찬가지구요. 저는 해당 도메인을 사용해서 스트리밍 서버를 구축할 겁니다. 사용중인 인증서를 선택하고 오른쪽 클릭을 해서 '인증서 내보내기'를 누릅니다.
다운로드 받으면 archive라는 압축파일이 받아지는데요. 여기서 3가지 파일. cert.pem, chain.pem, privkey.pem 이 세가지 파일이 필요합니다. 해당 파일들의 압축을 풉니다.
아까 만든 conf 폴더에 세 파일을 그대로 집어넣습니다.
이제 시놀로지 나스에 ssh로 연결합니다. 연결 방법은 다양합니다. putty를 쓰는 방법도 있고, 과거 쓴 글에도 나와있습니다. 접속이 되었다면, 명령어를 입력해줍니다. 아까 만든 폴더에 권한을 부여합니다. 저는 한 줄씩 입력했습니다.
sudo chgrp -R docker /volume1/docker/ome
sudo chmod -R 775 /volume1/docker/ome
아래 명령어도 쳐줍니다. 이것도 한 줄씩 입력했습니다. (한번에 치면 어떻게 될까요? 리눅스를 잘 몰라서 상상이 안 가네요.)
docker run -d --name tmp-ome airensoft/ovenmediaengine:latest
docker cp tmp-ome:/opt/ovenmediaengine/bin/origin_conf/Server.xml /volume1/docker/ome/conf
docker cp tmp-ome:/opt/ovenmediaengine/bin/origin_conf/Logger.xml /volume1/docker/ome/conf
docker rm -f tmp-ome
위 명령어를 다 입력하고 나서 아까 만든 conf 폴더에 두 Server.xml과 Logger.xml 폴더가 만들어지면 됩니다.
이제 파일 스테이션에서 Server.xml을 텍스트 편집기로 열어봅시다.
<Name>*.synology.me</Name>
</Names>
<TLS>
<CertPath>./cert.pem</CertPath>
<KeyPath>./privkey.pem</KeyPath>
<ChainCertPath>./chain.pem</ChainCertPath>
아래로 스크롤을 내리다보면 사용중인 도메인 주소와 인증서 파일 경로를 적는 부분이 있습니다. 도메인 주소는 나스 접속하실때 쓰시는 그 DSM 도메인을 적으시면 됩니다. 인증서 경로는 적힌대로 수정해주세요.
포트포워딩
포트포워딩을 해볼까요. 공유기 페이지로 접속합시다.
저는 kt 공유기를 사용하는데요. 장치설정 -> 트래픽 관리 탭으로 들어가면 포트포워딩 설정을 할 수 있습니다.
소스포트는 비워두고 외부 포트와 내부 포트는 사진에 적힌대로 적어주시면 됩니다. 내부 IP 주소는 나스 내부 IP 주소를 적으면 되겠죠. 프로토콜 설정을 특히 주의해야합니다. TCP와 UDP를 구분해야하기 때문입니다. 필요하다면 1935 포트(TCP)를 추가적으로 열어도 됩니다. 3000번 포트도 추가로 열 수 있다면 열어주세요.
공유기마다 포트포워딩 방법이 다르기 때문에 자세히 설명하기 어렵습니다. 본질적인 요소는 같기 때문에 크게 어렵지는 않을 겁니다.
도커 OME 설치
docker run -d -it --name ome -e OME_HOST_IP=Your.HOST.IP.Address \
-v $OME_DOCKER_HOME/conf:/opt/ovenmediaengine/bin/origin_conf \
-v $OME_DOCKER_HOME/logs:/var/log/ovenmediaengine \
-p 1935:1935 -p 9999:9999/udp -p 9000:9000 -p 3333:3333 -p 3478:3478 \
-p 10000-10009:10000-10009/udp \
airensoft/ovenmediaengine:0.16.3
이게 공식 사이트에서 알려주는 도커 실행 명령어입니다. 0.16.3 버전 기준인데요. 저희 환경에 맞게 조금 바꿔보겠습니다.
docker run -d -it --name ome -e OME_HOST_IP=현재 사용 중인 IP \
-v /volume1/docker/ome/conf:/opt/ovenmediaengine/bin/origin_conf \
-v /volume1/docker/ome/logs:/var/log/ovenmediaengine \
-p 1935:1935 -p 9991:9999/udp -p 9001:9000 -p 3333-3333:3334-3334 -p 3478:3478 \
-p 10000-10009:10000-10009/udp \
airensoft/ovenmediaengine:latest
[현재 사용 중인 IP]를 본인 IP로 수정해주세요. 구글에 'what is my ipv4'를 검색하면 바로 나옵니다.
포트 설정할 게 많죠. 저는 위처럼 작성해서 해결을 봤습니다. 9999/udp는 어디서 쓰고 있는지 충돌이 났고, 9000은 포테이너랑 충돌이 나더군요. 비슷한 숫자로 바꾸었습니다. 아마 따라하시는 분들은 IP만 수정하면 더 수정하실 게 없을 겁니다.
위 명령어는 하나씩 실행하지 않아도 됩니다. 전체를 복사해 실행시킵니다. 정상적으로 실행이 됐다면 'ome' 이름을 가진 컨테이너가 꺼지지 않고 지속적으로 작동할 겁니다.
OBS 설정
스트리밍 서버는 준비가 됐습니다. 이제 PC에서 나스 스트리밍 서버로 소스를 전송해야겠죠. OBS를 다운받아 실행시키고 설정 -> 방송탭으로 갑니다.
전송 프로토콜은 대표적으로 두 가지가 있습니다. RTMP와 SRT입니다. 각 프로토콜에 맞게 서버란과 스트림 키 란에 특정 값을 입력합니다.
1. RTMP 프로토콜
서버 : rtmp://나스 내부 IP주소:1935/app
스트림 키 : stream
2. SRT 프로토콜
서버 : srt://나스 내부 IP 주소:9991?streamid=srt%3A%2F%2F나스 내부 IP 주소%3A9991%2Fapp%2Fstream
스트림 키 : (공백)
어떤 게 더 나은지 세밀한 비교 분석은 하지 못했습니다. srt 프로토콜이 더 최신 기술이라고 합니다. H.265 코덱도 사용이 가능하구요. srt를 쓰는 게 더 나아보이네요.
설정을 마쳤다면 이제 방송 시작을 눌러 소스를 전송해봅시다. 연결에 이상이 없고 지속적으로 데이터를 보내고 있다면 성공입니다. 이제 서버가 클라이언트에게 방송을 송출해야겠죠.
방송 송출 확인
오븐 플레이어 데모 사이트로 접속합니다. 소스를 받은 서버는 Webrtc와 ll-hls로 스트림을 송출하는데요. Playback URL 란에 아래 스트림 주소를 입력하고 ADD SOURCE를 누릅니다. 영상이 나온다면 다 된 겁니다.
1. WebRTC
wss://도메인:3334/app/stream
2. Low-Latency HLS
https://도메인:3334/app/stream/llhls.m3u8
저는 WebRTC 스트림으로 영상을 보는 게 레이턴시가 더 낮았습니다. 시계를 띄워두고 확인해봤는데, 송출 화면에서 시청 화면간 시간 차이가 1초가 살짝 안 되더군요. 해당 스트림을 추천드립니다. 깃북 페이지에서는 WebRTC 포트를 3334가 아니라 3333으로 알려주던데, 저는 3333으로는 연결이 안 되더군요. 참고하시기 바랍니다.
이제 90% 끝났습니다. 다만 영상을 볼때마다 오븐 플레이어 데모 사이트로 접속하는 건 영 아닌 것 같습니다. 그럴듯한 페이지를 만들어 볼까요.
Radium 설치
구글링해보니 어떤 분께서 오븐플레이어 + 채팅창을 구현한 웹서버를 만들어주셨습니다. 잘 써먹어 봅시다. 이 링크로 접속하니 compose 파일을 제공해주는군요. 다운로드 아이콘을 눌러 저장합니다.
제일 처음에 ome 폴더를 만들었던 것처럼 docker폴더 밑에 radium 폴더를 만듭시다. 그리고 compose 파일을 넣습니다. 텍스트 편집기로 열어볼까요.
version: "3.3"
services:
radium:
container_name: radium
ports:
- "3000:3000"
environment:
- "BASE_URL=도메인"
- INITIAL_SOURCE_TYPE=webrtc
- INITIAL_SOURCE_URL=wss 스트림 주소
image: ghcr.io/zibbp/radium:next
한글로 적힌 부분만 수정해줍시다. 도메인은 DSM 도메인을 그대로 적으면 되겠고, wss 스트림 주소는 아까 오븐 플레이어 소스 입력할 때 썼던 그 주소입니다. 저장합니다.
시놀로지에 SSH 연결을 합니다. 아래 명령어를 입력합시다.
cd /volume1/docker/radium
docker-compose up -d
설치가 끝났다면 radium 컨테이너가 실행됩니다. 이제 WebRTC 스트림을 받는 웹 서버가 만들어졌습니다. 도메인:3000 주소로 접속이 될 겁니다. 외부에서 접속하고 싶다면 3000번 포트를 포트포워딩 해주셔야겠죠. 닉네임을 입력하면 웹서버에 접속한 사람들과 함께 영상을 보며 채팅도 칠 수 있습니다. 이모티콘도 있네요.
다들 따라오시느라 고생하셨습니다. 이제 폐쇄성+OBS+저지연+고화질을 만족하는 화면 공유가 가능해졌습니다. 굉장히 만족스럽네요. 해당 소프트웨어를 만들어주신 분들께 감사드립니다.
참고 사이트
https://chocosobo.com/saseol-junggye-seobeo-jeongri/
사설 중계 서버 내용 정리
사용 소프트웨어 * Oven Media Engine (서버) GitHub - AirenSoft/OvenMediaEngine: OvenMediaEngine (OME) is a Sub-Second Latency Live Streaming Server with Large-Scale and High-Definition. #WebRTC #LLHLSOvenMediaEngine (OME) is a Sub-Second Latency Li
chocosobo.com
https://airensoft.gitbook.io/ovenmediaengine/getting-started
Getting Started - OvenMediaEngine
OvenMediaEngine can work with a variety of open-sources and libraries. First, install them on your clean Linux machine as described below. We think that OME can support most Linux packages, but the tested platforms we use are Ubuntu 18+, Fedora 28+, and Ce
airensoft.gitbook.io
따라하다가 안 되면 공식 gitbook 가이드를 우선적으로 참고하시기 바랍니다.
'NAS' 카테고리의 다른 글
시놀로지 나스 UID, GID 알아내는 방법 (0) | 2024.07.19 |
---|---|
시놀로지 나스 SSH 접속 방법 (0) | 2024.07.19 |
시놀로지 나스에서 도커를 활용해 transmission-openvpn 설치하기 (0) | 2023.01.06 |
시놀로지 역방향 프록시 HSTS 오작동 해결 (0) | 2023.01.06 |
시놀로지 나스 도커 transmission-ovpn 웹서버 https 접속하기 (0) | 2022.12.24 |