Module ngx_http_mp4_module

Module ngx_http_mp4_module The ngx_http_mp4_module module provides pseudo-streaming server-side support for MP4 files. Such files typically have the .mp4, .m4v, or .m4a filename extensions. Pseudo-streaming works in alliance with a compatible media player.

nginx.org

 

  • ngx_http_mp4_module 모듈은 MP4 파일에 대한 pseudo-streaming 지원
  • 일반적으로 .mp4, .m4v또는 .m4a파일 이름 확장자가 있음
  • pseudo-streaming은 호환되는 미디어 플레이어와 함께 작동함
  • 플레이어는 쿼리 문자열 인수(초 단위로 지정)에 지정된 시작 시간과 함께 서버에 HTTP 요청을 보냄
  • start는 시작시간을 요청된 시간과 일치하도록 스트림으로 응답
  • 언제든지 무작위 검색을 수행하거나 타임라인 중간에 재생을 시작 가능
  • 재생을 시작하려면 플레이어가 먼저 메타데이터를 읽어야 함 → start=0 인수와 함께 특수 요청을 전송하여 수행

  • start 사용 예시
    http://example.com/elephants_dream.mp4?start=238.88

 

  • ngx_http_mp4_module 모듈 end은 재생의 끝점을 설정하는 HTTP 요청의 인수도 지원
  • start가 0이 아니거나 인수가 있는 일치 요청의 end 경우 nginx는 파일에서 메타데이터를 읽고 요청된 시간 범위로 스트림을 준비하여 클라이언트에 보냄 → 오버헤드를 발생
  • start 인수가 키가 아닌 비디오 프레임을 가리키는 경우 해당 비디오의 시작 부분이 깨짐 → 문제를 해결하기 위해 포인트 앞의 키 프레임과 그 사이의 모든 중간 프레임을 비디오 앞에 추가 가능
  • start이 프레임은 편집 목록(1.21.4)을 사용하여 재생에서 숨김
  • 일치하는 요청에 start 및 end 인수가 포함되지 않은 경우 오버헤드가 없으며 파일은 단순히 정적 리소스로 전송

  • 인수 end와 함께 start를 지정하거나 별도로 지정 가능
    http://example.com/elephants_dream.mp4?start=238.88&end=555.55

 

※ 메타데이터

  • 검색을 지원하기 위해 H.264 기반 포맷은 메타데이터를 "moov atom"에 저장 → 전체 파일에 대한 인덱스 정보를 저장하는 파일 일부
  • 재생을 시작하려면 플레이어가 먼저 메타데이터를 읽어야함
  • 많은 인코딩 소프트웨어는 파일 끝에 메타데이터를 삽입함 → 플레이어는 재생을 시작하기 전에 전체 파일을 다운로드해야 하기 때문에 pseudo-streaming에는 차선의 선택
  • 메타데이터가 파일 시작 부분에 있으면 nginx가 파일 내용을 다시 보내기 시작하는 것으로 충분
  • 메타데이터가 파일 끝에 있는 경우 nginx는 전체 파일을 읽고 미디어 데이터보다 메타데이터가 먼저 오도록 새 스트림을 준비해야 함
  • CPU, 메모리 및 디스크 I/O 오버헤드가 수반되므로 nginx가 이러한 모든 요청에 대해 이 작업을 수행하도록 하기보다는 pseudo-streaming을 위한 원본 파일을 미리 준비하는 것이 좋음

 

ngx_http_mp4_module 모듈 지시문

  • 일부 플레이어는 바이트 범위 요청도 지원하므로 ngx_http_mp4_module 모듈이 필요하지 않음
  • --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;
    }

 

mp4 지시어

  • mp4 모듈 처리를 킴

  • 문맥 : location
  • 사용 문법과 사용 예시
    # 문법 : mp4;
    mp4;

 

mp4_buffer_size size 지시어

  • mp4 파일 처리에 사용되는 버퍼의 초기 크기를 설정

  • 문맥 : http, server, location
  • 사용 문법
    # 문법
    mp4_buffer_size size;
  • 사용 예시
    # 사용 예시
    mp4_buffer_size 512K;

 

mp4_max_buffer_size 지시자

  • 메타데이터 처리 중에 더 큰 버퍼가 필요한 경우가 있음
  • 메타데이터 처리 중에 버퍼 크기는 지정된 크기를 초과할 수 없음
  • 버퍼 크기보다 초과하는 경우, nginx가 500(내부 서버 오류) 서버 오류를 반환하고 아래 메시지 출력
    "/some/movie/file.mp4" mp4 moov atom is too large:
    12583268, you may want to increase mp4_max_buffer_size

 

  • 문맥: http, server, location
  • 사용 문법
    # 문법
    mp4_max_buffer_size size;
  • 사용 예시
    # 사용 예시
    mp4_max_buffer_size 10M;

 

※ mp4_max_buffer_size가 작아 500 에러 발생 예시

  • 500 에러 발생 화면 (참고 URL : http://도메인/a.mp4?start=100)

 

  • 500 에러 발생 error 로그
    날짜 시간 [error] 24042404: *94087966 "a.mp4" mp4 moov atom is too large:5448131, 
    you may want to increase mp4_max_buffer_size, client: 111.111.111.111,
    ### 생략

 

  • 500 에러 발생 시 mp4_max_buffer_size 값을 올려주면 해결할 수 있음

 

 

mp4_limit_rate 지시자

  • 클라이언트에 대한 응답 전송 속도를 제한
  • 전송 속도는 제공되는 MP4 파일의 평균 비트 전송률에 따라 제한

  • mp4_limit_rate 사용 값
    1. factor → 전송률을 계산하려면 비트 전송률(bitrate)에 지정된 factor를 곱함
    2. on → on을 설정하면 속도 제한을 활성화하며, factor는 1.1에 해당
    3. off → 속도 제한을 비활성화

  • limit는 요청별로 설정이 됨 → 클라이언트가 동시에 두 개의 연결을 열면 전체 속도는 지정된 제한의 두 배가됨

  • 문맥: http, server, location
  • 사용 문법과 기본 사용 예시
    # 문법
    mp4_limit_rate on | off | factor;
    
    # 사용 예시
    mp4_limit_rate off;

 

 

mp4_limit_rate_after 지시자

  • 초기 미디어 데이터 양(재생 시간으로 측정)을 설정. 이후 클라이언트로의 응답 전송 속도가 제한

  • 문맥: http, server, location
  • 사용 문법
    # 문법
    mp4_start_key_frame on | off;
  • 기본 사용 예시
    mp4_start_key_frame off;

 

 

mp4_start_key_frame 지시자

  • 출력 비디오가 항상 키 비디오 프레임으로 시작하도록 함
  • start 인수가 키 프레임을 가리키지 않으면, 초기 프레임은 mp4 편집 목록을 사용하여 숨겨짐.
  • 편집 목록은 Firefox에서 부분적으로 지원
  • 편집 목록은 Chrome, Safari, QuickTime 및 ffmpeg와 같은 주요 플레이어 및 브라우저에서 지원됨

  • 문맥: http, server, location
  • 해당 지시자는 nginx 1.21.4 버전 이후부터 사용 가능
  • 사용 문법
    # 문법
    mp4_start_key_frame on | off;
  • 기본 사용 예시
    mp4_start_key_frame off;

 

 

참고 자료

'Nginx > Nginx 모듈 학습' 카테고리의 다른 글

ngx_http_dav_module 모듈  (1) 2024.12.11
ngx_http_hls_module 모듈  (0) 2023.09.24
ngx_http_referer_module 모듈  (0) 2023.09.23
ngx_http_secure_link_module 모듈  (0) 2023.09.23
ngx_http_realip_module 모듈  (0) 2023.09.23

+ Recent posts