RTMP 스트리밍 개요

RTMP(Real-Time Messaging Protocol)는 실시간 전송 프로토콜로, 주로 오디오, 비디오 및 데이터 전송에 사용된다. 스트리밍 서버와 클라이언트 간의 저지연성을 유지하며 비디오나 오디오 콘텐츠를 전송하는 데 매우 적합한 프로토콜이다. RTMP는 주로 라이브 스트리밍 플랫폼에서 사용되며, FFMPEG을 통해 RTMP 스트림을 송출하는 것은 매우 일반적인 작업이다.

RTMP 스트리밍 설정

  1. RTMP 서버 준비
    RTMP 스트리밍을 설정하기 위해서는 먼저 RTMP 서버가 필요하다. 대표적인 RTMP 서버로는 NGINX RTMP 모듈을 사용할 수 있다. 이 서버는 비디오 콘텐츠를 RTMP 프로토콜을 통해 클라이언트에게 전달한다.

RTMP 서버를 설정한 후, 해당 서버에 연결할 URL을 기억해야 한다. 일반적으로 URL 형식은 다음과 같다:

rtmp://[서버 IP 또는 도메인]/[앱 이름]/[스트림 키]

예를 들어, rtmp://192.168.0.1/live/mystream와 같은 형식이다.

  1. FFmpeg를 사용한 RTMP 스트림 송출
    FFMPEG을 사용해 비디오 또는 오디오 콘텐츠를 RTMP 서버에 전송하려면 다음과 같은 명령어 구조를 사용할 수 있다.

ffmpeg -re -i [입력 파일] -c:v [비디오 코덱] -c:a [오디오 코덱] -f flv rtmp://[서버 주소]/[앱 이름]/[스트림 키]

여기서 중요한 옵션들을 살펴보면:

-c:v libx264 -preset veryfast -b:v 2500k -maxrate 2500k -bufsize 5000k

-c:a aac -b:a 128k

-vf scale=1280:720 -r 30

HTTP 스트리밍 개요

HTTP 스트리밍은 RTMP와는 달리 HTTP 프로토콜을 통해 데이터를 전송하는 방식이다. HTTP 기반 스트리밍 기술로는 주로 HLS(HTTP Live Streaming)와 DASH(Dynamic Adaptive Streaming over HTTP)가 사용된다. HTTP 스트리밍은 전송 중단 후 재개 기능이나 네트워크 환경에 맞춘 적응형 비트레이트 전송 등의 장점이 있어, 다양한 네트워크 환경에서 안정적인 스트리밍이 가능한다.

HTTP 스트리밍 설정

  1. HLS 스트리밍 설정 HLS는 Apple에서 개발한 HTTP 기반 스트리밍 프로토콜로, 작은 세그먼트로 나눈 비디오 파일과 이를 관리하는 플레이리스트 파일을 사용하여 스트리밍을 진행한다.

FFMPEG으로 HLS 스트리밍을 설정하는 기본 명령어는 다음과 같다:

ffmpeg -i [입력 파일] -c:v [비디오 코덱] -c:a [오디오 코덱] -f hls -hls_time [세그먼트 시간] -hls_playlist_type [플레이리스트 타입] [출력 파일].m3u8

여기서 중요한 옵션들을 살펴보면:

예를 들어, 10초마다 세그먼트를 생성하고, VOD 모드로 스트리밍을 준비하는 명령어는 다음과 같다:

ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f hls -hls_time 10 -hls_playlist_type vod output.m3u8

  1. DASH 스트리밍 설정 DASH는 HTTP 기반의 또 다른 스트리밍 프로토콜로, 네트워크 상태에 따라 스트리밍 품질을 조절할 수 있는 적응형 스트리밍을 지원한다. FFMPEG을 사용하여 DASH 스트리밍을 설정할 때는 다음과 같은 명령어를 사용할 수 있다:

ffmpeg -i [입력 파일] -c:v [비디오 코덱] -c:a [오디오 코덱] -f dash [출력 파일].mpd

DASH 스트리밍 예시는 다음과 같다:

ffmpeg -i input.mp4 -c:v libx264 -c:a aac -f dash output.mpd

이 명령어는 input.mp4 파일을 output.mpd로 DASH 스트리밍 설정을 적용한다.

  1. 비트레이트 적응 스트리밍 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

이와 같이 서로 다른 해상도와 비트레이트로 비디오를 인코딩한 후, 플레이리스트 파일을 작성하여 적응형 스트리밍을 지원할 수 있다.

  1. HTTP 스트리밍 서버 설정 HTTP 스트리밍은 단순한 웹 서버에서도 구현할 수 있다. Apache 또는 NGINX와 같은 HTTP 서버를 사용하여 HLS 또는 DASH 스트리밍 파일을 서빙할 수 있으며, 해당 파일을 클라이언트 측에서 접근할 수 있도록 설정하면 된다.

NGINX HTTP 서버에서 HLS 스트리밍을 설정하는 기본 과정은 다음과 같다:

  1. NGINX 설치 및 구성 파일 수정
  2. HLS 세그먼트 및 플레이리스트 파일을 특정 디렉토리에 저장
  3. 해당 디렉토리를 웹 서버로 공개

이후, 생성된 .m3u8 또는 .mpd 파일에 클라이언트가 접근하여 비디오 스트림을 재생할 수 있다.

HTTP 스트리밍 클라이언트 설정

  1. HLS 스트리밍 클라이언트
    HLS 스트리밍은 Apple 제품에서 기본적으로 지원되며, 대부분의 웹 브라우저 및 미디어 플레이어에서도 HLS 스트리밍을 재생할 수 있다. FFMPEG으로 생성된 .m3u8 파일은 브라우저나 미디어 플레이어에서 직접 스트리밍된다.
    대표적인 HLS 재생 방법:

  2. 브라우저 기반 재생: 현대적인 웹 브라우저(Chrome, Safari 등)는 HLS 플레이어 플러그인을 사용하여 HLS 스트리밍을 재생할 수 있다. JavaScript 기반의 hls.js 라이브러리를 통해 HLS 스트리밍을 재생할 수 있다.

```html

```

다음은 dash.js를 이용한 DASH 스트리밍의 기본 코드이다:

```html

```

비트레이트, 해상도 설정 시 주의사항

HTTP 스트리밍에서 중요한 요소 중 하나는 네트워크 대역폭과 사용자 환경에 적절한 비트레이트와 해상도를 설정하는 것이다. 고해상도 비디오와 높은 비트레이트는 고속 네트워크 환경에서 좋은 품질을 제공하지만, 낮은 대역폭에서는 끊김 현상이 발생할 수 있다.

  1. 적응형 비트레이트 사용
    적응형 스트리밍에서는 클라이언트의 네트워크 상태를 실시간으로 모니터링하여 자동으로 비트레이트를 조정한다. 이 방식은 서버에서 여러 해상도의 비디오 버전을 제공하고, 클라이언트는 네트워크 상태에 맞는 비디오 버전을 선택하여 재생한다.

  2. 최적의 해상도 설정
    해상도는 스트리밍 품질에 가장 큰 영향을 미치는 요소 중 하나이다. 일반적으로 다음과 같은 해상도와 비트레이트를 권장한다:

  3. 1080p: 1920x1080 해상도, 4,500 - 9,000 kbps 비트레이트

  4. 720p: 1280x720 해상도, 2,500 - 5,000 kbps 비트레이트
  5. 480p: 854x480 해상도, 1,000 - 2,500 kbps 비트레이트
  6. 360p: 640x360 해상도, 600 - 1,000 kbps 비트레이트

  7. 네트워크 환경 고려
    HTTP 스트리밍 설정에서 가장 중요한 부분은 네트워크 환경이다. 모바일 네트워크나 저속 인터넷 환경에서도 스트리밍이 원활하게 이루어질 수 있도록 다양한 비트레이트의 비디오를 준비하는 것이 필요하다.