简介
是什么?
- 音视频处理+即使通讯的开源库
- 2010年Google将其开源
- 多媒体,跨平台
能做什么?
- 音视频事实互动
- 游戏、即时通讯、文件传输等
- 音视频处理(回声消除,降噪)
主要内容
- 音视频设备访问与管理
- 音视频数据的采集
- 数据的传输与实时互动
- WebRTC的工作机制
WebRTC原理与架构
架构
整体架构
源码目录
运行机制
主要概念
- Track
- MediaStream
- RTCPeerConnection
- RTCDataChannel
调用过程
设备管理
API
enumerateDevices
-
基本格式
var devices=navigator.mediaDevices.enumerateDevices();
-
MedidaDevicesInfo
属性 | 说明 |
---|---|
deviceID | 设备ID |
label | 设备的名字 |
kind | 设备的种类 |
groupID | 两个设备groupID相同,说明是一个物理设备 |
- promise(另外)
- 注
在http中label是不显示的,只有在https中才显示,因为浏览器的安全策略。
音视频数据采集
API
getUserMedia
-
基本格式
var promise=navigator.mediaDevices.getUserMedia(constraints)
-
MediaStreamConstraints
video
属性 | |
---|---|
height | 高 |
width | 长 |
aspectRatio | 屏幕宽高比 |
frameRate | 帧率 |
facingMode | user,environment,left,right |
resizeMode | 裁剪画面 |
audio
属性 | 涵义 |
---|---|
volume | 音量大小 |
sampleRate | 采样率 |
sampleSize | 采样大小 |
echoCancellation | 回声消除 |
autoFainControl | 自动增益 |
noiseSuppression | 降噪 |
latency | 延迟 |
channelCount | 声道 |
deviceID | 设备编号 |
groupID | 是否一个设备 |
-
适配
使用adapter.js
视频特效
核心
操作css
- CSS filter,-webkit-filter/filter
- video与filter关联
- OpenGL/Metal/...
支持的特效种类
css中去操作
特效 | 说明 |
---|---|
grayscale | 灰度 |
sepia | 褐色 |
saturate | 饱和度 |
hue-retate | 色相旋转 |
invert | 透明度 |
opacity | 清晰度 |
brightness | 亮度 |
contrast | 对比度 |
blur | 模糊 |
drop-shadow | 阴影 |
从视频中获取图片
使用canvas 获取
拿到流后
canvas.getContext('2d').drawImage(video,0,0,canvas.width,canvas.height)
MediaStream API
MediaStream function
- MediaStream.addTrack()
- MediaStream.removeTrack()
- MediaStream.getVideoTracks()
- MediaStream.getAudioTracks()
MediaStream event
- MediaStream.onaddtrack
- MediaStream.onremovetrack
- MediaStream.onended
音视频录制媒体流
重要概念
MediaRecoder
-
基本格式
var meidaRecoder=new MediaRecoder(stream[options])
-
参数说明
参数 | 说明 |
---|---|
stream | 媒体流可从getUserMedia,,,等获取 |
options | 限制项目 |
详见
options | 说明 |
---|---|
mimeType | video/webm,audio/webm,video/webm(codecs=vp8/h264),audio/webm(codecs=opus) |
audioBitsPerSecond | 音频码率 |
videdoBitsPerSecond | 视频码率 |
bitsPerSecond | 整体码率 |
-
API
1.start(timeslice) //timeslice为可选项,如果设置了会按时间切片存储数据 2.stop() //停止时,触发Blob数据的dataavailable事件 3.pause 4.resume 5.isTypeSupported
-
事件
1.ondataavaiable 2.error
JavaScript存储数据的方式
- 字符串
- Blob
- ArrayBuffer
- ArrayBufferView
录制视频
- 主要使用bufer存储数据
- 使用createObjectURL来做url便于下载和播放
采集桌面数据
getDisplayMedia
-
基本格式
var promise=navigator.mediaDevices.getDisplayMedia(constraints)
-
constraints