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 快速入门指南,了解如何设置您的页面来使用它。