EmberYu / vic-blog

9 stars 0 forks source link

WebRTC - part2(用你的摄像头来传输视频) #16

Open EmberYu opened 5 years ago

EmberYu commented 5 years ago

WebRTC - part2(用你的摄像头来传输视频)

本文是笔者自己对https://codelabs.developers.google.com/codelabs/webrtc-web/#0的翻译版本,希望可以帮到各位理解WebRTC。如果有翻译不当之处,请参照原文 源码地址 git clone https://github.com/googlecodelabs/webrtc-web

这章你会学到

HTML代码

<!DOCTYPE html>
<html>

<head>

  <title>Realtime communication with WebRTC</title>

  <link rel="stylesheet" href="css/main.css" />

</head>

<body>

  <h1>Realtime communication with WebRTC</h1>

  <video autoplay playsinline></video>

  <script src="js/main.js"></script>

</body>

</html>

javascript代码

'use strict';

// On this codelab, you will be streaming only video (video: true).
const mediaStreamConstraints = {
  video: true,
};

// Video element where stream will be placed.
const localVideo = document.querySelector('video');

// Local stream that will be reproduced on the video.
let localStream;

// Handles success by adding the MediaStream to the video element.
function gotLocalMediaStream(mediaStream) {
  localStream = mediaStream;
  localVideo.srcObject = mediaStream;
}

// Handles error by logging a message to the console with the error message.
function handleLocalMediaStreamError(error) {
  console.log('navigator.getUserMedia error: ', error);
}

// Initializes media stream.
navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
  .then(gotLocalMediaStream).catch(handleLocalMediaStreamError);

运行一下吧

建立一个本地服务器(可以使用http-server或者live-server),然后在浏览器中打开index.html,你会看到如下图的样子

注意Web RTC只能在本地环境或者HTTPS下才能启用

背后的原理

随着用户调用getUserMedia(),浏览器会向用户请求授权来访问系统的摄像头(同一个域名只有在第一次请求摄像头时才会发起请求)。如果授权成功,会返回一个MediaStream,可以通过媒体元素设置srcObject来使用。

navigator.mediaDevices.getUserMedia(mediaStreamConstraints)
  .then(gotLocalMediaStream).catch(handleLocalMediaStreamError);
}
function gotLocalMediaStream(mediaStream) {
  localVideo.srcObject = mediaStream;
}

constraints参数允许你指定需要的媒体类型,在这个案例中,只捕获了视频,因为音频默认是禁用的(也可以通过配置audio: true打开音频捕获);
constraints参数同样也可以指定额外的参数,例如视频解析度

const hdConstraints = {
  video: {
    width: {
      min: 1280
    },
    height: {
      min: 720
    }
  }
}

你可以在这里找到所有的constraint类型,但是不是所有的设置都被所有浏览器支持,如果你的设置当前摄像头不支持,那么getUserMedia()会reject一个OverconstrainedError的状态,并且用户不会接收到访问摄像头的授权通知。
如果getUserMedia()调用成功,那么把通过摄像头返回的视频流设置为一个video标签的源即可播放

function gotLocalMediaStream(mediaStream) {
  localVideo.srcObject = mediaStream;
}

额外拓展

总结

这一样我们学会了

提示

最佳实践