<aside> 💡
RTMP에 대한 자세한 내용은 다음 페이지에 있습니다.
RTMP(Real Time Messaging Protocol)
</aside>
RTMP 서버의 경우 NGINX-RTMP를 사용했지만, HLS 변환은 shell에서 FFmpeg가 돌아가며 처리할 수 있도록 구현했습니다.(exec ffmpeg)
NGINX-RTMP에서 바로 HLS 변환이 가능하지만 저는 이 기능을 쓰니 unknown process 5327 exited on signal 9
다음 에러가 발생하여(아마 메모리 부족으로 인한 현상으로 보입니다.) shell에서 따로 FFmpeg를 돌려 HLS변환을 했습니다.
<aside> 💡
마찬가지로 spring boot 내부에서 직접적으로 NGINX 없이 RTMP 통신을 만들 수 있지만 이는 이미 NGINX-RTMP라는 잘 만들어진 NGINX 모듈이 있기 때문에 따로 기능을 수정하고 싶은 부분은 NGINX-RTMP에서 설정을 건드는 것이 더 좋아보입니다.
또한 spring boot 내부에서 FFmpegBuilder
를 통해 HLS 변환이 가능하지만 이번 경우에는 ProcessBuilder
를 통해 shell에서 FFmpeg를 돌렸습니다.
spring boot에서 FFmpegBuilder
를 사용하는 예제는 다음 페이지를 봐주십시오.
</aside>
Nginx-RTMP는 보통 Nginx에 RTMP ****모듈을 포함해서 빌드하거나, 이미 모듈이 들어있는 패키지를 설치해서 사용합니다. 이번에는 직접 빌드해보겠습니다.
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g zlib1g-dev git
wget <http://nginx.org/download/nginx-1.25.3.tar.gz>
tar -zxvf nginx-1.25.3.tar.gz
git clone <https://github.com/arut/nginx-rtmp-module.git>
cd nginx-1.25.3
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module
make
sudo make install
worker_processes auto;
events {
worker_connections 1024;
}
# nginx stop
# sudo /usr/local/nginx/sbin/nginx -s stop
# nginx start
# sudo /usr/local/nginx/sbin/nginx
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
# 방송 시작 인증 (2xx => 통과, 그 외 => 차단)
on_publish <http://127.0.0.1:8080/rtmp2/auth>;
# FFmpeg로 HLS(다변환) 생성: <stream_key> 별 디렉터리에 저장
# exec /usr/bin/ffmpeg -i rtmp://127.0.0.1:1935/$app/$name
# -c:v libx264 -preset ultrafast -s 854x480 -c:a aac -b:a 128k
# -f hls -hls_list_size 3 -hls_time 3
# -hls_segment_filename "/var/www/hls/$name/segment_%03d.ts"
# "/var/www/hls/$name/playlist.m3u8";
# 방송 종료 훅(선택): 정리/로그용
on_publish_done <http://127.0.0.1:8080/rtmp2/done>;
}
}
}
# http {
# server {
# listen 8081;
# # HLS 정적 서빙
# location /hls/ {
# # CORS (필요 시)
# add_header Access-Control-Allow-Origin *; //add_header Access-Control-Allow-Origin *;
# add_header Cache-Control no-cache; //.m3u8과 .ts가 계속 새로 만들어지는 경우(라이브 스트리밍) 브라우저 캐시 때문에 갱신 안 되는 걸 방지.
# types {
# application/vnd.apple.mpegurl m3u8;
# video/mp2t ts;
# }
# root /var/www; # => /var/www/hls/.. 로 매핑
# autoindex off; //브라우저에서 /hls/로 접근했을 때 폴더 구조가 보이지 않게 함.
# }
# }
# }
nginx.conf는 보통
/usr/local/nginx/conf/nginx.conf
또는
/home/사용자/nginx/conf/nginx.conf
에 있습니다.