本地视频预览
当使用 getUserMedia() 接口获得本地音视频流 MediaStream 后,可以使用 H5 的 <video> 标签将其展示出来。要实现这个功能很简单,只要将 MediaStream 赋值给 <video> 标签的 srcObject 属性即可。
我们来看一个具体的例子,重点看一看 <video> 标签是如何与 MediaStream 建立联系的。示例参见代码 5.8。
代码5.8 本地视频预览
<!-- H5 代码 -->
<html>
<head>
<!-- ... -->
</head>
<body>
<!-- 定义了一个 <video> 标签 -->
<video autoplay playsinline></video>
<script src="./demo.js"></script>
<!-- ... -->
</body>
</html>
// demo.js
// 从 H5 获得 <video> 标签
const lv = document.querySelector('video');
// getUserMedia 的采集限制
const constraints = {
video: true,
audio: true
};
// 调用 getUserMedia 成功后,回调该函数
function gotLocalStream(mediaStream) {
lv.srcObject = mediaStream;
}
// 调用 getUserMedia
navigator.mediaDevices.getUserMedia(constraints)
.then(gotLocalStream)
.catch(handleLocalMediaStreamError);
// ...
上面的代码由两部分组成,即 H5 代码和 js 代码。其中,H5 代码用于定义 <video> 标签;js 代码用于控制音视频数据的采集,并将采集的视频数据与 <video> 标签建立联系。
首先来看 H5 的代码。该代码非常简单,唯一需要说明的是 <video> 标签的两个属性,即 autoplay 和 playsinline。其中 autoplay 表示 <video> 标签收到音视频数据后立即开始播放;playsinline 的作用是让播放器在页面内播放,而不是调用外部的系统播放器播放音视频。
接下来看一下 demo.js。demo.js 中的大部分代码已经在 5.3 节中介绍过了。需要重点说明的是,MediaStream 与 <video> 标签的绑定是在回调函数 gotLocalStream() 中完成的。只要将 MediaStream 赋值给 <video> 标签(即代码第 26 行),即完成了绑定工作。这样,从音视频设备上采集的数据就可以通过 <video> 标签播放出来了。至此就完成了本地视频预览工作。