"์ปจํธ๋กค" ํ๋กํ ์ฝ์ ๊ฐ๊น์.
โ ์์/์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ค์ด๋๋ฅด๊ธฐ๋ณด๋ค๋ ์ฌ์, ์ผ์์ ์ง, ์ค์ง ๊ฐ์ ๋ช
๋ น ์ ์ด์ ์ง์ค.
๋ณดํต RTP(Real-time Transport Protocol)๋ ์ง๊ฟ์ผ๋ก ์ฌ์ฉ.
์ค์ ์์ ๋ฐ์ดํฐ๋ RTP๋ก ์ ๋ฌํ๊ณ , RTSP๋ ๊ทธ๊ฑธ ๊ด๋ฆฌ.
CCTV, IP ์นด๋ฉ๋ผ, ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ์์คํ . (๋คํธ์ํฌ ์นด๋ฉ๋ผ ์ฃผ์๊ฐ rtsp://...์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์.)
๋ฎ์ ์ง์ฐ ์๊ฐ(์๋ฐฑ ms ์์ค). ๋ค๋ง ๋ฐฉํ๋ฒฝ์ด๋ NAT ํ๊ฒฝ์์ ์ ๋งํ๊ธฐ๋ ํจ.
์๋ Adobe Flash Player ์ฉ์ผ๋ก ๋ง๋ "๋ฐ์ดํฐ ์ ์ก" ํ๋กํ ์ฝ.
โ ์์/์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์
๋ก๋ํ๊ฑฐ๋ ๋ด๋ ค๋ฐ์ ๋ ์ง์ ์.
TCP ๊ธฐ๋ฐ, ์์ฒด ํฌ๋งท์ผ๋ก ์ ์ก. ์ง๊ธ์ HLS/DASH ๊ฐ์ ํ์ค ์คํธ๋ฆฌ๋ฐ์ผ๋ก ๋ณํํ ๋ ์ ๋ก๋(ingest) ํ๋กํ ์ฝ๋ก ์์ฃผ ์ฌ์ฉ.
์ ํ๋ธ ๋ผ์ด๋ธ, ํธ์์น, ํ์ด์ค๋ถ ๋ผ์ด๋ธ ๋ฑ ๋ฐฉ์ก ํ๋ซํผ ์ก์ถ.
์ง์ฐ ์๊ฐ์ RTSP๋ณด๋ค ์ฝ๊ฐ ํฌ์ง๋ง(1~5์ด), ๋ฒ์ฉ ์ง์์ด ์ข๊ณ ์์ ์ ์. ๋ฐฉํ๋ฒฝ ์ฐํ๋ ์๋์ ์ผ๋ก ์ฌ์.
Debian/Ubuntu์์ ์ ๊ณตํ๋ Nginx์ฉ RTMP ๋์ ๋ชจ๋ ํจํค์ง๋ค.
์
์คํธ๋ฆผ ์คํ์์ค์ธ nginx-rtmp-module(์ผ๋ฐ์ ์ผ๋ก arut/nginx-rtmp-module)์ ๋ฐฐํฌํ ํฌ๋งท์ผ๋ก ๋ฌถ์ด๋ ๊ฒ์ด๋ผ ๋ณด๋ฉด ๋จ.
sudo apt update
sudo apt install -y nginx libnginx-mod-rtmp ffmpeg
sudo mkdir -p /var/www/hls
sudo chown -R www-data:www-data /var/www/hls
๋์ ๋ชจ๋ ๋ก๋ฉ + RTMP ์ธ์ ฏ + FFmpeg ์๋ ๋ณํ + HLS ์๋น
# ๋์ RTMP ๋ชจ๋ ๋ก๋ (Ubuntu/Debian ํ์ค ๊ฒฝ๋ก)
load_module modules/ngx_rtmp_module.so;
worker_processes auto;
events { worker_connections 1024; }
# ---------- RTMP(Ingest) ์ด ๋ถ๋ถ์ ์์ ์๋ก ์ถ๊ฐ ----------
rtmp {
server {
listen 1935; # RTMP default ํฌํธ
chunk_size 4096;
application live {
live on; # publish/play ํ์ฉ
record off;
# (์ ํ) ํผ๋ธ๋ฆฌ์ ์ธ์ฆ HTTP ์ฝ๋ฐฑ ์์
# on_publish http://127.0.0.1:8080/auth?name=$name&key=$arg_key;
# ์คํธ๋ฆผ์ด ๋ค์ด์ค๋ฉด ์คํธ๋ฆผ ์ด๋ฆ($name)๋ณ๋ก FFmpeg๋ฅผ ๋์ HLS๋ฅผ ์์ฑ
# : ABR(1080/720/480) 3์ข
, 2์ด ์ง๋ฆฌ ์ธ๊ทธ๋จผํธ, ์ค๋๋ ์ธ๊ทธ๋จผํธ ์ญ์
exec_kill_signal term;
exec /usr/bin/ffmpeg -loglevel error -hide_banner \
-reconnect 1 -reconnect_streamed 1 -reconnect_on_network_error 1 \
-i rtmp://127.0.0.1/live/$name \
-c:v libx264 -preset veryfast -profile:v high -level 4.1 -pix_fmt yuv420p \
-sc_threshold 0 -g 60 -keyint_min 60 \
-c:a aac -ar 48000 -ac 2 -b:a 128k \
-filter:v:0 "scale=w=-2:h=1080" -b:v:0 6000k -maxrate:0 6420k -bufsize:0 12000k \
-filter:v:1 "scale=w=-2:h=720" -b:v:1 3500k -maxrate:1 3740k -bufsize:1 7000k \
-filter:v:2 "scale=w=-2:h=480" -b:v:2 1200k -maxrate:2 1320k -bufsize:2 2400k \
-map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 \
-hls_time 2 -hls_list_size 6 \
-hls_flags delete_segments+program_date_time+independent_segments \
-master_pl_name "$name/master.m3u8" \
-var_stream_map "v:0,a:0 name:1080p v:1,a:1 name:720p v:2,a:2 name:480p" \
-hls_segment_type mpegts \
-hls_segment_filename "/var/www/hls/$name/v%v/seg_%06d.ts" \
"/var/www/hls/$name/v%v/index.m3u8";
}
}
}
# ---------- HLS ์๋น(HTTP) ์ผ๋ถ ์ต์
์ถ๊ฐ ----------
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server {
listen 80;
server_name _;
# HLS ์ ์ ํ์ผ ์ ๊ณต
location /hls/ {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /var/www/hls/;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers *;
}
}
}
sudo nginx -t && sudo systemctl reload nginx
ํธ์๊ฐ ์ฑ๊ณตํ๋ฉด HLS๋ ๋ค์ ๊ฒฝ๋ก์ ์๊ธด๋ค.
exec๋ฅผ ์ฐ์ง ์๊ณ , ๊ณ ์ ์คํธ๋ฆผ์ ๋ณ๋ ์๋น์ค๋ก ๋๋ฆฌ๋ ๋ฐฉ๋ฒ
์ด๊ฒ ํจ์ฌ ๋ณด๊ธฐ๊ฐ ์ข์.
๋์ถฉ -p ์ต์
์ผ๋ก /usr/local/bin/rtmp2hls.sh ์์ฑ
#!/usr/bin/env bash
set -Eeuo pipefail
IN="rtmp://127.0.0.1/live/mystream" # OBS๊ฐ ํธ์ํ๋ RTMP
OUTDIR="/var/www/hls/mystream"
mkdir -p "$OUTDIR"
exec /usr/bin/ffmpeg -loglevel error -hide_banner \
-reconnect 1 -reconnect_streamed 1 -reconnect_on_network_error 1 \
-i "$IN" \
-c:v libx264 -preset veryfast -profile:v high -level 4.1 -pix_fmt yuv420p \
-sc_threshold 0 -g 60 -keyint_min 60 \
-c:a aac -ar 48000 -ac 2 -b:a 128k \
-hls_time 2 -hls_list_size 6 \
-hls_flags delete_segments+program_date_time+independent_segments \
-f hls -hls_segment_filename "$OUTDIR/seg_%06d.ts" \
"$OUTDIR/index.m3u8"
๊ถํ ์ถ๊ฐ
sudo chmod +x /usr/local/bin/rtmp2hls.sh
์๋น์ค ํ์ผ(.ini) ์์ฑ
# /etc/systemd/system/rtmp2hls.service
[Unit]
Description=RTMP -> HLS (FFmpeg)
After=network.target nginx.service
[Service]
User=www-data
Group=www-data
ExecStart=/usr/local/bin/rtmp2hls.sh
Restart=always
RestartSec=2
WorkingDirectory=/var/www/hls
[Install]
WantedBy=multi-user.target
๋ฐ๋ชฌ ๋ก๋ ํ ์๋น์ค ์๋ ๋ฑ๋ก ๋ฐ ์คํ
sudo systemctl daemon-reload
sudo systemctl enable --now rtmp2hls
๊ถํ: /var/www/hls์ www-data(๋๋ Nginx/FFmpeg๊ฐ ๋๋ ์ฌ์ฉ์) ์ฐ๊ธฐ ๊ถํ์ด ์์ด์ผ ํจ.
๊ฒฝ๋ก: load_module modules/ngx_rtmp_module.so;๊ฐ ์คํจํ๋ฉด modules ๊ฒฝ๋ก(๋๊ฐ /usr/lib/nginx/modules/)๋ฅผ ํ์ธ.
CORS: ์น ํ๋ ์ด์ด์์ ํฌ๋ก์ค๋๋ฉ์ธ ์์ฒญ์ด๋ฉด /hls/์ CORS ํค๋ ์ถ๊ฐ(์ ์์ ํฌํจ).
ํคํ๋ ์ ๊ฐ๊ฒฉ: ์ธ๊ทธ๋จผํธ ๊ธธ์ด(์: 2์ด)์ ์ ์๋ฐฐ๋ก -g(GOP) ๋ง์ถ๋ ๊ฒ์ด ์์ ์ .
์ฑ๋ฅ: -preset veryfast๋ถํฐ ์์ํด์ ์ฌ์ ๋๋ฉด faster/fast๋ก ์ฌ๋ฆฌ๊ธฐ.
๋ธ๋ผ์ฐ์ RTMP: ๋ถ๊ฐ. ์น์ HLS(๋๋ LL-HLS/WEBRTC)๋ฅผ ์ฌ์ฉ.