WebRTC音视频实时互动技术:原理、实战与源码分析
上QQ阅读APP看书,第一时间看更新

5.5 本地视频预览

当使用getUserMedia()接口获得本地音视频流MediaStream后,可以使用H5的<video>标签将其展示出来。要实现这个功能很简单,只要将MediaStream赋值给<video>标签的srcObject属性即可。

我们来看一个具体的例子,重点看一看<video>标签是如何与MediaStream建立联系的。示例参见代码5.8。

代码5.8 本地视频预览


1 //H5 代码
2 <html >
3 …
4 <body >
5 …
6 // 定义了一个<video > 标签
7 <video autoplay playsinline ></video >
8 <script src="./demo.js" ></script >
9 …
10 </body >
11 </html >
12
13 //demo.js
14 …
15 // 从H5 获得<video > 标签
16 const lv = document.querySelector('video ');
17
18 // getUserMedia 的采集限制
19 const contrains = {
20   video: true ,
21   audio: true
22 };
23
24 // 调用getUserMedia 成功后, 回调该函数
25 function gotLocalStream(mediaStream){
26    lv.srcObject = mediaStream;
27 }
28 …
29 navigator.mediaDevices.getUserMedia(contrains)
30     .then(gotLocalStream)
31     .catch(handleLocalMediaStreamError);
32 …

上面的代码由两部分组成,即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>标签播放出来了。至此就完成了本地视频预览工作。