端对端1V1传输基本流程
媒体能力协商过程
WebRTC 端对端连接:
RTCPeerConnection:
基本格式
1
pc = new RTCPeerConnection([configuration]);
RTCPeerConnection 方法分类:
- 媒体协商
- Stream/Track
- 传输相关方法
- 统计相关方法
媒体协商方法:
- createOffer
- createAnswer
- setLocakDescription
- setRemoteDescription
createOffer:
基本格式
1
aPromise = myPeerConnection.createOffer([options]);
createAnswer:
基本格式
1
aPromise = myPeerConnection.createAnswer([options]);
setLocakDescription:
基本格式
1
aPromise = myPc.setLocalDescription(sessionDescription);
setRemoteDescription:
基本格式
1
aPromise = myPc.setRemoteDescription(sessionDescription);
Track 方法:
- addTrack
- removeTrack
addTrack:
基本格式
1
rtpSender = myPc.addTrack(track, stream...);
Parameters
removeTrack:
基本格式
1
myPc.remoteTrack(rtpSender);
重要事件:
- onnegotiationneeded - 协商的时候触发这个事件
- onicecandidate - 当收到 ICE 候选者的时候触发这个事件
1:1 连接的基本流程
A 与 B 通信,大的方向分为三部分:
- 媒体协商部分
- ICE 候选者的交换、连接、检测部分
- 媒体数据流的通信部分
【实战】WebRTC 视频传输
TODO
【实战】显示通讯双方的 SDP 内容
TODO
WebRTC核心之SDP详解
【协议规范】SDP 规范
SDP 规范:
- 会话层
- 媒体层
可以把会话层看做树根,媒体层看成树干。
会话层:
- 会话的名称与目的
- 会话的存活时间
- 会话中包含多个媒体信息
SDP 媒体信息:
- 媒体格式
- 传输协议
- 传输 IP 和 端口
- 媒体负载类型
SDP 格式:
- 由多个
<type>=<value>
组成 - 一个会话级描述
- 多个媒体级描述
SDP 结构:
- Session Description
- Time Description
- Media Description
【协议规范】WebRTC 中的 SDP
【详解】WebRTC 中 Offer_Answer SDP
SDP报文内容
1 | v=0 |
实现1V1音视频实时互动直播系统
STUN/TURN 服务器搭建
webrtc进阶-信令篇-之三:信令、stun、turn、ice
coTurn Download Address:https://github.com/coturn/coturn
ICE 测试地址:https://webrtc.github.io/samples
coturn 编译安装
1 | git clone https://github.com/coturn/coturn |
安装sqlite
1 | sudo atp-get install sqlite |
生成认证用户
1 | turnadmin -A –u 用户名 -r beijing -p 密码 |
然后生成md5码
1 | turnadmin -k –u 用户名 -r beijing -p 密码 |
生成证书
1 | openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes |
创建配置文件
1 | vi /usr/local/etc/turnserver.conf |
启动 coturn
1 | 启动 turn server |
【参数介绍】再论 RTCPeerConnection
直播系统中的信令及其逻辑关系
【实战】真正的音视频传输
客户端信令消息:
- join 加入房间
- leave 离开房间
- message 端到端消息
端到端信令消息:
- Offer 消息
- Answer 消息
- Candidate 消息
服务端信令消息:
- joined 已加入房间
- otherjoin 其它用户加入房间
- full 房间人数已满
- leaved 已离开房间
- bye 对方离开房间
实现 1:1 音视频实时互动信令服务器
信令服务器改造
TODO
再论CreateOffer
CreateOffer 实战:
- 接收远端音频
- 接收远端视频
- 静音检测
- ICE restart
WebRTC 客户端状态机及处理逻辑
直播客户端的实现:
WebRTC 客户端的实现
共享远程桌面
WebRTC核心之RTP媒体控制与数据统计
RTPPReceiver 发送器
RTP Media 里边两个重要的类:Receiver 和 Sender
Receiver 和 Sender 共有的三个属性
- getParameters - 编解码器相关参数
- getSynchronizationSources - 获取共享源(同步源),每一个媒体流都一个唯一的共享源
- getContributingSources - 贡献来源,最主要用于混音和混频的情况
- getStats - 获取统计信息
- getCapabilities - 获取协商后的媒体能力
RTPSender 发送器
RTCRtpTransceiver 可以同时处理 sender 和 receiver
传输速率的控制
chrome WebRTC 状态查询地址:chrome://webrtc-internals
【实战】WebRTC统计信息
TODO
WebRTC非音视频数据传输
传输非音视频数据基础知识
- ordered - udp包不保证包是有序的(传输非音视频数据的时候包是否是按顺序到达的),webrtc传输音视频的时候使用的是udp,webrtc在upd之上做了一层协议可以保证消息是按顺序到达(底层如果包是乱序的对包进行排序)
- maxPacketLifeTime/maxRetransmits - 包存活时间(包最大的存活时间/最大的传输次数),这两个参数是二选一,不能同时使用
- negotiated - 协商,在创建datachannel的时候可以进行协商
- onmessage - 当对方有数据过来的时候触发
- onopen - 当创建好 datachannel 的时候触发
- SCTP - stream control transport 流控
configurable - 可配置的
Reliability:可靠性
- Delivery:可达性
- Transmission:传输方式
- Flow control:流控
- Congestion control:拥塞控制
端到端文本聊天
TODO
文件实时传输
WebRTC实时数据传输网络协议详解
tcp是流式传输, 这是什么意思?
假设A给B通过TCP发了200字节, 然后又发了300字节, 此时B调用recv(设置预期接受1000个字节), 那么请问B实际接受到多少字节? 根据我们之前讲得tcp粘包特性,可知, B端调用一次recv, 接受到的是500字节。
所谓流式传输, 说白了, 就是管道中的水, 第一次给你发了200斤的水, 第二次给你发了300斤的水, 然后你在对端取的时候, 这200斤和300斤的水, 已经粘在一起了, 无法直接分割, 没有界限了。
udp是数据报传输, 什么意思?
假设A给B通过udp发了200字节, 然后又发了300字节, 此时B调用recvfrom(设置预期接受1000个字节), 那么请问B实际接受到多少字节? 写了个程序测了一下, 发现B调用recvfrom接收到的是200自己, 另外的300字节必须再次调用recvfrom来接收。
所谓的数据报传输, 说白了, 就有消息和消息之间有天然的分割, 对端接收的时候, 不会出现粘包。 发10次, 就需要10次来接收。
【协议规范】RTP-SRTP协议头详解
- DTLS - 证书检测,加密算法协商
- contributing source - 贡献源,CC - 表示贡献者一共有多少个(最多可以表示16个贡献者)
- 最大的 RTP 包包含的字节是1400多字节,压缩后的 H264 帧也能达到 1M 多。一般帧 封包 后的最后一个包 就是 M 位
- timestamp - 同一个帧的所有封包的 timestamp 是相同的,并且 seq number 是连续的。H264 内部有封包的起始位和结束位,根据这些标识就可以将多个封包组成一个完整的帧
- SSRC - SSRC的作用就是贡献者,视频和音频的SSRC是完全不相同的。同一个视频的SSRC有可能发生变化(产生冲突会发生变化,因为SSRC是随机数)
- CSRC - 贡献者
【协议规范】RTCP 中的 SR 与 RR 报文
- SDES - 中最重要的一个字段是 cname
- FR - 请求关键帧
- necho - 发现丢包重传
- NTP - 不同源之间的同步,比如音频和视频之间的同步
- CNAME - 对于webrtc来说这个字段基本上是不用SDES这个消息,因为在SDP中就有CNAME的描述,除非音频源或者视频源发生了中断(or中转)会重新生成SSRC,然后再进行重新绑定
【协议规范】DTSL
wireshark 分析 rtp-rtcp 包
TODO
Android端与浏览器互通
Android 与浏览器互通
WebRTCNative 开发逻辑
实战-权限申请-库的引入与界面
实战-通过 socket.io 实现信令收发
实战-Android 与浏览器互通
创建 PeerConnection:
- 音视频数据采集
- 创建 PeerConnection
媒体能力协商:
- 协商媒体能力
- Candidate 连通
- 视频渲染
iOS端与浏览器互通
IOS权限获取
IOS引入WebRTC库
IOS端SocketIO的使用
IOS界面布局
TODO
IOS本地视频采集与展示
TODO
IOS端RTCPeerConnection
TODO
IOS媒体协商
IOS远端视频渲染
课程总结
即时通信(IM)和实时通信(RTC)的区别
即时通信(IM=Instant messaging)和实时通信(rtc=Real-time communication)都是一套网络通信系统,其本质都是对信息进行转发。其最大的不同点,是对信息传递的时间规定。二者的区别可以从以下几个方面:
场景
即时通信
常见场景包括文字聊天、语音消息发送、文件传输、音视频播放等。通俗的说,就是发短信。
实时通信
场景包括语音、视频电话会议、网络电话等。通俗的说,就是打电话。
要求
即时通讯
主要要求可靠,考核送达率。要是你发一条短信,结果丢了,对方没收到!你再也不相信短信了吧。
实时通信
主要要求低延时和接通率。
- 低延时:你打一通电话,每说一句话,对方得几秒钟才有回应,这电话你也讲不下去了吧。
- 接通率:你打电话,你这边听到接通了,实际上对方的手机毫无反应,这实际上就没接通。
技术环节
即时通信
消息发送和确认,【消息接入端、服务端消息逻辑处理,服务端消息缓存和存储,转发,服务端用户状态管理,心跳机制,消息发送端】、消息接收和确认。
实时通信
技术环节:采集、前处理、编码、【服务端接入、转发、服务端接入】、解码、播放和渲染。
这些技术环节重合的部分是:信息转发。
传输协议
公共互联网上,最常用的通信协议有TCP、UDP。
- TCP:Transmission Control Protocol,传输控制协议是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。有延迟不可控的特点。
- UDP:User Data Protocol,用户数据报协议,是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。 存在丢包、抖动、延迟的特征。
即时通信系统为了保证连接的可靠性,最常用的是TCP协议或者类TCP连接协议。这类协议的特点是追求连接的可靠性,而造成了延迟的不可控性,超过2秒的延迟响应是常态,甚至几十分钟的延迟响应,而电信级的实时通信标准是400ms,而基于互联网的实时通信需要另辟蹊径,开创出新的传输解决方案。发短信,延迟几秒钟送达,对使用者影响不大。
实时通信,一般采用 UDP 作为基础传输协议。在设计低延时的实时通信服务时,UDP 表现要比 TCP 好得多。这是因为实时通信中,低时延比可靠性更重要。打电话,几秒的延迟是不能忍受的。
TCP协议封装了消息的重传机制,在丢包的情况下,采用TCP协议的应用程序几乎无法优化这个重传机制,来达到低时延的效果。特别是在移动互联网络中,超过30%丢包时,TCP 的延时可以到几十分钟, 超过 50%丢包时,甚至很容易断开。 在同样丢包30%的链路上,UDP还可以传输数据,TCP就无法进行实时通信了。
成本
成本涉及到的环节有:服务端接入、存储和转发。
二者成本会产生差异的环节有:
- 从服务端接入方式来看,即时通信采用TCP协议来保证可靠性,可能会建立多个连接,相比无连接的UDP传输方式,这是一种昂贵的传输方式。实时通信可以基于UDP协议,与服务端建立灵活的、快速的接入机制。
- 存储方面,实时通信在服务端是实时转发,不会在服务端存储数据,而即时消息系统一般会将缓存转为存储数据,包括富媒体数据,会占用大量的存储空间,产生更多的存储成本。
- 从成本上来看,传输同样信息量的数据,基于TCP的即时通信方式,更侧重于可靠性,会优先采用多线机房的传输方式,成本比较高;
- 而基于UDP的实时通信方式,会优先选取最优路径进行传输数据,并可以动态调整传输路径,这样能够高效的利用带宽,提高传输效率,降低成本。
可用的解决方案
- 即时通信:XMPP,MQTT
- 实时通信:WebRTC、Tokbox
免费的 im 与 rtc 示例:https://github.com/starrtc/android-demo
Reference
socket.io 原理详解
音视频数据采集与控制
NAT 穿越
ICE 原理
媒体协商过程
网络处理与流程
如何实现并规模高并发
如何更好的利用网络
回音消除与降噪
webrtc–AudioProcessing– 音频降噪的处理过程
PCM音频处理——使用WebRTC音频降噪模块与其他方式的对比
单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)
借助Webrtc音频采集、降噪、回音消除、静音检测、编解码、播放等功能,剥离Webrtc自带的RTP传输协议,使用私有的协议进行传输。从而实现自己的实时语音聊天功能。
OpenCV
TODO
OpenGL视频渲染
TODO
WebRTC的分层协议图:
信令,会话和协议:
问题解决里程
node 启动 server 报错:
1 | events.js:141 |
查询端口是否别占用:
1 | Linux |
补充
turnserver.conf
1 | RFC5766-TURN-SERVER configuration file |