モジュール 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; |
| コンテキスト |
http、server、location |
MP4ファイルの処理に使用されるバッファーの初期サイズを設定します。
| 構文 |
mp4_max_buffer_size |
|---|---|
| デフォルト |
mp4_max_buffer_size 10M; |
| コンテキスト |
http、server、location |
メタデータ処理中に、より大きなバッファーが必要になる場合があります。そのサイズは指定されたサイズを超えることはできません。そうでなければ、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 |
|---|---|
| デフォルト |
mp4_limit_rate off; |
| コンテキスト |
http、server、location |
クライアントへの応答送信速度を制限します。速度は、提供されるMP4ファイルの平均ビットレートに基づいて制限されます。レートを計算するために、ビットレートに指定された係数が掛けられます。「on」という特別な値は係数1.1に対応します。「off」という特別な値はレート制限を無効にします。制限はリクエストごとに設定されるため、クライアントが同時に2つの接続を開くと、全体のレートは指定された制限の2倍になります。
このディレクティブは、商用サブスクリプションの一部として利用できます。
| 構文 |
mp4_limit_rate_after |
|---|---|
| デフォルト |
mp4_limit_rate_after 60s; |
| コンテキスト |
http、server、location |
クライアントへの応答の送信がレート制限されるまでのメディアデータの初期量(再生時間単位で測定)を設定します。
このディレクティブは、商用サブスクリプションの一部として利用できます。
| 構文 |
mp4_start_key_frame |
|---|---|
| デフォルト |
mp4_start_key_frame off; |
| コンテキスト |
http、server、location |
このディレクティブはバージョン1.21.4で登場しました。
出力ビデオが常にキービデオフレームで開始されるように強制します。start引数がキーフレームを指していない場合、最初のフレームはmp4編集リストを使用して非表示になります。編集リストは、Chrome、Safari、QuickTime、ffmpegなどの主要なプレーヤーとブラウザでサポートされており、Firefoxでも部分的にサポートされています。