
기존 Nginx를 이용해 RTMP -> HLS 송출하는 방식이 지연시간이 7초정도 발생하여 지연시간을 줄이고자 SRT송출을 하기로 결정.
기존 Mac에서 구축이 아닌 Ubuntu 20.04.6에서 진행
[Ubuntu 20.04.6]
필수 패키지 설치
sudo apt update
sudo apt install tclsh pkg-config cmake libssl-dev build-essential
SRT-LIVE-SERVER는 SRT 라이브러리에 의존하기 때문에 SRT 라이브러리 설치
git clone https://github.com/Haivision/srt.git
cd srt
./configure
make
sudo make install
SRT-LIVE-SERVER 설치
git clone https://github.com/Edward-Wu/srt-live-server.git
cd srt-live-server
make
컴파일 후 srt-live-server/bin 위치에 실행파일 생성과 sls.conf를 통해 구성할 수 있음.
srt { #SRT
worker_threads 1;
worker_connections 300 ;
log_file logs/error.log ;
log_level info;
#stat_post_url http://192.168.31.106:8001/sls/stat;
#stat_post_interval 5;#s
record_hls_path_prefix /tmp/mov/sls; # 녹화될 .m3u8 위치 설정
#vod file name: /tmp/mov/sls/$listen/$domain_publisher/$app_publisher/$stream_name/vod.m3u8
# 송출중에는 vod.m3u8.extinfo 파일이 생성, 업데이트 진행됨
# 송출이 끝난 후 vod.m3u8 생성
server {
listen 8080; # 사용포트(자신이 원하는 포트 설정)
latency 20; #ms
domain_player live.sls.com live-1.sls.com; # 송출받을 주소 설정
domain_publisher uplive.sls.com; # 송출 할 주소 설정
backlog 100; #accept connections at the same time
idle_streams_timeout 10;#s -1: unlimited
#on_event_url http://192.168.31.106:8000/sls/on_event; #?method=on_connect|on_close&role_name=&srt_url=%s
app {
app_player live ;
app_publisher live ;
record_hls off;#on, off
record_hls_segment_duration 10; #unit s
}
}
}
설정 포트 열기
sudo ufw allow 8080/tcp
사용하는 서버가 공유기 이용 시 포트포워드 설정 필요함.
sls.conf 구성이 끝나면 서버 실행
작업종료 : Ctrl + C
srt-live-server/bin ./sls -c ../sls.conf
송출 주소는 아래와 같음
#송출
srt://[호스트 주소]:[포트]?streamid=uplive.sls.com/live/[스트림 ID]
ex) srt://127.0.0.1:8080?streamid=uplive.yys.com/live/yys
#송출 받는 쪽
srt://[호스트 주소]:[포트]?streamid=live.sls.com/live/[스트림 ID]
ex) srt://127.0.0.1:8080?streamid=live.yys.com/live/yys
#streamid = live.sls.com/live/[스트림 ID] 부분은 sls.conf 파일의 domain 설정 부분에서 변경 가능
송출 테스트는 OBS에서 테스트 해볼 수 있으며, Mac의 경우 VLC를 통해 확인이 가능함.
OBS : https://obsproject.com/ko/download
VLC : https://www.videolan.org/vlc/download-macosx.ko.html
VLC 재생 방법 : 파일 -> 네트워크 열기 -> ex) srt://127.0.0.1:8080?streamid=live.yys.com/live/yys

on_event_url 기능을 이용해 서버에 연결된 정보를 컨트롤 할 수 있다.
# 여기서의 주소는 서버의 주소
on_event_url http://192.168.31.106:8000/sls/on_event; #?method=on_connect|on_close&role_name=&srt_url=%s
설정한 주소로 on event(연결 여부), role name(송출, 시청)등을 서버로 게시함. 이때 http 응답 코드 200, OK가 반환되지 않으면 연결이 거부된다.
Python Flask로 간단한 관리 서버를 구축해 서버에 게시 여부를 Firebase Realtime Databasef에 기록하도록 설정하였음.
from flask import Flask, request
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
cred = credentials.Certificate("yys/PetCamFirebaseKey.json")
firebase_admin.initialize_app(cred, {
'databaseURL': 'https://petcam-f08b7-default-rtdb.firebaseio.com/'
})
ref = db.reference('PetCam/Users/')
app = Flask(__name__)
@app.route('/sls/on_event', methods=['POST'])
def handle_sls_event():
#golobal ref, cred
method = request.args.get('on_event')
role_name = request.args.get('role_name')
if role_name == "player":
return "OK", 200
srt_url = request.args.get('srt_url')
#remote_ip = request.args.get('remote_ip')
#remote_port = request.args.get('remote_port')
prefix = "uplive.yys.com/live/"
if prefix in srt_url:
data_after_prefix = srt_url.split(prefix)[1]
parts = data_after_prefix.split('@')
ch = "{0}/CamList/{1}/srt".format(parts[0], parts[1])
print("ch : ", ch)
if method == "on_connect" and role_name == "publisher" :
ref.child(ch).set(1)
elif method == "on_close" and role_name == "publisher" :
ref.child(ch).set(0)
return "OK", 200
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
iOS에서 SRT를 직접적으로 지원을 하지 않기 때문에 HLS로 변환해야 유동적으로 관리가 가능한데 변환 과정이 쉽지 않아 실패하였다.
sls.conf 파일에는 record_hls 옵션이 있는데 이는 SRT 송출 파일을 HLS로 기록해 .m3u8파일로 저장한다.
이는 송출중에는 .ts, vod.m3u8.extinfo 파일을 생성, 업데이트를 한다. 송출이 끝나면 vod.m3u8 파일을 생성한다.
그래서 Nginx를 이용해 .m3u8 파일을 송출할 수 있다.
http {
server {
listen 80;
server_name diddbstjr55.iptime.org; # 실제 사용하는 도메인으로 변경.
location /hls/ {
#alias /tmp/mov/sls/8080/uplive.yys.com/live/; # HLS 파일이 저장된 기본 경로
alias /tmp/hls/;
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
}
Swift UIKit 기반의 SRT 송출, 시청
( https://velog.io/@diddbstjr55/Swift-SRT-%EC%86%A1%EC%B6%9C )