WebRTC系列(1)-手把手教你实现一个浏览器拍照室Demo

1.WebRTC开发背景

  由于业务需求,需要在项目中实现实时音视频通话功能,之前基于浏览器开发的Web项目要进行音视频通话,需要安装flash插件才能实现或者使用C/S客户端进行通信。随着互联网技术的驱动下,在很多场景下需要进行音视频通信,在生活中我们现在使用电话越来越少,使用微信和视频越来越多。在一些行业也需要进行音视频实时通信,如:在线教育,远程医疗,保险理赔等等。有了WebRTC,可以开发一些好的网页应用,使得音视频通话越来越简单,无需安装任何插件,只需打开网页,就能实现音视频通话,方然也能实现消息收发,文件收发等等,下面,根据自己平时的项目开发与,对WebRTC就行一个简单的理解与概述,最终实现一个简单的拍照室Demo。

2.WebRTC历史和概述

  WebRTC是“网络实时通信”(Web Real Time Communication)的缩写。它最初是为了解决浏览器上视频通话而提出的,即两个浏览器之间直接进行视频和音频的通信,不经过服务器。后来发展到除了音频和视频,还可以传输文字和其他数据。2010年5月,Google以6820万美元收购VoIP软件开发商Global IP Solutions的GIPS引擎,并改为名为“WebRTC”。WebRTC使用GIPS引擎,实现了基于网页的视频会议,并支持722,PCM,ILBC,ISAC等编码,同时使用谷歌自家的VP8视频解码器;同时支持RTP/SRTP传输等。Google是WebRTC的主要支持者和开发者,它推动了WebRTC标准的确立。

  WebRTC是一门年轻的技术,从2011推出到2017年,一直发展的不温不火。根据一段时间的开发,个人认为主要原因有:各个浏览器的支持兼容程度和在互联网环境下点对点能够连接的成功率。从2017年苹果公司宣布iOS11的Safari浏览器支持WebRTC,一些云通信产品例如腾讯云通信和网易云通信也是基于WebRTC上进行封装二次开发,也间接的说明了WebRTC发展会越来越好。

   

3.基本概念的了解

  为了简化开发,WebRTC在浏览器中API集成了大量的技术,解决了一些繁重的问题,如捕捉摄像头和麦克风,处理音视频流,传输层等等。

  

  • 捕捉摄像头和麦克风

  建立通信平台第一步要检测用户设备的摄像头和麦克风权限,先检测设备的可用性,然后在获取用户授权并与设备建立连接,最后获取一段数据流。

  • 音频与视频的编解码

  在互联网要发送一段音视频数据,技术优化了网络数据,数据尺寸也还是很大,所以要对数据在发送端编码,然后在接收端解码。WebRTC内置的几种编解码器包括:H.264,Opcus,iSAC,VP8。作为前端开发的我,最这些编解码技术当然不是很了解。幸运的是,当两个浏览器回话时,会综合两端情况选择最优的编解码器。

  • 传输层

  主要处理数据丢包,数据包排序以及建立用户之间的连接问题

  • 会话管理

  通常来说就是信令(Signaling),负责在浏览器中建立并管理多个连接。

4.获取用户媒体

  创建一个基于WebRTC的通信平台,首先要通过用户的网络摄像头和麦克风获取实时的视频和音频流,可以通过调用浏览器的getUserMedia API来实现。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>获取媒体流</title>
</head>
<body>
<div id="app">
  <h1>获取媒体流</h1>
  <video autoplay></video>
</div>
<script>
  function hasUserMedia() {
    return !!(navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
  }

  if (hasUserMedia()) {
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
    navigator.getUserMedia({video: true, audio: false}, function (stream) {
      console.log(stream);
      var video = document.querySelector(‘video‘);
      video.src=window.URL.createObjectURL(stream);
    }, function (err) {
      console.log(err);
    });
  } else {
    alert("Sorry, your browser does not support getUserMedia.");
  }
</script>
</body>
</html>

是否打开使用摄像头权限

  注意:打开摄像头后获取到的视频流展示在Video标签中,video标签需要加上autoplay属性视频才可以播放,在调试中可以把getUserMedia方法参数中的audio设置为:false,避免杂音太大,同理,把video设置为false只能听到自己说话而没有画面,可以代替普通电话使用。

5.限制视频流

  我们可以通过设置参数来控制视频和音频是否使用,除此之外,我们可以传入一个对象做更复杂的限制,如分辨率,视频宽高比等等。

navigator.getUserMedia({video: {
        width: 320,
        /*height:240,*/
        aspectRatio:1.77
      }, audio: false}, function (stream) {
      console.log(stream);
      var video = document.querySelector(‘video‘);
      video.src=window.URL.createObjectURL(stream);
    }, function (err) {
      console.log(err);
    });

可以根据自己业务需求来设置固定的宽高或分辨率等等。

6.完成一个拍照室Demo

  通过调用摄像头获取到的视频流以及H5的canvas标签我们可以完成一个简易的拍照功能。

增加一个拍照按钮以及一个canvas,修改后的整个页面代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>获取媒体流</title>
</head>
<body>
<div id="app">
  <h1>获取媒体流</h1>
  <video id="video" autoplay></video>
  <button type="button" onclick="capture()">点击拍照</button>
  <canvas id="canvas" width="320" height="240"></canvas>
</div>
<script>
  function hasUserMedia() {
    return !!(navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
  }

  if (hasUserMedia()) {
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
    navigator.getUserMedia({video: {
        width: 320,
        height:240,
      }, audio: false}, function (stream) {
      console.log(stream);
      var video = document.querySelector(‘video‘);
      video.src=window.URL.createObjectURL(stream);
    }, function (err) {
      console.log(err);
    });
  } else {
    alert("Sorry, your browser does not support getUserMedia.");
  }

  function capture(){
    console.log(‘capture...‘);
    var cxt=document.getElementById(‘canvas‘).getContext(‘2d‘);
    var video=document.getElementById(‘video‘);
    cxt.drawImage(video,0,0);
  }
</script>
</body>
</html>

现在单击一个点击拍照按钮,可以捕捉视频的某一帧并同时绘制到canvas上,加上canvas功能本来就很强大,后期对照片的旋转,剪裁,滤镜也都是可以实现的。

延伸:现在很多WebApp上要实时上传证件功能,我们通过这种WebRTC+canvas也是可以实现的,而且是浏览器直接调的硬件拍照,有没有很溜。

7.开发中遇到的问题

  在直接用http打开本地服务器页面是调用不了摄像头的,浏览器的限制认为http下是不安全的,但是可以用127.0.0.1或者localhost来代替本机ip。网页部署到服务器时也得使用https协议来返回页面,否则,无法调用摄像头。

  

  以上简单的介绍了WebRTC的发展历史以及一些基本概念,让大家对其有个初步的了解,最后通过调用摄像头完成一个拍照室的Demo。后续文章再详细的写如何通过WebRTC来实现点对点通信,相信WebRTC功能会越来越强大,这只是第一步。



参考资料:

《Learning WebRTC 中文版》 

《JavaScript 标准参考教程(alpha) 阮一峰》

WebRTC百科

转载请注明出处,谢谢。

原文地址:https://www.cnblogs.com/peerless1029/p/9955640.html

时间: 2024-10-04 00:41:46

WebRTC系列(1)-手把手教你实现一个浏览器拍照室Demo的相关文章

Android应用系列:手把手教你做一个小米通讯录(附图附源码)

前言 最近心血来潮,突然想搞点仿制品玩玩,很不幸小米成为我苦逼的第一个试验品.既然雷布斯的MIUI挺受欢迎的(本人就是其的屌丝用户),所以就拿其中的一些小功能做一些小demo来玩玩.小米的通讯录大家估计用过小米的都清楚是啥子样的,没用过小米的也别着急,瞧瞧我的demo,起码也有七八分相似滴.先上图看效果 我是图: PS:吐槽一下,博客园上个图真难,所以搞了个短点的gif上才没失败....唉... 在这里仅仅是实现了逻辑交互的效果,并没有点击打电话的功能,因为也不难就懒得加了... 分析 我们说说

手把手教你打造一个Material Design风格的App(二)

--接上文. 3.1添加ToolBar(ActionBar) 添加ToolBar非常简单,你需要做的仅仅是为toolbar创建一个单独的layout布局,如果你想在哪里展示toolbar,只要在对应布局里将toolbar的布局文件include进来即可. (8)在res-->layout文件夹下创建一个名为toolbar.xml的文件,然后在里面添加一个android.support.v7.widget.Toolbar元素,这样就创建了一个具有特定高度和主题的toolbar. toolbar.x

手把手教你打造一个Material Design风格的App(三)

--接上文. 3.2添加抽屉导航 添加导航抽屉跟Android 5.0之前是一样的,只是以前我们使用ListView来作为菜单容器,现在我们则使用Material Design风格的RecyclerView. (14)在你工程的java文件夹中,创建3个名为activity.adapter.model的包,将MainActivity.java移到activtiy包中,这样做使得你的代码可以很好地组织和管理. (15)打开位于app模块下的build.gradle文件并添加如下依赖.添加完依赖之后

手把手教你打造一个Material Design风格的App(一)

你应该听说过Android的Material Design,它是在Android 5.0(Lollipop)版本引入的.在Material Design中还引入了很多新东西,比如Material Theme,新的小部件,自定义的阴影,矢量图片及自定义动画等.如果你之前没有用过Material Design,那么本文将是一个很好的入门教程. 在这篇教程中,我们将会学习Material Design开发的基本步骤,即编写自定义的主题以及使用RecyclerView来实现抽屉导航. 通过下面的两个链接

大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

上篇小弟分享了几个"即席查询与分析"的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的"手把手教你搭建即席查询与分析Demo"啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货,目的只有一个,就是让每一个伙伴都能根据本篇向导搭建出一个"即席查询与分析Demo". 为了让各位伙伴能够尽快上手体验,所选案例就以上一篇中的"机动车缉查布控即席查询与分析"为例,上篇我们已经比较详尽的分析了用户需求,没好好听课的

手把手教你画一个 逼格满满圆形水波纹loadingview Android

才没有完结呢o( ̄︶ ̄)n .大家好,这里是番外篇. 拜读了爱哥的博客,又学到不少东西.爱哥曾经说过: 要站在巨人的丁丁上. 那么今天,我们就站在爱哥的丁丁上来学习制作一款自定义view(开个玩笑,爱哥看到别打我). 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50523713 上一篇 带领大家做了一款炫酷的loading动画view 手把手带你做一个超炫酷loading成功动画view  不知道大家跟着做了一遍没有呢? 在开始之

手把手教你构建一个音视频小程序

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯视频云终端团队发表于云+社区专栏 腾讯云提供了全套技术文档和源码来帮助您快速构建一个音视频小程序,但是再好的源码和文档也有学习成本,为了尽快的能调试起来,我们还提供了一个免费的一键部署服务:您只需轻点几下鼠标,就可以在自己的账号下获得一个音视频小程序,同时附送一台拥有独立域名的测试服务器,让您可以在 5 分钟内快速构建出自己的测试环境. 通过微信公众平台授权登录腾讯云 打开 微信公众平台 注册并登录小程序,按如下步骤操作: 单

手把手教你做一个吸引人的购物网站

购物网站盈利能力相信很多用户都是有目共睹的,因此不少的中小企业对购物网站的建设也是趋之若鹜,怎么企业设计购物网站有什么方法能够为购物网站提高人气呢?下面看看凡科网站建设带来的一些分析. 要对用户的跟随心理进行分析.无论是实体销售还是线上的销售,用户都会有一种莫名的跟随心理.网上购物网站的评论就好想是生活中的口口相传,购买过的用户可以对产品进行评论,这样可以给潜在用户一个引导作用. 企业要对购物网站网页的每一个角落都要发挥极限.企业都知道网页的每一个角落都是有用的,购物网站也一样.一个列表页不会是

手把手教你编写一个简单的PHP模块形态的后门

看到Freebuf 小编发表的用这个隐藏于PHP模块中的rootkit,就能持久接管服务器文章,很感兴趣,苦无作者没留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一个非常流行的web server端的script语言.目前很多web应用程序都基于php语言实现.由于php是个开源软件并易于扩展,所以我们可以通过编写一个PHP模块(module 或者叫扩展 extension)来实现一个Backdoor. 本文就简单介下如何一步步编写一个简单的php 动态扩展后门. 0×01. p