モジュール 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でも部分的にサポートされています。