001 WebRTC
Posted SilentLittleCat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了001 WebRTC相关的知识,希望对你有一定的参考价值。
WebRTC
- Web Real-Time Communication
- 可实时分发音视频给其他用户
- 可用于构建实时广告、多玩家游戏、直播、网络学习应用
- 可以容易地和其他浏览器用户建立点对点连接(peer-to-peer connections)
基本方案
Media capture
- 获取用户设备的摄像头和麦克风
- 检测设备是否可用、获取用户权限、访问设备、管理流媒体
Encoding and Decoding Audio and Video
- 将视频帧(Video frames)和音频波形(Audio waves)分割成小的数据块(chunk),压缩后进行传输,这被称为编码解码(codec)
- 常见的编码方式H.264, iSAC, Opus and VP8
Transportation Layer
- 传输编码压缩后的数据块 - 数据包(packet)
- 管理packet发送的顺序、处理包丢失的情况
- 与其他用户建立连接
Session Management
- 建立、管理、组织连接(connection),这通常被称为信号传递(signaling)
浏览器兼容
并不是所有浏览器都支持所有特性,可通过http://caniuse.com/#feat=rtcpeerconnection查询
架构
- API for web developers
- web开发者可以使用的API
- RTCPeerConnection, RTCDataChannel, and MediaStream
- API for browser makers
- 浏览器厂商使用的API
- Overridable by browser makers
- 浏览器厂商可以检测和修改(hook)的API
从用户-服务器角度看WebRTC API
WebRTC API
RTCPeerConnection
功能
- 建立一个点对点连接,在各个阶段触发事件,可对事件进行监听和处理
- 在多个用户(peers)之间传输媒体流
onicecandidate
: 收到ICE候选者(candidates)后向其他连接点(peer
)发送onaddstream
: 从远程接收到流后对流进行显示message
- 如果
message
包含RTCSessionDescription
,需要通过setRemoteDescription()
添加到RTCPeerConnection
- 如果
message
包含RTCIceCandidate
,需要通过addIceCandidate()
添加到RTCPeerConnection
- 如果
- 使用
getUserMedia()
获取本地设备流媒体,使用addStream()
添加到RTCPeerConnection
- 开启提供回应协商进程(
offer/answer negotiation process
),这是调用者(caller
)和被调用者(callee
)唯一不同的地方- 调用者(
caller
)- 使用
createOffer()
注册回调函数处理RTCSessionDescription
- 使用
setLocalDescription()
将RTCSessionDescription
添加到RTCPeerConnection
- 最后使用信道服务器将
RTCSessionDescription
发送给其他点
- 使用
- 被调用者(
callee
)- 收到调用者的
offer
以后初始化 - 类似调用者,但使用
createAnswer()
- 收到调用者的
- 调用者(
属性
RTCPeerConnection.iceConnectionState (read only)
RTCPeerConnection.iceGatheringState (read only)
RTCPeerConnection.localDescription (read only)
RTCPeerConnection.peerIdentity (read only)
RTCPeerConnection.remoteDescription (read only)
RTCPeerConnection.signalingState (read only)
示例
// config: an array of URL objects containing information about STUN and TURN servers, used during the finding of the ICE candidates
// public STUN servers: code.google.com
var conn = new RTCPeerConnection(conf);
conn.onaddstream = function(stream)
// use stream here
;
MediaStream
功能
- 提供开发者获取视频/音频流的能力
- 可管理选择多个用户输入设备
- 获取设备时对用户进行询问
- 使用
getUserMedia()
获取本地输入设备 - 使用`stream``代表实时视频流或音频流
- 每个
MediaStream
包含多个MediaStreamTrack
,他们代表从本地设备获取的流 - 每个
MediaStreamTrack
包含多个通道(channels
),如音频流中的左右通道,他们是个MediaStream
的最小部分 - 输出
stream
的两种方式- 渲染到
video
和audio
标签中 - 通过
RTCPeerConnection
发送给其他连接点(peer
)
- 渲染到
属性
MediaStream.active(read only)
: 判断MediaStream
是否有效MediaStream.id
MediaStream.label
事件
MediaStream.onactive
MediaStream.onaddtrack
MediaStream.oninactive
MediaStream.onremovetrack
方法
MediaStream.addTrack()
MediaStream.clone()
MediaStream.getAudioTracks()
MediaStream.getTrackById()
MediaStream.getTracks()
MediaStream.getVideoTracks()
MediaStream.removeTrack()
示例
function hasUserMedia()
//check if the browser supports the WebRTC
return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia);
if (hasUserMedia())
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia;
//enabling video and audio channels
navigator.getUserMedia( video: true, audio: true , function (stream)
var video = document.querySelector('video');
//inserting our stream to the video tag
video.src = window.URL.createObjectURL(stream);
, function (err) );
else
alert("WebRTC is not supported");
RTCDataChannel
- 在多个用户(peers)之间传输其他数据,如文字、图片、文件
通信
以上是关于001 WebRTC的主要内容,如果未能解决你的问题,请参考以下文章
Chrome WebRTC DataChannels:即使使用 STUN,ICE-TCP 服务器反身候选者也会丢失
WebRTC STUN 服务器如何反馈 SDP 和 ICE 候选人?