ngx_http_mp4_module

ngx_http_mp4_module 모듈은 MP4 파일에 대해 가상 스트리밍 서버측 지원을 제공합니다. 일반적으로 이런 파일은 확장자가 .mp4, .m4v, .m4a입니다.

가상 스트리밍은 호환되는 플래시 플레이어와 작동합니다. 플레이어는 서버로 HTTP 요청을 보냅니다. 시작 시간은 쿼리 문자열 인수(start로 이름 지정, 초 단위)로 지정합니다. 서버는 시작 위치가 요청된 시간에 대응하도록 스트림을 포함해 응답합니다. 예를 들어, 다음과 같습니다.

http://example.com/elephants_dream.mp4?start=238.88

언제든 무작위 검색을 실행하거나, 타임라인 중간에서 재생을 시작할 수 있습니다.

검색을 지원하기 위해 H.264 기반 형식이 이른바 “moov atom”에 메타데이터를 저장합니다. 이 파일 부분은 전체 파일의 인덱스 정보를 보관합니다.

재생을 시작하려면 플레이어에서 먼저 메타데이터를 읽어야 합니다. start=0 인수로 특별 요청을 보내면 됩니다. 대부분 인코딩 소프트웨어는 파일 끝에 메타데이터를 삽입합니다. 이는 가상 스트리밍에는 적절하지 않은데, 플레이어가 파일 전체를 다운로드한 다음에 재생을 시작해야 하기 때문입니다. 메타데이터가 파일 앞에 위치하면 nginx에서 파일 내용을 전송하기 시작할 수 있습니다. 메타데이터가 파일 끝에 있으면 nginx는 파일 전체를 읽고 메타데이터가 미디어 데이터 앞에 오도록 새 스트림을 준비해야 합니다. 이 작업에는 CPU, 메모리, 디스크 I/O 오버헤드가 필요하므로 nginx가 각 요청에 대해 이 작업을 실행하는 것보다는 가상 스트리밍에 대해 원본 파일을 준비하는 것이 좋습니다.

또한, 이 모듈은 HTTP 요청(1.5.13)에서 재생의 끝 지점을 설정하는 end 인수도 지원합니다. end 인수는 start 인수로 지정하거나 별도로 지정할 수 있습니다.

http://example.com/elephants_dream.mp4?start=238.88&end=555.55

0이 아닌 start 또는 end 인수가 포함된 일치하는 요청이 있을 경우, nginx가 파일에서 메타데이터를 읽고, 요청된 시간 범위로 스트림을 준비하여 클라이언트로 전송합니다. 이는 앞서 설명한 것과 동일한 오버헤드가 발생합니다.

start인수가 키가 아닌 비디오 프레임을 가리키는 경우 해당 비디오의 시작 부분이 깨집니다. 이 문제를 해결하기 위해 포인트 앞의 키 프레임과 그 사이의 모든 중간 프레임을 비디오 앞에 추가 할 수 있습니다 start. 이 프레임은 편집 목록(1.21.4)을 사용하여 재생에서 숨겨집니다.

일치하는 요청에 start와 end 인수가 포함되지 않으면 오버헤드가 없고, 파일은 고정 리소스로 전송됩니다. 일부 플레이어는 바이트 범위 요청도 지원하므로 이 모듈이 필요하지 않습니다.

이 모듈은 기본적으로 구축되지 않으므로, –with-http_mp4_module 구성 매개변수로 활성화해야 합니다.

타사 mp4 모듈을 사용했다면 비활성화해야 합니다.

FLV 파일에 대해서도 이와 유사한 가상 스트리밍을 ngx_http_flv_module 모듈에서 지원합니다.

예제 구성

location /video/ {
    mp4;
    mp4_buffer_size       1m;
    mp4_max_buffer_size   5m;
    mp4_limit_rate        on;
    mp4_limit_rate_after  30s;
}

Directives

Syntax:  mp4;
Default: —
Context: location

주변 위치에서의 모듈 처리를 활성화합니다.

Syntax:  mp4_buffer_size size;
Default: mp4_buffer_size 512K;
Context: http, server, location

MP4 파일 처리에 사용하는 버퍼의 최초 size를 설정합니다.

Syntax:  mp4_max_buffer_size size;
Default: mp4_max_buffer_size 10M;
Context: http, server, location

메타데이터를 처리하는 동안 큰 버퍼가 필요할 수 있습니다. 용량은 지정된 size를 초과할 수 없습니다. 초과할 경우, nginx가 500(내부 서버 오류) 서버 오류를 반환하고 다음의 메시지를 로깅합니다.

"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size
Syntax:  mp4_limit_rate on | off | factor;
Default: mp4_limit_rate off;
Context: http, server, location

클라이언트에 대한 응답 전송 속도를 제한하세요. 전송되는 MP4 파일의 평균 비트레이트에 따라 속도가 제한됩니다. 속도를 계산하려면 비트레이트에 특정 factor를 곱합니다. 특수 값 “on”은 1.1에 해당합니다. 특수 값 “off”는 속도 제한을 비활성화합니다. 요청별로 제한을 설정했는데 클라이언트가 동시에 두 개의 연결을 열었을 경우, 전체 속도는 지정된 제한보다 두 배가 됩니다.

이 명령은 상업용 구독에서 제공합니다.

Syntax:  mp4_limit_rate_after time;
Default: mp4_limit_rate_after 60s;
Context: http, server, location

미디어 데이터의 최초 용량(재생 시간으로 측정)을 설정하고, 그 이후에 클라이언트에 대한 응답 전송 시 속도가 제한됩니다.

이 명령은 상업용 구독에서 제공합니다.

Syntax:  mp4_start_key_frame on | off;
Default: mp4_start_key_frame off;
Context: http, server, location
This directive appeared in version 1.21.4.

출력 비디오가 항상 키 비디오 프레임으로 시작하도록 합니다. 경우 start인수가 키 프레임 가리 키지 않는, 초기 프레임은 MP4 편집 목록을 사용하여 숨겨져 있습니다. 편집 목록은 Firefox에서 부분적으로 지원되는 Chrome, Safari, QuickTime 및 ffmpeg와 같은 주요 플레이어 및 브라우저에서 지원됩니다.