<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 를 사용하는 예제는 다음 페이지를 봐주십시오.

HLS, FFmpeg 구현

</aside>

1. RTMP 서버(NGINX-RTMP)

Nginx-RTMP는 보통 Nginx에 RTMP ****모듈을 포함해서 빌드하거나, 이미 모듈이 들어있는 패키지를 설치해서 사용합니다. 이번에는 직접 빌드해보겠습니다.

  1. 필요 패키지 설치
sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g zlib1g-dev git
  1. NGINX 소스 & nginx-rtmp-module 다운로드
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>
  1. NGINX 빌드 & 설치
cd nginx-1.25.3
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module
make
sudo make install
  1. nginx.conf 설정
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에 있습니다.