HTML 5 影片的 DASH 自適應流媒體

動態自適應 HTTP 流媒體 (DASH) 是一種自適應流媒體協議。這意味著它允許影片流根據網路效能在位元率之間切換,以保持影片播放。

瀏覽器支援

Firefox 21 包含一個用於 HTML WebM 影片的 DASH 實現,預設情況下處於關閉狀態。可以透過“about:config”和“media.dash.enabled”首選項啟用它。

Firefox 23 移除對 HTML WebM 影片的 DASH 支援。它將由 Media Source Extensions API 的實現替換,這將允許透過 dash.js 等 JavaScript 庫支援 DASH。有關詳細資訊,請參見錯誤 778617

使用 DASH - 伺服器端

首先,您需要使用附帶的各種位元率影片檔案將 WebM 影片轉換為 DASH 清單。首先,您只需要來自 ffmpeg.org 的 FFmpeg 程式,該程式具有用於 WebM 影片和音訊的 libvpx 和 libvorbis 支援,至少是 2.5 版本(可能是;這在 3.2.5 上測試過)。

1. 使用現有的 WebM 檔案建立單個音訊檔案和多個影片檔案

例如

檔案 in.video 可以是任何包含至少一個音訊流和一個影片流的容器,這些流可以被 FFmpeg 解碼,

使用以下命令建立音訊:

bash
ffmpeg -i in.video -vn -acodec libvorbis -ab 128k -dash 1 my_audio.webm

建立每個影片變體。

bash
ffmpeg -i in.video -c:v libvpx-vp9 -keyint_min 150 -g 150 -tile-columns 4 -frame-parallel 1 -f webm -dash 1 \
-an -vf scale=160:90 -b:v 250k -dash 1 video_160x90_250k.webm
bash
ffmpeg -i in.video -c:v libvpx-vp9 -keyint_min 150 -g 150 -tile-columns 4 -frame-parallel 1  -f webm -dash 1 \
-an -vf scale=320:180 -b:v 500k -dash 1 video_320x180_500k.webm
bash
ffmpeg -i in.video -c:v libvpx-vp9 -keyint_min 150 -g 150 -tile-columns 4 -frame-parallel 1  -f webm -dash 1 \
-an -vf scale=640:360 -b:v 750k -dash 1 video_640x360_750k.webm
bash
ffmpeg -i in.video -c:v libvpx-vp9 -keyint_min 150 -g 150 -tile-columns 4 -frame-parallel 1  -f webm -dash 1 \
-an -vf scale=640:360 -b:v 1000k -dash 1 video_640x360_1000k.webm
bash
ffmpeg -i in.video -c:v libvpx-vp9 -keyint_min 150 -g 150 -tile-columns 4 -frame-parallel 1  -f webm -dash 1 \
-an -vf scale=1280:720 -b:v 1500k -dash 1 video_1280x720_1500k.webm

或者在一個命令中完成所有操作。

bash
ffmpeg -i in.video -c:v libvpx-vp9 -keyint_min 150 \
-g 150 -tile-columns 4 -frame-parallel 1 -f webm -dash 1 \
-an -vf scale=160:90 -b:v 250k -dash 1 video_160x90_250k.webm \
-an -vf scale=320:180 -b:v 500k -dash 1 video_320x180_500k.webm \
-an -vf scale=640:360 -b:v 750k -dash 1 video_640x360_750k.webm \
-an -vf scale=640:360 -b:v 1000k -dash 1 video_640x360_1000k.webm \
-an -vf scale=1280:720 -b:v 1500k -dash 1 video_1280x720_1500k.webm

2. 建立清單檔案

bash
ffmpeg \
  -f webm_dash_manifest -i video_160x90_250k.webm \
  -f webm_dash_manifest -i video_320x180_500k.webm \
  -f webm_dash_manifest -i video_640x360_750k.webm \
  -f webm_dash_manifest -i video_1280x720_1500k.webm \
  -f webm_dash_manifest -i my_audio.webm \
  -c copy \
  -map 0 -map 1 -map 2 -map 3 -map 4 \
  -f webm_dash_manifest \
  -adaptation_sets "id=0,streams=0,1,2,3 id=1,streams=4" \
  my_video_manifest.mpd

-map 引數對應於輸入檔案,按它們給出的順序排列;您應該為每個檔案提供一個。-adaptation_sets 引數將它們分配到自適應集;例如,這將建立一個包含流 0、1、2 和 3(影片)的集 (0),以及另一個僅包含流 4(音訊流)的集 (1)。

將清單和相關的影片檔案放在您的 Web 伺服器或 CDN 上。DASH 透過 HTTP 工作,因此只要您的 HTTP 伺服器支援位元組範圍請求,並且設定了使用 mimetype="application/dash+xml" 提供 .mpd 檔案,那麼您就準備好了。

使用 DASH - 客戶端

您需要修改您的網頁,使其首先指向 DASH 清單,而不是直接指向特定影片檔案

html
<video>
  <source src="movie.mpd" />
  <source src="movie.webm" />
  Your browser does not support the video tag.
</video>

就是這樣!如果瀏覽器支援 DASH,您的影片現在將自適應流式傳輸。