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 副檔名。

偽串流與相容的媒體播放器協同運作。播放器向伺服器發送 HTTP 請求,其中查詢字串引數(簡單地命名為 start,並以秒為單位指定)指定了開始時間,伺服器則以串流回應,使其起始位置對應到請求的時間,例如

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

這允許在任何時間執行隨機搜尋,或在時間軸的中間開始播放。

為了支援搜尋,基於 H.264 的格式將中繼資料儲存在所謂的「moov atom」中。它是檔案的一部分,其中保存了整個檔案的索引資訊。

為了開始播放,播放器首先需要讀取中繼資料。這是透過發送帶有 start=0 引數的特殊請求來完成的。許多編碼軟體會將中繼資料插入到檔案的末尾。這對於偽串流來說是次佳的,因為播放器必須下載整個檔案才能開始播放。如果中繼資料位於檔案的開頭,則 nginx 只需開始發送檔案內容即可。如果中繼資料位於檔案的末尾,則 nginx 必須讀取整個檔案並準備一個新的串流,以便中繼資料位於媒體資料之前。這會產生一些 CPU、記憶體和磁碟 I/O 的額外開銷,因此最好預先準備一個用於偽串流的原始檔案,而不是讓 nginx 在每個這樣的請求上執行此操作。

該模組還支援 HTTP 請求的 end 引數 (1.5.13),該引數設定播放的結束點。end 引數可以與 start 引數一起指定,也可以單獨指定

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

對於具有非零 startend 引數的匹配請求,nginx 將從檔案讀取中繼資料,準備具有請求時間範圍的串流,並將其發送到用戶端。這具有與上述相同的開銷。

如果 start 引數指向非關鍵影片影格,則此類影片的開頭將會中斷。為了修正此問題,影片在 start 點之前,可以在前面加上關鍵影格,以及它們之間的所有中間影格。這些影格將使用編輯清單 (1.21.4) 從播放中隱藏。

如果匹配的請求不包含 startend 引數,則沒有額外開銷,並且檔案將作為靜態資源簡單地發送。某些播放器還支援位元組範圍請求,因此不需要此模組。

預設情況下,不會建置此模組,應使用 --with-http_mp4_module 設定參數啟用。

如果先前使用了協力廠商的 mp4 模組,則應將其停用。

ngx_http_flv_module 模組為 FLV 檔案提供類似的偽串流支援。

範例設定

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 size;
預設值
mp4_buffer_size 512K;
內容 httpserverlocation

設定用於處理 MP4 檔案的緩衝區的初始 size

語法 mp4_max_buffer_size size;
預設值
mp4_max_buffer_size 10M;
內容 httpserverlocation

在中繼資料處理期間,可能需要更大的緩衝區。其大小不能超過指定的 size,否則 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 | factor;
預設值
mp4_limit_rate off;
內容 httpserverlocation

限制回應傳輸到用戶端的速率。速率限制是根據所服務 MP4 檔案的平均位元速率來限制的。為了計算速率,位元速率乘以指定的 factor。特殊值「on」對應於 1.1 的係數。特殊值「off」禁用速率限制。該限制是針對每個請求設定的,因此如果用戶端同時開啟兩個連線,則整體速率將是指定限制的兩倍。

此指令可作為我們商業訂閱的一部分。

語法 mp4_limit_rate_after time;
預設值
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 則部分支援。