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
ファイル拡張子を持ちます。
擬似的なストリームは互換性のあるmediaプレイヤーと連携して動作します。プレイヤーはクエリ文字列の引数(単純にstart
という名前の秒数で指定)で指定された開始時間のHTTPリクエストをサーバに送信し、サーバはリクエストされた時間に対応する場所から開始するストリームを応答します。例えば:
http://example.com/elephants_dream.mp4?start=238.88
これにより、いつでもランダムシーキング、あるいは時間割りの中での再生の開始を実施することができます。
シーキングをサポートするために、H.264ベースのフォーマットはメタデータをいわゆる"moov atom"に保存します。それはファイル全体のインデックス情報を保持するファイルの一部です。 file.
再生を開始するには、プレイヤーはまずメタデータを読む必要があります。これはstart=0
引数と一緒に特別なリクエストを送ることで行われます。たくさんのエンコーディングソフトウェアがファイルの最後にメタデータを挿入します。プレイヤーは再生を開始する前にファイル全体をダウンロードする必要があるため、これは擬似ストリーミングにとって部分的に最適です。メタデータがファイルの先頭に配置された場合、nginxにとっては単純にファイルの内容を送り返し始めるだけで十分です。メタデータがファイルの最後に配置された場合、nginxはファイル全体を読み込み、メディアデータの前にメタデータが来るように新しいストリームを準備する必要があります。これはいくらかのCPU、メモリ、disk I/Oのオーバーヘッドを必要とします。そのため、そのようなリクエストのたびにnginxがこれをするよりは、前もって<c1>擬似ストリーミングのための元のファイルを準備するのは良い考えです。
このモジュールは再生の終了場所を設定するHTTPリクエストのend
引数 (1.5.13) もサポートします。end
引数はstart
引数と一緒に、あるいは別々に指定することができます:
http://example.com/elephants_dream.mp4?start=238.88&end=555.55
0では無い または end
引数のリクエストのマッチングのために、nginxはファイルからメタデータを読み込み、リクエストされた範囲のストリームを準備し、クライアントにそれを送信するでしょう。これは上で述べたのと同じオーバーヘッドがあります。
start
引数がnon-keyビデオフレームを指している場合、そのようなビデオの先頭は壊れます。この問題を解決するには、ビデオのstart
ポイントの前にキーフレームを追加し、その間に全ての中間フレームを追加します。これらのフレームは編集リストを使って再生からは隠されます(1.21.4)。
start
とend
引数が無いリクエストのマッチングの場合は、オーバーヘッドは無く、静的なリソースのように単純にファイルが送信されるでしょう。いくつかのプレイヤーはバイト範囲のリクエストをサポートしており、従ってこのモジュールを必要としません。
このモジュールはデフォルトではビルドされず、--with-http_mp4_module
configureパラメータを有効にする必要があります。
サードパーティの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内で、モジュールの処理を作動させます。
構文: |
mp4_buffer_size |
---|---|
デフォルト: |
mp4_buffer_size 512K; |
コンテキスト: |
http , server , location |
MP4ファイルを処理するために使われるバッファの size
の初期値を設定します。
構文: |
mp4_max_buffer_size |
---|---|
デフォルト: |
mp4_max_buffer_size 10M; |
コンテキスト: |
http , server , location |
metadataの処理中は、もっと大きなバッファが必要になるかも知れません。そのサイズは指定されたsize
を超えることはできません。そうでなければ500 (Internal Server Error)サーバエラーが返され、以下のメッセージが記録されるでしょう:
"/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ファイルが提供する平均のビットレートに基づいて制限されます。レートを計算するために、ビットレートは指定された factor
を掛け算します。特別な値"on
"は1.1のfactorに対応します。特別な値"off
"はレートの制限を無効にします。制限はリクエストごとに設定されます。もしクライアントが同時に二つの接続を開いた場合は、全体のレートは指定された制限の二倍になるでしょう。
このディレクティブは商用許可の一部として利用可能です。
構文: |
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で部分的にサポートされています。