webRTC技术篇

webRTC运行机制

轨和流
  • Track
  • MediaStream
重要的类
  • MediaStream
  • RTCPeerConnection(媒体流传输)
  • RTCDataChannel(文本,文件等非视频文件流传输,通过 RTCPeerConnection 获取)

PeerConnection调用过程

调用时序图

WebRTC源码目录结构(一)

WebRTC源码目录结构(二)

WebRTC Modules 目录(一)

WebRTC Modules 目录(二)

webRTC使用

获取设备

WebRTC 获取设备方法

MediaStream类的方法

音视频采集Api

navigator.mediaDevices.getUserMedia

音视频采集API

getUserMedia适配

适配不同浏览器的方法

桌面数据采集

navigator.mediaDevices.getDisplayMedia(constraints)

WebRTC 桌面数据采集

约束

视频约束
  • width 宽
  • height 高
  • aspectRatio 宽高比例
  • frameRate 帧率
  • facingMode
    • user : 前置摄像头
    • environment : 后置摄像头
    • left : 前置左摄像头
    • right : 前置右摄像头
  • resizeMode 裁剪
音频约束
  • volume 音量
  • sampleRate 采集率(16000, 8000)
  • sampleSize 采集大小 (每个采集率右多大表示 16位 8位)
  • echoCancellation 是否消除回音
  • autoGainControl 是否增加基础音量
  • noiseSuppression 是否降噪
  • latency 延迟大小(控制在500ms之内)
  • channelCount 单双通道
  • deviceID 可以切换设备
  • groupID 物理设备

特效

对采集的音视频数据进行特效处理

MediaStream

  • MediaStream.addTrack() 添加媒体轨
  • MediaStream.removeTrack() 移除媒体轨
  • MediaStream.getVideoTracks() 拿到视频媒体轨
  • MediaStream.getAudioTracks() 拿到音频媒体轨
  • MediaStream.stop() 结束媒体流
事件
  • MediaStream.onaddtrack 添加轨 触发的事件
  • MediaStream.onremovetrack 移除轨 出发的事件
  • MediaStream.onended 结束 触发的事件

MediaRecoder

基本格式

var mideaRecorder = new MediaReacoder(stream [, option]);

参数说明
  • stream 媒体流, 可以从 getUserMedia、 <video>、 <audio> 、 <canvas> 获取
  • options 限制选项
    • mediatype 媒体流格式
      • video/webm
      • audio/webm
      • video/webm;codecs=vp8
      • video/webm;codecs=h264
      • audio/webm;codecs=opus
    • audioBitsPerSecond 音频码率
    • videoBitsPerSecond 视频码率
    • bitsPerSecond 整体码率
API
  • MediaRecorder.start(timeslice) 开始录制媒体, timeslice可选, 如果设置了会按照时间切片存储数据, 否则存储在一个buffer里
  • MediaRecorder.stop() 停止录制,会触发最终 Blob 数据的 dataavailable 事件
  • MediaRecorder.pause() 暂停录制
  • MediaRecorder.resume() 恢复录制
  • MediaRecorder.isTypeSupported( arg ) 是否支持参数里的格式
事件
  • MediaRecorder.ondataavailable 每次记录一定时间(与时间切片有关)的数据
  • MediaRecorder.onerror 当发生错误时,录制会停止

信令服务器

信令服务器的作用

信令服务器的作用

WebRTC传输基本知识

  • NAT (Network Address Translator) 各个设备组成的net
  • STUN (Simple Traversal of UDP Through NAT) 给要P2P连接的设备介绍的服务
  • TURN (Traversal Using Relays around NAT) 两台设备不能P2P连接,就是用服务器连接
  • ICE (Interactive Connectivity Establishment) 找到两台设备传输流的最佳连接

STUN

RFC STUN 规范
  • RFC3489/STUN Simple Traversal of UDP Through NAT
  • RFC5389/STUN Session Traversal Utilities for NAT (包含3489规范)
STUN 协议
  • 包括 20 字节的STUN header(下面时 3489 规范的组成)

    • 其中 2 个字节 (16 bit)类型

    • 2 个字节 (16 bit)消息长度, 不包括消息头

    • 16 个字节 (128bit) 事务ID, 请求与响应事务ID相同

    • 5389 规范 协议头组成

      • Magic Cookie 4 字节, 32 位, 固定值 0x2112A442

      STUN header 格式

  • Body 中可以有 0 个或者多个 Attribute

    • 每个属性进行 TLV 编码: Type,Length, Value

      TLV 格式

    • RFC3489 定义的属性

      RFC3489 属性

TURN

  • 目的是解决对称 NAT 无法穿越的问题
  • 建立在 STUN 之上, 消息格式使用 STUN 格式消息
  • TURN Client 要求服务器端分配一个公共的 IP 和 Port 用于接受数据
  • TURN 使用的传输协议
    • TURN Client to TURN server (UDP、 TCP、 TLS over TCP)
    • TURN server to peer (UDP)

TURN 实例

webRTC端对端实现互动

Peer 2 Peer 基本流程

RTCReerConnection类

格式

pc = new RTCPeerConnection([configuration]);

configuration 参数
  • iceServers stun/turn 服务(可多个)
    • credential: 凭证, 只有 TURN 服务使用
    • credentialType: 凭证类型可以 password 或 oauth
    • urls: 用于连接服务中的 url 数组
    • username: 用户名, 只有 TURN 服务使用
  • iceTransportPolicy 指定 ICE 传输策略
    • relay: 只使用中继候选者
    • all: 可以使用任何类型的候选者
  • bundlePolicy
    • Balanced: 音频与视频轨使用各自的传输通道
    • max-compat: 每个轨使用自己的传输通道
    • max-bundle: 都绑定到一个传输通道
  • rtcpMuxPolicy 在收集 ICE 候选者时使用
    • negotiate: 收集 RTCP 与 RTP 复用的 ICE 候选者, 如果 RTCP 能复用就与 RTP 复用, 如果不能复用,就讲它们音独使用
    • require: 只收集 RTCP 与 RTP 复用的 ICE 候选者, 如果 RTCP 不能复用, 则失败
  • peerIdentity 表示字符串
  • certificates 授权可以使用连接的一组证书
  • iceCandidatePoolSize 16 位的整数值, 用于指定预取的 ICE 候选者的个数。如果该值发生变化,它会触发重新收集候选者
方法分类
  • 媒体协商
    • createOffer
      • 基本格式: aPeomise = myPeerCOnnection.createOffer([options]);
      • Options 参数
        • iceRestart: 该选项会重启ICE, 重新进行 Candidate 收集
        • voiceActivityDetection: 是否开启静音检测, 默认开启
    • createAnswer
      • 基本格式: aPeomise = myPeerCOnnection.createAnswer([options]);
    • setLocalDescription
      • 基本格式: aPeomise = myPeerCOnnection.setLocalDescription(sessionDesscription);
    • setRemoteDescription
      • 基本格式: aPeomise = myPeerCOnnection.setRemoteDescription(sessionDesscription);

媒体协商过程

  • Stream/Track
    • addTrack
      • 基本格式: rtpSender = myPeerCOnnection.addTrack(track, stream…);
      • 参数:
        • track 添加到 RTCPeerConnection 中的媒体轨
        • stream 指定 track 所在的 stream
    • removeTrack
      • 基本格式: rtpSender = myPeerCOnnection.removeTrack(rtpSender);
  • 重要事件
    • onnegotiationneeded 协商事件 (需要协商时触发的事件)
    • onicecandidate 收到候选者事件
  • 传输相关方法
  • 统计相关方法

SDP

定义

SDP (Session Description Protocol) 它只是一种信息格式的描述标准,本身不属于传输协议,但是可以被其他传输协议用来交换必要的信息

规范
  • 会话层(全局)
    • 会话的名称与目的
    • 会话的存活时间
    • 会话中包括多个媒体层
  • 媒体层(局部)
    • 媒体格式
    • 传输协议
    • 传输IP和端口
    • 媒体负载类型

WebRTC 中的 SDP 组成

coTurn服务器配置

  • listening-port=3478 # 指定侦听端口
  • external-ip = xx.xx.xx.xx # 指定云主机的公网 IP 地址
  • user=aaaaa:bbbbb # 访问 stun/turn 服务器的用户名密码
  • realm = stun.xxx.cn # 域名

RTP Media

Receiver
  • getReceivers 获得一组 RTCRtpReceiver 对象, 用于接收数据
Sender
  • getSenders 获得一组RTCRtpSender 对象, 用于发送数据, 每个对下个对应一个媒体轨
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值