## WebRTC
WebRTC(Web Real-Time Communication,网页实时通信),是一个支持网页浏览器进行实时语音对话或视频对话的API。
**1、getUserMedia**
要播放摄像头的影像,首先需要一个video标签:
```
<video id="video"></video>
```
获取摄像头影像主要是通过`navigator.getUserMedia`这个接口,这个接口的支持情况已经逐渐变好了([点击这里](http://caniuse.com/#search=getUserMedia)),不过,使用的时候还是要加上前缀的。
兼容代码:
```
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
```
语法:
```
navigator.getUserMedia(constraints, successCallback, errorCallback);
```
参数说明:
- constraints:Object类型,指定了请求使用媒体的类型
- succeCallback:启用成功时的函数,它传入一个参数,为视频流对象,可以进一步通过`window.URL.createObjectURL()`接口把视频流转换为对象URL。
- errorCallback:启动失败时的函数。它传入一个参数,为错误对象(chrome)或错误信息字符串(Firefox),可能值:
```
PERMISSION_DENIED:用户拒绝提供信息。
NOT_SUPPORTED_ERROR:浏览器不支持硬件设备。
MANDATORY_UNSATISFIED_ERROR:无法发现指定的硬件设备。
```
例如要启用视频设备(摄像头),可这样:
```
navigator.getUserMedia({
video: true
});
```
如果要同时启用视频设备和音频设备,可这样:
```
navigator.getUserMedia({
video: true,
audio: true
});
```
**1.1 获取摄像头完整实例**
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<video id="video" width="400" height="300"></video>
<button id="live">直播</button>
<script>
var video = document.getElementById('video');
function liveVideo(){
// 获取到window.URL对象
var URL = window.URL || window.webkitURL;
navigator.getUserMedia({
video: true
}, function(stream){
video.src = URL.createObjectURL(stream);
video.play();
}, function(error){
console.log(error.name || error);
});
}
document.getElementById("live").addEventListener('click',function(){
liveVideo();
})
</script>
</body>
</html>
```
当点击直播按钮时,电脑会提升用户是否允许使用摄像头,允许之后,网页上就可以实时显示摄像头影像了。如果不允许,就会触发错误事件。
**1.1.1 截图**
除了实时直播外,我们还可以做实时截图效果,这时我们需要利用`<canvas>`元素来画图,代码如下:
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
#canvas,#video{
float:left;
margin-right:10px;
background:#fff;
}
.box{
overflow:hidden;
margin-bottom:10px;
}
</style>
</head>
<body>
<div class="box">
<video id="video" width="400" height="300"></video>
<canvas id="canvas"></canvas>
</div>
<button id="live">直播</button>
<button id="snap">截图</button>
<script>
var video = document.getElementById('video');
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var width = video.width;
var height = video.height;
canvas.width = width;
canvas.height = height;
function liveVideo(){
// 获取到window.URL对象
var URL = window.URL || window.webkitURL;
navigator.getUserMedia({
video: true
}, function(stream){
video.src = URL.createObjectURL(stream);
video.play();
//点击截图
document.getElementById("snap").addEventListener('click',function(){
ctx.drawImage(video, 0, 0, width, height);
});
}, function(error){
console.log(error.name || error);
});
}
//开始直播
document.getElementById("live").addEventListener('click',function(){
liveVideo();
})
</script>
</body>
</html>
```
**1.1.2 保存图片**
当然,截图后,你也可以保存下来:
```
<a download='snap.png' id="download">下载图片</a>
var url = canvas.toDataURL('image/png');
document.getElementById('download').src = url;
```
**1.2 捕获麦克风声音**
要通过浏览器捕获声音,需要借助Web Audio API。
```
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
function onSuccess(stream){
var audioInput = context.createMediaStreamSource(stream);
audioInput.connect(context.destination);
}
navigator.getUserMedia({audio: true} ,onSuccess);
```
- 前言
- JavaScript简介
- 基本概念
- 语法
- 数据类型
- 运算符
- 表达式
- 语句
- 对象
- 数组
- 函数
- 引用类型(对象)
- Object对象
- Array对象
- Date对象
- RegExp对象
- 基本包装类型(Boolean、Number、String)
- 单体内置对象(Global、Math)
- console对象
- DOM
- DOM-属性和CSS
- BOM
- Event 事件
- 正则表达式
- JSON
- AJAX
- 表单和富文本编辑器
- 表单
- 富文本编辑器
- canvas
- 离线应用
- 客户端存储(Cookie、Storage、IndexedDB)
- HTML5 API
- Video/Audio
- Geolocation API
- requestAnimationFrame
- File API
- FullScreen API
- IndexedDB
- 检测设备方向
- Blob
- vibrate
- Luminosity API
- WebRTC
- Page Visibility API
- Performance API
- Web Speech
- Notification
- 面向对象的程序设计
- 概述
- this关键字
- 原型链
- 作用域
- 常用API合集
- SVG
- 错误处理机制
- JavaScript开发技巧合集
- 编程风格
- 垃圾回收机制