為 Ogg 媒體配置伺服器
HTML <audio> 和 <video> 元素允許媒體呈現,而無需使用者安裝任何外掛或其他軟體即可實現。本指南介紹了一些 Web 伺服器可能需要進行的伺服器配置更改,以便正確地提供 Ogg 媒體檔案。如果您遇到伺服器尚未配置為識別的其他媒體型別,這些資訊也可能有用。
使用正確的 MIME 型別提供媒體
包含影片(當然,可能還包含音訊軌道)的 *.ogg 和 *.ogv 檔案應使用 video/ogg MIME 型別提供服務。僅包含音訊的 *.oga 和 *.ogg 檔案應使用 audio/ogg MIME 型別提供服務。
如果您不知道 Ogg 檔案包含音訊還是影片,您可以使用 MIME 型別 application/ogg 提供服務,瀏覽器會將其視為影片檔案。
大多數伺服器預設情況下不會使用正確的 MIME 型別提供 Ogg 媒體服務,因此您可能需要為此新增相應的配置。
對於 Apache,您可以在配置中新增以下內容
AddType audio/ogg .oga AddType video/ogg .ogv AddType application/ogg .ogg
您可以在我們全面的 網路媒體型別和格式指南 中找到有關可能的媒體檔案型別以及其中使用的編解碼器的具體資訊。特別是,關於 媒體容器格式 的文章在配置伺服器以正確託管媒體時將特別有用。
正確處理 HTTP 1.1 位元組範圍請求
為了支援查詢和播放尚未下載的媒體區域,Firefox 使用 HTTP 1.1 位元組範圍請求從查詢目標位置檢索媒體。此外,它使用位元組範圍請求查詢媒體的末尾(假設您提供了 Content-Length 標頭),以確定媒體的持續時間。
如果您的伺服器可以接受位元組範圍請求,則應接受 Accept-Ranges: bytes HTTP 標頭。它必須返回 206: Partial content 給所有位元組範圍請求;否則,瀏覽器無法確定您是否真正支援位元組範圍請求。您的伺服器還必須為請求 Range: bytes=0- 返回 206: Partial Content。
有關更多資訊,請參閱 HTTP 範圍請求。
包含常規關鍵幀
當瀏覽器在 Ogg 媒體中查詢指定時間時,它必須查詢查詢目標之前的最近關鍵幀,然後從那裡下載並解碼影片,直到到達請求的目標時間。關鍵幀之間的間隔越遠,所需時間就越長,因此在定期間隔包含關鍵幀很有幫助。
預設情況下,ffmpeg2theora 每 64 幀使用一個關鍵幀(或在每秒 30 幀的情況下大約每 2 秒使用一個關鍵幀),這效果很好。
注意:當然,您使用的關鍵幀越多,影片檔案就越大,因此您可能需要進行一些實驗以在檔案大小和查詢效能之間取得正確的平衡。
考慮使用 preload 屬性
舊版 Firefox 版本的配置
提供 X-Content-Duration 標頭
注意:從 Firefox 41 開始,不再支援 X-Content-Duration 標頭。有關更多詳細資訊,請參閱 Firefox 錯誤 1160695。
Ogg 格式不會封裝媒體的持續時間,因此,為了在影片控制元件上的進度條上顯示影片的持續時間,Gecko 需要使用其他方法確定媒體的長度。
Gecko 可以透過兩種方式做到這一點。最佳方法是在提供 Ogg 媒體檔案時提供 X-Content-Duration 標頭。此標頭以秒為單位(不是 HH:MM:SS 格式)提供影片的持續時間,作為浮點值。
例如,如果影片長 1 分 32.6 秒,則此標頭將為
X-Content-Duration: 92.6
如果您的伺服器在提供 Ogg 媒體時提供 X-Content-Duration 標頭,則 Gecko 不必執行任何額外的 HTTP 請求來查詢檔案的末尾以計算其持續時間。這使得整個過程更加高效,也更加準確。
作為一種較差的替代方案,Gecko 可以根據 Content-Length 估算影片長度。請參閱下一條。
不要對媒體檔案使用 HTTP 壓縮
減少 Web 伺服器負載的一種常見方法是在提供給支援 Web 瀏覽器的服務時使用 gzip 或 deflate 壓縮。
雖然不太可能,但瀏覽器可能會在請求媒體檔案時使用 Accept-Encoding: gzip,deflate 標頭宣告它支援 HTTP 壓縮 (gzip/deflate)。您的伺服器應配置為不這樣做。媒體檔案中的資料已經過壓縮,因此您不會從壓縮中獲得任何實際好處,並且使用壓縮會使瀏覽器無法正確查詢影片或確定其持續時間。
允許 HTTP 壓縮排行媒體流傳輸的另一個問題:如果使用 gzip 編碼,則 Apache 伺服器不會發送 Content-Length 響應標頭。
獲取 Ogg 媒體的持續時間
您可以使用 oggz-info 工具獲取媒體持續時間;此工具包含在 oggz-tools 包中。oggz-info 的輸出如下所示
$ oggz-info /g/media/bruce_vs_ironman.ogv
Content-Duration: 00:01:00.046
Skeleton: serialno 1976223438
4 packets in 3 pages, 1.3 packets/page, 27.508% Ogg overhead
Presentation-Time: 0.000
Basetime: 0.000
Theora: serialno 0170995062
1790 packets in 1068 pages, 1.7 packets/page, 1.049% Ogg overhead
Video-Framerate: 29.983 fps
Video-Width: 640
Video-Height: 360
Vorbis: serialno 0708996688
4531 packets in 167 pages, 27.1 packets/page, 1.408% Ogg overhead
Audio-Samplerate: 44100 Hz
Audio-Channels: 2
請注意,您不能提供 oggz-info 報告的 Content-Duration 行,因為它以 HH:MM:SS 格式報告。您需要將其轉換為僅以秒為單位,然後將其作為 X-Content-Duration 值提供服務。只需將 HH、MM 和 SS 解析為數字,然後執行 (HH*3600)+(MM*60)+SS 以獲取您應報告的值。
需要注意的是,oggz-info 似乎會對媒體進行讀取以計算其持續時間,因此最好儲存持續時間值,以避免在每次 HTTP 請求您的 Ogg 媒體時計算該值而導致的長時間延遲。