NGINX mp4 module 활용 mp4 파일 스트리밍 가이드
이 포스트에서는 NGINX mp4 module(ngx_http_mp4_module)의 기능과 동작 방식에 관해 설명합니다. 이 모듈을 활용하여 NGINX 서버를 통해 효율적으로 mp4 파일 스트리밍을 할 수 있습니다.
이 모듈은 컴파일 설치 시 기본적으로 빌드되지 않으며, –with-http_mp4_module 매개변수를 통해 활성화해야 합니다. 또한 타사 MP4 모듈을 기존에 사용 중이었다면, 비활성화해야 합니다.
목차
1. NGINX mp4 module 이란?
1-1. NGINX mp4 module 지시문
2. NGINX mp4 module 사용 NGINX 구성
3. 결론
1. NGINX mp4 module 이란?
NGINX MP4 모듈은 NGINX 서버에서 MP4 파일에 대한 가상 스트리밍을 지원하는 모듈입니다. 클라이언트가 초 단위로 지정한 start 쿼리 문자열을 포함한 HTTP 요청을 전송하면, 서버는 해당 지점부터 시작되는 영상을 반환합니다. 또한 end 쿼리 문자열을 포함해 영상의 끝을 지정하여 요청을 전송할 수 있습니다.
NGINX가 요청을 수신하면, 먼저 MP4 파일의 메타데이터를 포함하는 moov atom을 읽습니다. 많은 인코딩 소프트웨어는 메타데이터를 파일의 끝에 삽입하는데, 이 경우 NGINX는 파일 전체를 읽은 후에 메타데이터를 읽을 수 있어, 스트리밍을 시작하기 전에 CPU, 메모리, disk I/O 오버헤드가 발생합니다. 따라서 NGINX의 가상 스트리밍을 효율적으로 처리하려면 메타데이터가 파일의 앞부분에 있는 MP4 파일을 준비하는 것이 좋습니다.
요청에 start 또는 end 쿼리 문자열이 포함되면 NGINX는 메타데이터를 읽고, 해당하는 시간 범위의 스트리밍을 처리합니다. 이 과정에서 위와 같은 오버헤드가 발생합니다. 요청에 해당 쿼리 문자열이 포함되지 않으면, 성능 오버헤드 없이 MP4 파일은 정적 파일로 전송됩니다.
만약 start 쿼리 문자열이 영상의 키 프레임에 지정되지 않으면 영상의 시작 부분이 깨지는 등 재생에 문제가 발생할 수 있으나, mp4_start_key_frame 지시문을 통해 이러한 현상을 방지할 수 있습니다. 해당 지시문을 활성화할 경우, start로 지정된 지점 이전의 키 프레임과 start 사이의 키 프레임을 추가하여 재생 문제를 방지합니다.
1-1. NGINX mp4 module 지시문
1. mp4;
기본 : –
컨텍스트 : location
해당 location 블록에 MP4 모듈을 활성화합니다.
2. mp4_buffer_size size;
기본 : mp4_buffer_size 512K;
컨텍스트 : http, server, location
MP4 파일 처리에 사용되는 버퍼의 초깃값을 설정합니다.
3. mp4_max_buffer_size size;
기본 : mp4_max_buffer_size 10M;
컨텍스트 : http, server, location
버퍼 사이즈의 최대값을 설정합니다. MP4 파일의 메타데이터 처리 과정 중 더 큰 버퍼 사이즈가 필요할 수 있습니다. 값을 초과할 경우 NGINX는 500 (Internal Server Error) 서버 에러를 반환하고 다음과 같은 메시지를 로그에 기록합니다.
"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size
4. mp4_start_key_frame on | off;
기본 : mp4_start_key_frame off;
컨텍스트 : http, server, location
출력 영상이 항상 키 프레임에서 시작하도록 설정합니다. 만약 start 매개변수가 키 프레임을 지정하지 않으면, mp4 edit list를 사용하여 앞의 프레임을 숨기고 start 매개변수가 지정한 시간부터 영상을 스트리밍할 수 있습니다. Edit list는 대부분의 플레이어와 브라우저에서 지원되며, Firefox는 부분적으로 지원합니다.
5. mp4_limit_rate on | off | factor; # NGINX Plus 전용
기본 : mp4_limit_rate off;
컨텍스트 : http, server, location
클라이언트에 대한 응답 전송 속도를 제한합니다. 전송되는 MP4 파일의 평균 비트 레이트에 따라 속도가 제한됩니다. on으로 설정 시 평균 비트 레이트에 1.1을 곱한 속도로 제한하며, 사용자 지정 배율 값(factor)을 설정할 수도 있습니다. off는 속도 제한을 비활성화합니다. 제한은 요청 당 적용되어 클라이언트가 동시에 여러 연결을 생성하면, 전체 속도는 지정된 제한의 n배가 됩니다.
6. mp4_limit_rate_after time; # NGINX Plus 전용
기본 : mp4_limit_rate_after 60s;
컨텍스트 : http, server, location
지정된 시간 이후부터 클라이언트에 대한 응답의 전송 시 속도 제한이 적용됩니다. 이 지시문 설정을 통해 초기 버퍼링 속도를 최적화하여 클라이언트가 빠르게 재생을 시작할 수 있도록 합니다.
2. NGINX mp4 module 사용 NGINX 구성
mp4.conf
server {
listen 8004;
root /data/nginx/videos;
access_log /var/log/nginx/mp4_access.log main;
location / {
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
mp4_start_key_frame on;
}
}
NGINX 서버를 통해 mp4 파일을 스트리밍하기 위해 mp4 모듈을 활성화한 설정 파일입니다.
안정적인 스트리밍을 위해 mp4_start_key_frame 지시문을 on으로 설정했습니다.
$ ls -l /data/nginx/videos/
total 3044
-rw-rw-r-- 1 nginx nginx 3114374 Nov 20 16:39 example.mp4
설정 파일의 root 지시문으로 지정된 디렉터리에는 위와 같이 example.mp4 파일이 있습니다.
웹 브라우저에서 NGINX 서버의 8004 포트, /example.mp4 경로로 접속하여 영상을 확인할 수 있습니다.

30초 길이의 영상을 재생할 수 있습니다.

start/end 쿼리 문자열을 사용하지 않아 전송된 데이터 크기가 전체 영상 파일 크기와 동일한 것을 확인할 수 있습니다.

start 값을 10, end 값을 20으로 설정 시 전체 30초의 영상 중 10~20초 구간의 10초 영상 데이터를 확인할 수 있습니다.

로그의 데이터 크기를 확인하면 전체 파일 크기 대비 작은 크기를 확인할 수 있습니다.
3. 결론
이번 포스트에서는 NGINX mp4 module의 기능과 작동 원리를 알아보고, 실제로 NGINX 서버에 모듈을 활성화 후 요청을 전송하여 어떻게 동작하는지 확인해 봤습니다. 기본 요청과 start/end 값을 지정한 요청을 로그와 브라우저에서 비교하여 결과를 확인했습니다.
NGINX의 mp4 module을 활용하여 MP4 영상을 스트리밍하면, 메타데이터를 활용해 영상의 지정된 부분만 스트리밍할 수 있기 때문에 효율적으로 영상 데이터를 전송할 수 있습니다. 또한 mp4_start_key_frame 옵션을 통해 영상의 시작점이 키 프레임과 다를 경우 깨짐 현상을 방지할 수 있는 이점이 있습니다.
이렇게 NGINX를 통해 효율적인 MP4 스트리밍 및 구간 스트리밍이 가능하지만, NGINX는 MP4 파일의 메타데이터를 읽고 요청을 처리하므로, 효율적인 처리를 위해 메타데이터가 MP4 파일의 앞부분에 인코딩되도록 하는 것이 좋습니다.
NGINX의 MP4 파일 스트리밍을 위한 모듈에 추가로 속도 제한 기능까지 제공하는 NGINX Plus를 체험해 보고 싶으시다면 NGINX STORE를 통해 문의해 무료로 NGINX Plus trial을 체험해 보세요.
댓글을 달려면 로그인해야 합니다.