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
對於具有非零 start
或 end
引數的匹配請求,nginx 將從檔案讀取中繼資料,準備具有請求時間範圍的串流,並將其發送到用戶端。這具有與上述相同的開銷。
如果 start
引數指向非關鍵影片影格,則此類影片的開頭將會中斷。為了修正此問題,影片在 start
點之前,可以在前面加上關鍵影格,以及它們之間的所有中間影格。這些影格將使用編輯清單 (1.21.4) 從播放中隱藏。
如果匹配的請求不包含 start
和 end
引數,則沒有額外開銷,並且檔案將作為靜態資源簡單地發送。某些播放器還支援位元組範圍請求,因此不需要此模組。
預設情況下,不會建置此模組,應使用 --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 |
---|---|
預設值 |
mp4_buffer_size 512K; |
內容 |
http 、server 、location |
設定用於處理 MP4 檔案的緩衝區的初始 size
。
語法 |
mp4_max_buffer_size |
---|---|
預設值 |
mp4_max_buffer_size 10M; |
內容 |
http 、server 、location |
在中繼資料處理期間,可能需要更大的緩衝區。其大小不能超過指定的 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 |
---|---|
預設值 |
mp4_limit_rate off; |
內容 |
http 、server 、location |
限制回應傳輸到用戶端的速率。速率限制是根據所服務 MP4 檔案的平均位元速率來限制的。為了計算速率,位元速率乘以指定的 factor
。特殊值「on
」對應於 1.1 的係數。特殊值「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 則部分支援。