webRTC脱坑笔记(二)— webRTC API之MediaStream(getUserMedia)
webRTC API
WebRTC API
包括媒体捕获、音频视频的编码和解码、传输层和会话管理。
getUserMedia()
:捕获音频和视频。MediaRecorder
:录制音频和视频。RTCPeerConnection
:在用户之间传输音频和视频。RTCDataChannel
:用户之间的流数据。
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)的更多相关文章
- webRTC脱坑笔记(一)— 初识webRTC
webRTC概述 WebRTC--- `Web browsers with Real-Time Communications (RTC)` WebRTC是一个开源项目,可以在`Web`和本机应用程序中 ...
- webRTC脱坑笔记(三)— webRTC API之RTCPeerConnection
RTCPeerConnection API是每个浏览器之间点对点连接的核心,RTCPeerConnection是WebRTC组件,用于处理对等体之间流数据的稳定和有效通信. RTCPeerConnec ...
- webRTC脱坑笔记(四)— windows下Nginx对Node服务的反向代理
Nginx反向代理 1.什么是反向代理 当我们有一个服务器集群,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集群服务器的时候无法访问,必须通过第三方服务器才能访问 ...
- ZooKeeper学习笔记二:API基本使用
Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...
- es6 入坑笔记(二)---函数扩展,箭头函数,扩展运算符...
函数扩展 1.函数可以有默认值 function demo( a = 10,b ){} 2.函数可以使用解构 function demo( { a = 0,b = 0 } = {} ){ } 3.函数 ...
- 一步步yum安装LNMP,脱坑笔记!!!
更改国内yum源: 1.备份yum源文件,位置在/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/ ...
- pandas处理json脱坑(二)--jsonError: Expecting ',' delimiter: line 1 column 2674
Expecting ',' delimiter: line 1 column 2674 json_dict = json.loads(row[json_columns].replace("' ...
- WebRTC的学习(二)
英文原文的链接地址为:https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Overview WebRTC是由一些关联的API和协议一 ...
- WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建
WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建 四月 4, 2019 作者:李超,音视频技术专家.本文首发于 RTC 开发者社区,欢迎在社区留言与作者交流. htt ...
随机推荐
- New Relic性能监控(一)概览
New Relic性能监控(一)概览 2018-04-12 琅琊书生 本系列文章基于公司使用New Relic的经验,鉴于国内较少有这方面的文章,因此把我工作中了解到的知识分享给大家,希望可以给需要的 ...
- ACM2014-04训练计划
这是我写的第一篇博文,先简单说说今天的状态吧,毕竟我的第一篇博文是今天诞生的.这学期开学以来各种乱忙,开学初准备高数竞赛决赛,而后有一段时间疯狂学习英语,一直到前几天国创项目中的任务,准备数模竞赛,上 ...
- WebApi系列~基于RESTful标准的Web Api 转载 https://www.cnblogs.com/lori/p/3555737.html
微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码 ...
- 不同vlan之间相互通信
不同VLAN之间相互通信的两种方式 (单臂路由.三层交换) 试验目的: 1.通过单臂路由实现不同VLAN之间的通信 2.通过三层交换路由功能实现不同VLAN之间的通信 网络拓扑图: 1.单臂路由实 ...
- Bootstrap 学习笔记10 弹出框和警告框插件
隐藏还有2个: 警告框:
- Feedforward and BackPropagation Algorithm
在下图所示的Neural Network中,我们将拥有三个节点的layer1及layer4分别称为输入和输出层,而中间的两层layer2,layer3称为隐藏层(hidden layer).输入数据X ...
- EasyUI的datagrid有值但是显示不出来
$("#goodsList").datagrid({ url: "../Ajax/GoodsAjax.ashx", queryParams: { cmd ...
- JSP基础--九大内置对象
JSP九大内置对象 Object findAttribute(String name):依次在page.request.session.application范围查找名称为name的数据,如果找到就停 ...
- Vue3.0响应式实现
基于Proxy // 弱引用映射表 es6 防止对象不能被回收 let toProxy = new WeakMap(); // 原对象: 代理过得对象 let toRaw = new WeakMap( ...
- 浏览器调起摄像头(jquery+layui)
/* 实例化camvas配置参数 config = { video:{width:Number(scale*4),height:Number(scale*3)},//视频比例4:3 canvasId: ...