부트캠프 파이널 프로젝트(채팅 기반 실시간 라이브 커머스 서비스)에 적용할 스트리밍 기술을 알아보던 중 통상적으로 사용되는 RTMP, HLS 기술에 대해 알게되었고 해당 내용을 정리해보았다.
RTMP는 Real Time Messaging Protocol로 Adobe Systems에서 개발한 스트리밍 프로토콜이다. RTMP는 오디오, 비디오 및 기타 데이터를 인터넷을 통해 스트리밍할 때 사용되고 주로 플래시 플레이어와 서버 간의 통신에 사용되었다. TCP기반으로 실시간 양방향 통신을 지원한다. 기본적으로 1935번 포트를 사용하며 혹여 1935번 포트로 시도해서 실패하면 443번 포트(RTMPS) 또는 80번 포트(RTMPT)로 재시도한다.
RTMPS(RTMP Secure) : RTMP 데이터를 HTTPS로 감싼 것.
RTMPT(RTMP Tunneled): RTMP 데이터를 HTTP로 감싼 것.
HLS는 HTTP Live Streaming으로 가장 널리 사용되는 비디오 스트리밍 프로토콜이다. HLS는 비디오 파일을 다운로드 할 수 있는 여러 세그먼트 파일로 분할하고 이 세그먼트 파일을 HTTP를 이용하여 전송한다. 클라이언트 장치는 이러한 세그먼트 파일을 다운로드하여 재생한다.
m3u8 파일과 ts 파일로 구성된다.
m3u8 파일은 분할된 동영상 파일을 어떤 순서로 몇 초간 재생할 것인지에 대한 정보들이 담긴 파일이며
ts 파일은 작은 단위로 분할된 미디어 파일이다.
지속적인 TCP 연결 유지
RTMP는 한 번 연결된 후 소켓을 계속 열어 둔 채로 데이터를 주고 받기 때문에 매번 HTTP 요청/응답을 하지 않아 오버헤드가 적다.
저지연 전송
일반적인 HTTP 스트리밍에 비해 핸드셰이크가 간단하고 재연결 시에도 지연이 크지 않아 실시간성이 뛰어나다.
방화벽, 프록시 문제
기본적으로 1935번 포트를 사용하는데 일부 네트워크 환경에서 해당 포트를 막아둘 수도 있다.
모바일 및 브라우저 지원 제한
Flash 중단 이후 RTMP 네이티브 지워이 사라져 모바일 앱용 라이브러리나 커스텀 Player 모듈이 필요하다. 웹 브라우저에서는 HTML5 Video 태그로 직접 읽을 수 없어 플러그인 또는 별도 JS 라이브러리가 필수이다.
HTTP/HTTPS 기반 전송
기존 웹 서버(80/443번 포트) 위에서 작동하므로 별도 포트 개방없이 바로 사용 가능하다. 또한 모든 HTTP 인프라(로드 밸런서, 프록시, CDN 등)를 그대로 활용할 수 있다.
적응형 비트레이트(Adaptive Bitrate)
네트워크 상태나 디바이스 성능에 따라 여러 해상도, 비트레이트 버전을 준비해두고 플레이어가 자동으로 최적 버전으로 전환한다.
DRM(Digital Rights Management) 지원
다양한 DRM 기술을 통해 콘텐츠의 저작궈 보호를 지원한다.
높은 호환성
iOS에서는 네이티브로 HLS를 지원하며 Android, 웹 브라우저(HTML5 Video)에서도 재생할 수 있다.
높은 지연(5~30초)
일반적으로 6초 정도 길이의 세그먼트로 나누어지고 플레이어가 3~4개 정도의 세그먼트를 미리 버퍼링하는 구조로 인해 지연이 크게 늘어난다.
세그먼트 관리 복잡도
매 세그먼트를 주기적으로 생성, 업로드하고 플레이리스트(m3u8)를 갱신하는 로직이 필요하다.
스프링 서버는 송출자의 웹캠(카메라)에 직접적으로 접근할 수 없기 때문에 웹 브라우저에서 웹캠 영상을 캡처한 후 이를 스프링 서버의 백엔드 단으로 영상을 전송해줘야 한다.
이 때 이용하는 것이 WebSocket이다.
인코더는 원본 영상을 정해진 방식으로 압축하고 압축한 영상을 미디어 서버로 전송하는 역할을 한다.
카메라로 촬영한 원본 영상을 그대로 미디어 서버로 전송하기에는 용량이 너무 크기 때문에 압축을 해야하는데 이 때 미디어 서버에서 해석할 수 있는 압축 방식(코덱)을 사용해야 한다.
주로 쓰이는 코덱은 H.264/AAC이다. H.264는 비디오 코덱, AAC는 오디오 코덱이다.
인코더로는 FFmpeg를 사용한다. CLI 기반이라 Spring Server에서 스크립트로 실행하기에 용이하다.
WebSocket으로 받은 영상을 FFmpeg를 통해 인코딩하고 RTMP(Real Time Messaging Protocol)로 미디어 서버에 송출한다.
미디어 서버는 인코더가 보내중 영상을 여러 가지 화질 및 비트레이트로 변환하거나 HLS 형식으로 변환하는 역할을 한다.
HLS(HTTP Live Streaming)으로 변환하는 이유는 RTMP는 웹 브라우저에서 직접 재생을 할 수 없기 때문이다.
HLS는 HTTP 기반으로 웹 브라우저에서 직접 재생이 가능하기 때문에 HLS로 변환을 해줘야한다.
HLS는 웹 브라우저에서 재생이 가능하므로 Javascript를 이용하여 재생할 수 있다.
hls.js와 같은 라이브러리를 사용하여 구현하면 된다.
서비스 페이지의 도메인과 영상이 전송되는 도메인이 다르면 CORS 문제로 재생이 되지 않아 설정을 해주어야 한다.
https://ko.wikipedia.org/wiki/%EB%A6%AC%EC%96%BC_%ED%83%80%EC%9E%84_%EB%A9%94%EC%8B%9C%EC%A7%95_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C
https://www.cloudflare.com/ko-kr/learning/video/what-is-http-live-streaming/
https://luvstudy.tistory.com/173
https://realizetoday.tistory.com/6
https://realizetoday.tistory.com/11
https://qteveryday.tistory.com/372