2.3.8 约束的advanced属性

在MediaTrackConstraints的定义里,我们可以看到MediaTrackConstraints继承自MediaTrackConstraintSet,增加了advanced属性。

advanced属性用来指定更加高级的约束需求,通常与其他基础约束一起使用。当浏览器满足了基础约束需求后,再尝试进一步满足advanced的约束需求。

advanced和ideal都能表示进一步的约束需求,但是它们是有区别的,advanced的优先级高于ideal。为了读者能够更好地理解advanced的用法及其与ideal的区别,下面结合示例展示浏览器满足约束需求的流程。

代码清单2-29展示了一个基础的约束需求,如果浏览器只能同时满足部分约束,比如能够满足width和height,但是不能满足aspectRatio,此时浏览器会为不能满足的约束需求分配一个合理值。

代码清单2-29 基础约束需求

const constraints = {
  width: 1280,
  height: 720,
  aspectRatio: 3/2
};

代码清单2-30增加了一些复杂度,引入了min和ideal值,min指定了强制性的最小值,ideal指定了期望的理想值。

在width的约束值中,指定了min为640,ideal为1280,表示希望采集的视频最小宽度为640像素,理想宽度为1280像素。

代码清单2-30 引入min/ideal的约束需求

const constraints = {
  frameRate: {min: 20},
  width: {min: 640, ideal: 1280},
  height: {min: 480, ideal: 720},
  aspectRatio: 3/2
};

浏览器在处理该约束需求时,返回的视频宽度不能低于min的值,如果不支持采集宽度大于或等于640像素的视频,则返回失败。

如果浏览器支持采集宽度为1280像素的视频,则width值使用1280,返回成功;如果浏览器不支持,则默认为width指定一个大于640的值,仍然返回成功。至于这个默认值是多少,就由浏览器来决定了。

代码清单2-31引入advanced属性,继续增加复杂度,浏览器的行为与上面的例子基本相同,但是在尝试满足ideal之前,浏览器会先去处理advanced列表。

代码清单2-31 包含advanced属性的约束需求

const constraints = {
  width: {min: 640, ideal: 1280},
  height: {min: 480, ideal: 720},
  advanced: [
    {width: 1920, height: 1280},
    {aspectRatio: 4/3}
  ]
};

advanced列表包含了两个约束集,第一个指定了width和height,第二个指定了aspectRatio。它表达的含义是“视频分辨率应该至少为640像素×480像素,能够达到1920像素×1280像素最好,如果达不到,就满足4/3的宽高比,如果还不能满足,就使用一个最接近1280像素×720像素的分辨率。”