RTMP 스트리밍 개요
RTMP(Real-Time Messaging Protocol)는 실시간 전송 프로토콜로, 주로 오디오, 비디오 및 데이터 전송에 사용된다. 스트리밍 서버와 클라이언트 간의 저지연성을 유지하며 비디오나 오디오 콘텐츠를 전송하는 데 매우 적합한 프로토콜이다. RTMP는 주로 라이브 스트리밍 플랫폼에서 사용되며, FFMPEG을 통해 RTMP 스트림을 송출하는 것은 매우 일반적인 작업이다.
RTMP 스트리밍 설정
- RTMP 서버 준비
RTMP 스트리밍을 설정하기 위해서는 먼저 RTMP 서버가 필요하다. 대표적인 RTMP 서버로는 NGINX RTMP 모듈을 사용할 수 있다. 이 서버는 비디오 콘텐츠를 RTMP 프로토콜을 통해 클라이언트에게 전달한다.
RTMP 서버를 설정한 후, 해당 서버에 연결할 URL을 기억해야 한다. 일반적으로 URL 형식은 다음과 같다:
rtmp://[서버 IP 또는 도메인]/[앱 이름]/[스트림 키]
예를 들어, rtmp://192.168.0.1/live/mystream
와 같은 형식이다.
- FFmpeg를 사용한 RTMP 스트림 송출
FFMPEG을 사용해 비디오 또는 오디오 콘텐츠를 RTMP 서버에 전송하려면 다음과 같은 명령어 구조를 사용할 수 있다.
ffmpeg -re -i [입력 파일] -c:v [비디오 코덱] -c:a [오디오 코덱] -f flv rtmp://[서버 주소]/[앱 이름]/[스트림 키]
여기서 중요한 옵션들을 살펴보면:
-re
: 입력 파일을 실시간 스트림처럼 처리하여 원래의 재생 속도로 인코딩 및 전송한다.-i
: 입력 파일 경로 또는 라이브 소스(예: 웹캠 또는 비디오 캡처 장치)이다.-c:v
: 비디오 코덱이다. 일반적으로 H.264를 의미하는libx264
를 사용한다.-c:a
: 오디오 코덱이다. 일반적으로 AAC를 의미하는aac
를 사용한다.-
-f flv
: RTMP 프로토콜은 기본적으로 FLV 포맷을 사용하므로, 출력 포맷을flv
로 설정한다. -
비디오 코덱 설정
RTMP 스트리밍에서 비디오 코덱을 설정할 때는 주로 H.264 코덱을 사용한다. H.264는 높은 압축 효율성과 우수한 품질을 제공하므로, 대부분의 스트리밍 플랫폼에서 권장된다.
-c:v libx264 -preset veryfast -b:v 2500k -maxrate 2500k -bufsize 5000k
-preset
: 인코딩 속도와 품질 간의 균형을 조절한다.veryfast
,faster
,fast
,medium
,slow
등 다양한 설정이 있으며, 빠른 속도와 낮은 품질의 균형을 잡을 수 있다.-b:v
: 비디오 비트레이트를 설정한다. 예를 들어,2500k
는 2500 kbps의 비트레이트를 의미한다.-maxrate
: 비트레이트 상한을 설정한다. 이는 순간적인 비트레이트 증가를 제한한다.-
-bufsize
: 비디오 버퍼의 크기를 설정한다. 이는 전송 안정성에 영향을 미칠 수 있다. -
오디오 코덱 설정
오디오 코덱으로는 AAC 코덱이 일반적으로 사용된다. 이는 대부분의 스트리밍 플랫폼에서 호환성이 좋기 때문이다. FFMPEG에서 AAC 코덱을 사용할 때는 다음과 같이 설정한다.
-c:a aac -b:a 128k
-c:a
: 오디오 코덱을 설정한다. AAC를 의미하는aac
를 사용한다.-
-b:a
: 오디오 비트레이트를 설정한다.128k
는 128 kbps의 비트레이트를 의미한다. -
해상도 및 프레임 레이트 설정
RTMP 스트리밍에서는 해상도와 프레임 레이트를 적절히 설정해야 한다. 이는 네트워크 환경과 스트리밍 품질에 영향을 미친다. 예를 들어, 720p 해상도와 30 FPS로 설정하려면 다음과 같이 명령어를 구성할 수 있다.
-vf scale=1280:720 -r 30
-vf scale
: 비디오 해상도를 설정한다.1280:720
은 720p 해상도를 의미한다.-r
: 프레임 레이트를 설정한다.30
은 30 FPS를 의미한다.
HTTP 스트리밍 개요
HTTP 스트리밍은 RTMP와는 달리 HTTP 프로토콜을 통해 데이터를 전송하는 방식이다. HTTP 기반 스트리밍 기술로는 주로 HLS(HTTP Live Streaming)와 DASH(Dynamic Adaptive Streaming over HTTP)가 사용된다. HTTP 스트리밍은 전송 중단 후 재개 기능이나 네트워크 환경에 맞춘 적응형 비트레이트 전송 등의 장점이 있어, 다양한 네트워크 환경에서 안정적인 스트리밍이 가능한다.
HTTP 스트리밍 설정
- HLS 스트리밍 설정 HLS는 Apple에서 개발한 HTTP 기반 스트리밍 프로토콜로, 작은 세그먼트로 나눈 비디오 파일과 이를 관리하는 플레이리스트 파일을 사용하여 스트리밍을 진행한다.
FFMPEG으로 HLS 스트리밍을 설정하는 기본 명령어는 다음과 같다:
ffmpeg -i [입력 파일] -c:v [비디오 코덱] -c:a [오디오 코덱] -f hls -hls_time [세그먼트 시간] -hls_playlist_type [플레이리스트 타입] [출력 파일].m3u8
여기서 중요한 옵션들을 살펴보면:
-f hls
: 출력 포맷을 HLS로 설정한다.-hls_time
: 각 세그먼트의 길이를 초 단위로 설정한다. 예를 들어,10
이면 각 세그먼트가 10초로 나눠진다.-hls_playlist_type
:vod
또는event
타입을 설정한다. VOD(Video On Demand)로 설정하면 모든 세그먼트가 플레이리스트에 포함되며, 이벤트 모드에서는 실시간 스트리밍용으로 최근 세그먼트만 유지된다.
예를 들어, 10초마다 세그먼트를 생성하고, VOD 모드로 스트리밍을 준비하는 명령어는 다음과 같다:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_playlist_type vod output.m3u8
- DASH 스트리밍 설정 DASH는 HTTP 기반의 또 다른 스트리밍 프로토콜로, 네트워크 상태에 따라 스트리밍 품질을 조절할 수 있는 적응형 스트리밍을 지원한다. FFMPEG을 사용하여 DASH 스트리밍을 설정할 때는 다음과 같은 명령어를 사용할 수 있다:
ffmpeg -i [입력 파일] -c:v [비디오 코덱] -c:a [오디오 코덱] -f dash [출력 파일].mpd
-f dash
: 출력 포맷을 DASH로 설정한다..mpd
: DASH 스트리밍에서 사용하는 미디어 프레젠테이션 설명(manifest) 파일이다. 이 파일은 플레이어가 재생할 미디어 세그먼트를 정의한다.
DASH 스트리밍 예시는 다음과 같다:
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f dash output.mpd
이 명령어는 input.mp4
파일을 output.mpd
로 DASH 스트리밍 설정을 적용한다.
- 비트레이트 적응 스트리밍 HTTP 스트리밍의 강력한 기능 중 하나는 네트워크 상태에 따라 자동으로 비트레이트를 조정하는 적응형 비트레이트 스트리밍이다. 이 기능을 구현하려면 다양한 비트레이트로 인코딩된 여러 버전의 비디오 파일을 생성하고, 이를 적응형 스트리밍을 지원하는 플레이리스트나 매니페스트 파일에 포함시켜야 한다.
예를 들어, HLS에서 이를 구현하려면 서로 다른 비트레이트로 인코딩된 여러 비디오 버전을 생성한 후, 각각을 세그먼트로 나누고 이를 플레이리스트 파일에서 참조한다:
ffmpeg -i input.mp4 -vf scale=1920:1080 -c:v libx264 -b:v 5000k -f hls -hls_time 10 -hls_playlist_type vod output_1080p.m3u8
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -b:v 2500k -f hls -hls_time 10 -hls_playlist_type vod output_720p.m3u8
이와 같이 서로 다른 해상도와 비트레이트로 비디오를 인코딩한 후, 플레이리스트 파일을 작성하여 적응형 스트리밍을 지원할 수 있다.
- HTTP 스트리밍 서버 설정 HTTP 스트리밍은 단순한 웹 서버에서도 구현할 수 있다. Apache 또는 NGINX와 같은 HTTP 서버를 사용하여 HLS 또는 DASH 스트리밍 파일을 서빙할 수 있으며, 해당 파일을 클라이언트 측에서 접근할 수 있도록 설정하면 된다.
NGINX HTTP 서버에서 HLS 스트리밍을 설정하는 기본 과정은 다음과 같다:
- NGINX 설치 및 구성 파일 수정
- HLS 세그먼트 및 플레이리스트 파일을 특정 디렉토리에 저장
- 해당 디렉토리를 웹 서버로 공개
이후, 생성된 .m3u8
또는 .mpd
파일에 클라이언트가 접근하여 비디오 스트림을 재생할 수 있다.
HTTP 스트리밍 클라이언트 설정
-
HLS 스트리밍 클라이언트
HLS 스트리밍은 Apple 제품에서 기본적으로 지원되며, 대부분의 웹 브라우저 및 미디어 플레이어에서도 HLS 스트리밍을 재생할 수 있다. FFMPEG으로 생성된.m3u8
파일은 브라우저나 미디어 플레이어에서 직접 스트리밍된다.
대표적인 HLS 재생 방법: -
브라우저 기반 재생: 현대적인 웹 브라우저(Chrome, Safari 등)는 HLS 플레이어 플러그인을 사용하여 HLS 스트리밍을 재생할 수 있다. JavaScript 기반의 hls.js 라이브러리를 통해 HLS 스트리밍을 재생할 수 있다.
```html
```
-
VLC 미디어 플레이어: VLC는 HLS 스트리밍을 기본적으로 지원하는 오픈 소스 미디어 플레이어이다. 생성된
.m3u8
파일 경로를 VLC에서 열면 재생이 가능한다. -
DASH 스트리밍 클라이언트
DASH 스트리밍은 현대적인 비디오 플레이어와 웹 브라우저에서 지원된다. dash.js는 DASH 재생을 지원하는 JavaScript 라이브러리로, 웹 페이지에서 쉽게 DASH 스트리밍을 재생할 수 있다.
다음은 dash.js를 이용한 DASH 스트리밍의 기본 코드이다:
```html
```
- MPV: MPV는 오픈 소스 미디어 플레이어로, DASH 스트리밍도 지원한다. 생성된
.mpd
파일을 MPV에서 열어 스트리밍을 재생할 수 있다.
비트레이트, 해상도 설정 시 주의사항
HTTP 스트리밍에서 중요한 요소 중 하나는 네트워크 대역폭과 사용자 환경에 적절한 비트레이트와 해상도를 설정하는 것이다. 고해상도 비디오와 높은 비트레이트는 고속 네트워크 환경에서 좋은 품질을 제공하지만, 낮은 대역폭에서는 끊김 현상이 발생할 수 있다.
-
적응형 비트레이트 사용
적응형 스트리밍에서는 클라이언트의 네트워크 상태를 실시간으로 모니터링하여 자동으로 비트레이트를 조정한다. 이 방식은 서버에서 여러 해상도의 비디오 버전을 제공하고, 클라이언트는 네트워크 상태에 맞는 비디오 버전을 선택하여 재생한다. -
최적의 해상도 설정
해상도는 스트리밍 품질에 가장 큰 영향을 미치는 요소 중 하나이다. 일반적으로 다음과 같은 해상도와 비트레이트를 권장한다: -
1080p: 1920x1080 해상도, 4,500 - 9,000 kbps 비트레이트
- 720p: 1280x720 해상도, 2,500 - 5,000 kbps 비트레이트
- 480p: 854x480 해상도, 1,000 - 2,500 kbps 비트레이트
-
360p: 640x360 해상도, 600 - 1,000 kbps 비트레이트
-
네트워크 환경 고려
HTTP 스트리밍 설정에서 가장 중요한 부분은 네트워크 환경이다. 모바일 네트워크나 저속 인터넷 환경에서도 스트리밍이 원활하게 이루어질 수 있도록 다양한 비트레이트의 비디오를 준비하는 것이 필요하다.