DASH 自適應流式傳輸用於 HTML 影片

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

首先,您需要將您的 WebM 影片轉換為 DASH 清單,並附帶各種位元率的影片檔案。一開始,您只需要 FFmpeg 程式,該程式來自 ffmpeg.org,支援 libvpx 和 libvorbis 來處理 WebM 影片和音訊,版本至少為 2.5 (可能;此文件已在 3.2.5 版本下測試)。

首先,使用您現有的 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

然後,建立清單檔案。

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 伺服器支援位元組範圍請求,並且設定為以 Content-Type: application/dash+xml 提供 .mpd 檔案,您就可以開始了。

然後,為了正確地將此 .mpd 檔案連線到您的 <video> 元素,您需要一個 JavaScript 庫,如 dash.js,因為目前沒有瀏覽器原生支援 DASH。請閱讀 dash.js 快速入門指南,瞭解如何設定您的頁面來使用它。