モジュール ngx_http_mp4_module

設定例
ディレクティブ
     mp4
     mp4_buffer_size
     mp4_max_buffer_size
     mp4_limit_rate
     mp4_limit_rate_after
     mp4_start_key_frame

ngx_http_mp4_moduleモジュールは、MP4ファイルに対する擬似ストリーミングサーバーサイドサポートを提供します。このようなファイルは通常、.mp4.m4v、または.m4aというファイル拡張子を持ちます。

擬似ストリーミングは、互換性のあるメディアプレーヤーと連携して動作します。プレーヤーは、クエリ文字列引数(単純にstartと名付けられ、秒単位で指定されます)に指定された開始時刻でサーバーにHTTPリクエストを送信し、サーバーは開始位置が要求された時刻に対応するストリームで応答します。例えば

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

これにより、いつでもランダムシークを実行したり、タイムラインの途中で再生を開始したりできます。

シークをサポートするために、H.264ベースのフォーマットは、いわゆる「moov atom」にメタデータ(ファイル全体のインデックス情報を含むファイルの一部)を格納します。

再生を開始するには、プレーヤーはまずメタデータを読み取る必要があります。これは、start=0引数で特別なリクエストを送信することで行われます。多くのエンコーディングソフトウェアは、メタデータをファイルの最後に挿入します。これは擬似ストリーミングには最適ではありません。なぜなら、プレーヤーは再生を開始する前にファイルを完全にダウンロードする必要があるからです。メタデータがファイルの先頭にある場合、nginxはファイルの内容を送信し始めるだけで十分です。メタデータがファイルの最後に位置する場合、nginxはファイルをすべて読み取り、メタデータがメディアデータの前に来るように新しいストリームを準備する必要があります。これには、CPU、メモリ、ディスクI/Oのオーバーヘッドが伴うため、擬似ストリーミング用に元のファイルを事前に準備する方が良いでしょう。

このモジュールは、再生のエンドポイントを設定するHTTPリクエストのend引数(1.5.13)もサポートしています。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;
}

ディレクティブ

構文 mp4;
デフォルト
コンテキスト location

周囲のlocationでモジュールの処理を有効にします。

構文 mp4_buffer_size サイズ;
デフォルト
mp4_buffer_size 512K;
コンテキスト httpserverlocation

MP4ファイルの処理に使用されるバッファーの初期サイズを設定します。

構文 mp4_max_buffer_size サイズ;
デフォルト
mp4_max_buffer_size 10M;
コンテキスト httpserverlocation

メタデータ処理中に、より大きなバッファーが必要になる場合があります。そのサイズは指定されたサイズを超えることはできません。そうでなければ、nginxは500(内部サーバーエラー)のサーバーエラーを返し、次のメッセージをログに記録します。

"/some/movie/file.mp4" mp4 moov atom is too large:
12583268, you may want to increase mp4_max_buffer_size

構文 mp4_limit_rate on | off | 係数;
デフォルト
mp4_limit_rate off;
コンテキスト httpserverlocation

クライアントへの応答送信速度を制限します。速度は、提供されるMP4ファイルの平均ビットレートに基づいて制限されます。レートを計算するために、ビットレートに指定された係数が掛けられます。「on」という特別な値は係数1.1に対応します。「off」という特別な値はレート制限を無効にします。制限はリクエストごとに設定されるため、クライアントが同時に2つの接続を開くと、全体のレートは指定された制限の2倍になります。

このディレクティブは、商用サブスクリプションの一部として利用できます。

構文 mp4_limit_rate_after 時間;
デフォルト
mp4_limit_rate_after 60s;
コンテキスト httpserverlocation

クライアントへの応答の送信がレート制限されるまでのメディアデータの初期量(再生時間単位で測定)を設定します。

このディレクティブは、商用サブスクリプションの一部として利用できます。

構文 mp4_start_key_frame on | off;
デフォルト
mp4_start_key_frame off;
コンテキスト httpserverlocation

このディレクティブはバージョン1.21.4で登場しました。

出力ビデオが常にキービデオフレームで開始されるように強制します。start引数がキーフレームを指していない場合、最初のフレームはmp4編集リストを使用して非表示になります。編集リストは、Chrome、Safari、QuickTime、ffmpegなどの主要なプレーヤーとブラウザでサポートされており、Firefoxでも部分的にサポートされています。