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,您的视频现在将自适应流式传输。