webRTC API

WebRTC API包括媒体捕获、音频视频的编码和解码、传输层和会话管理。

1.媒体捕获MediaStream(又名getUserMedia)

MediaStream接口是一个媒体内容的流.,一个流包含几个轨道,比如视频和音频轨道。作用是从用户本地摄像机和麦克风访问媒体流。getUserMedia()方法是访问本机输入设备的主要方式。

第一步是访问用户设备的摄像头和麦克风。我们检测可用设备的类型,获得用户访问这些设备的权限,并管理数据流。

注意:

  • 实时音视频以流对象的形式表示
  • 通过询问用户是否授权,有安全控制,只允许授予一次权限,此后不再要求访问
  • 输入设备选择由mediaStream处理
  • 每个mediaStream对象包括几个mediaStreamTRack对象,代表来自不同设备的音视频
  • 每个mediaStreamTrack对象可能包括几个信道(左声道和右声道)
  • 两种方法输出mediaStream对象。首先将音视频输出显示,设置srcObject属性MediaStream附加到视频元素,然后将输出发送到RTCPeerConnection对象,然后传送到远程对象。
(1)获取本地媒体流,并检测浏览器是否支持
navigator.mediaDevices.getUserMedia  =                         navigator.mediaDevices.getUserMedia ||
navigator.mediaDevices.webkitGetUserMedia ||
navigator.mediaDevices.mozGetUserMedia ||
navigator.mediaDevices.msGetUserMedia; if (navigator.getUserMedia) {
// 支持
} else {
// 不支持
}
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then( ).catch( );
(2)接受的参数

getUserMedia方法接受三个参数,第一个参数是一个对象,即约束条件,另外两个是成功回调函数和失败回调函数。

约束条件

约束条件里包括捕获对象,表示要获取哪些多媒体设备,你获取本地媒体流时是要求获取摄像头还是麦克风,也可以设置视频分辨率的值、宽高比、面向模式(前置还是后置摄像头)、帧速率、高度、宽度等。可以单独把约束条件提出来单独写。

navigator.mediaDevices.getUserMedia({
// 以下就是约束条件
video: true,
audio: true
})
.then(createConn )
.catch(
console.log(`getUserMedia() error: ${e.name}`);
); // 或者
let constraints = {
video: true,
audio: true,
...
}
navigator.mediaDevices.getUserMedia(constraints,onSuccess, onError)

除了指定捕获对象之外,还可以指定一些限制条件,比如视频的宽高等等。

let constraints = {
video: {
minWidth: 1280,
minHeight: 720
}
...
}

如果网页使用了getUserMedia方法,浏览器就会询问用户,是否同意浏览器调用麦克风或摄像头。如果用户同意,就调用回调函数onSuccess;如果用户拒绝,就调用回调函数onError

成功回调函数

获取多媒体设备成功时调用。onSuccess回调函数的参数是一个数据流对象stream。stream.getAudioTracks方法和stream.getVideoTracks方法,分别返回一个数组,其成员是数据流包含的音轨和视轨(track)。

使用的声音源和摄影头的数量,决定音轨和视轨的数量。比如,如果只使用一个摄像头获取视频,且不获取音频,那么视轨的数量为1,音轨的数量为0。每个音轨和视轨,有一个kind属性,表示种类(video或者audio),和一个label属性(比如FaceTime HD Camera (Built-in))

失败回调函数

获取多媒体失败时调用。Error对象的code属性有说明错误的类型:

  • PERMISSION_DENIED:用户拒绝提供信息。
  • NOT_SUPPORTED_ERROR:浏览器不支持硬件设备。
  • MANDATORY_UNSATISFIED_ERROR:无法发现指定的硬件设备。

下面看一个完整例子:

let constraints = {video: true};

function onSuccess(stream) {
let video = document.querySelector("video");
// video.src = window.URL.createObjectURL(stream);这种写法已被移除
video.srcObject = stream;
} function onError(error) {
console.log("getUserMedia error: ", error);
} navigator.getUserMedia(constraints, onSuccess, onError);

注意,如果存在回声,应该在video或者audio节点处添加muted,进行简单的回声消噪。

(3)屏幕捕获

可以看看这个例子

(4)方法

详情可见[mediaStream-MDN](

webRTC脱坑笔记(二)— webRTC API之MediaStream(getUserMedia)的更多相关文章

  1. webRTC脱坑笔记(一)— 初识webRTC

    webRTC概述 WebRTC--- `Web browsers with Real-Time Communications (RTC)` WebRTC是一个开源项目,可以在`Web`和本机应用程序中 ...

  2. webRTC脱坑笔记(三)— webRTC API之RTCPeerConnection

    RTCPeerConnection API是每个浏览器之间点对点连接的核心,RTCPeerConnection是WebRTC组件,用于处理对等体之间流数据的稳定和有效通信. RTCPeerConnec ...

  3. webRTC脱坑笔记(四)— windows下Nginx对Node服务的反向代理

    Nginx反向代理 1.什么是反向代理 当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集群服务器的时候无法访问,必须通过第三方服务器才能访问 ...

  4. ZooKeeper学习笔记二:API基本使用

    Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...

  5. es6 入坑笔记(二)---函数扩展,箭头函数,扩展运算符...

    函数扩展 1.函数可以有默认值 function demo( a = 10,b ){} 2.函数可以使用解构 function demo( { a = 0,b = 0 } = {} ){ } 3.函数 ...

  6. 一步步yum安装LNMP,脱坑笔记!!!

    更改国内yum源: 1.备份yum源文件,位置在/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/ ...

  7. pandas处理json脱坑(二)--jsonError: Expecting ',' delimiter: line 1 column 2674

    Expecting ',' delimiter: line 1 column 2674 json_dict = json.loads(row[json_columns].replace("' ...

  8. WebRTC的学习(二)

    英文原文的链接地址为:https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Overview WebRTC是由一些关联的API和协议一 ...

  9. WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建

    WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建 四月 4, 2019 作者:李超,音视频技术专家.本文首发于 RTC 开发者社区,欢迎在社区留言与作者交流. htt ...

随机推荐

  1. Java控制台输入字符串及字符串比较

    需求描述:茵茵很喜欢研究车牌号码,从车牌号码上可以看出号码注册的早晚,据研究发现,车牌号码是按字典序发放的,现在她收集了很多车牌号码,请你设计程序帮她判断注册较早的号码.车牌号码由5个字母或数字组成. ...

  2. css content属性

    content 属性与 :before 及 :after 伪元素配合使用,来插入生成内容. 用于定义元素之前或之后放置的生成内容.默认地,这往往是行内内容,不过该内容创建的框类型可以用属性 displ ...

  3. 【经验分享】 解决CentOS7 安装VMTools提示找不到Kernel头文件的方案

    配置一个Linux的开发环境,用VM10+CentOS7(Kernel版本3.10.0-327.10.1.el7),之后发现VMTools功能不全,查证后发现需要卸载重装,于是开始折腾. 按照各种说明 ...

  4. 异常-打开文件过多(too many open files)

    异常-打开文件过多 异常报错如下 09-Oct-2019 15:37:51.923 严重 [http-nio2-8080-Acceptor-0] org.apache.tomcat.util.net. ...

  5. sysbench - 数据库功能及性能测试工具

    sysbench 的 GitHub 参考资料 1.0 之后的版本使用方法跟之前的有所区别,下面所有内容基于 1.0.9 版本. 另外,为了方便管理测试,最好不要通过命令直接运行测试,而是写成脚本自动化 ...

  6. DEDE网站地图优化技巧

    DEDE网站地图优化技巧-把网站地图生成在系统根目录,利于搜索引擎收录相信恨多用DEDECMS做站的朋友,为避免将data目录内的东西随便外泄,在robots中将data目录屏蔽了,但是DEDE默认的 ...

  7. Centos安装GD库

    tar zxvf ncurses-5.6.tar.gz 进入目录 cd ncurses-5.6 生成 makefile文件,再进一步编译 ./configure --prefix=/usr --wit ...

  8. HTTP权威指南-学习笔记

    目录 HTTP权威指南-学习笔记 HTTP: Web的基础 URL与资源 HTTP报文 连接管理 HTTP结构 Web服务器 代理 缓存 集成点: 网关,隧道及中继 Web机器人 识别,认证与安全 客 ...

  9. Phone-java标准类

    //project-module-package //.代表包的目录层次 package cn.learn.day01.demo01; /* 1.类是一组相关属性(成员变量)与行为(方法)的集合,对象 ...

  10. LOJ 2234/BZOJ 3629 聪明的燕姿(数论+DFS)

    题面 传送门 分析 看到约数之和,我们首先想到约数和公式 若$ x=\prod_{i=1}^{n}p_i^{k_i} \(,则x的约数和为\) \prod_{i=1}^{n} \sum_{j=0}^{ ...