WebRTC技术详解:从0到1构建多人视频会议系统
上QQ阅读APP看书,第一时间看更新

2.7 播放媒体流

我们使用API成功获取媒体流后,通常希望将该媒体流播放出来。将MediaStream对象指定给HTML的video(或audio)元素即可进行本地播放。

代码清单2-44使用getUserMedia()方法获取包含音视频轨道的媒体流,将流对象赋值给视频元素的srcObject属性,从而实现本地播放音视频。

代码清单2-44 本地播放媒体流示例

<html>
  <head>
    <title>Local video playback</title>
  </head>
  <body>
    <video id="localVideo" autoplay playsinline controls />
  </body>
</html>

async function playVideoFromCamera() {
  try {
    const constraints = {'video': true, 'audio': true};
    const stream = await
      navigator.mediaDevices.getUserMedia(constraints);
    const videoElement = document.querySelector('video#localVideo');
    videoElement.srcObject = stream;
  } catch(error) {
    console.error('Error opening video camera.', error);
  }
}

HTML的video元素通常需要指定autoplay、controls和playsinline属性,autoplay允许自动播放视频,controls显示播放器控制按钮,playsinline允许在Safari环境中进行非全屏播放。

iOS Safari的限制

iOS 10之前的版本,Safari不支持自动播放视频,也不支持内联播放。也就是说,视频只能由用户主动操作才能播放,并且是全屏播放的。

iOS 10版本引入了新的播放政策,通过设置playsinline属性可以让Safari浏览器窗口播放视频;如果不设置playsinline属性,Safari仍会默认全屏播放视频。

iOS 10版本还允许自动播放无音轨或者静音的视频,但是对于有声音的视频,仍然需要用户进行如下主动操作。

1)用户点击播放按钮。

2)若用户触发了click/doubleclick/keydown等事件,则在事情处理函数中调用video.play()方法。