首先是一个纯Go实现的webrtc api,也就是说脱离浏览器也可以运行, 估计还是没有浏览器那么多优化,不过也算是对webrtc协议的一个Go实现。 毕竟有时候只需要一个Go的实现,而不是整个浏览器。 这也是不通过swig/cgo方式,实现的第一个Go版本的开源库, 她的目标是做成一个社区,而不是为了商业或创建公司来把握pion,真正的开源。
pion/webrtc从2018/05开始创建,虽然年轻,但也发布了几十个release,一切都在变好。
我从2019/02开始入坑Go,5月开始接触pion,初始还分析过前面一段源码, 现在(2019/12)算是以另一种方式重新分析。
- 2018/05,项目创建
- 2018/07,发布v1.0.0,发布说明
- 了解v1.0.0的官方文档
- 了解v1.0.0的pkg/errors
- 了解v1.0.0的ice,与其说是库,还不如说辅助功能
- 了解v1.0.0的rtp,提供了将字节流打包整rtp包的能力
- 了解v1.0.0的rtp/codecs,提供opus/vp8切片和提取包的能力
- 了解v1.0.0的sdp,粗略解析sdp,颗粒度较大
- 了解v1.0.0的util, 纯工具包
- 了解v1.0.0的dtls,c实现的dtls,用Go封装了一下
- 了解v1.0.0的network,udp监听的封装,处理了网络的收发
- 了解v1.0.0的webrtc,对外暴露了RTCPeerConnection
- 了解v1.0.0的demo,因为dtls不是纯Go,就部分细demo了
- 2018/11,发布v1.1.0,发布说明
- 2018/12,发布v1.2.0,发布说明
- 了解v1.2.0的官方文档
- 了解v1.2.0的rtcerr, 封装了webrtc的错误
- 了解v1.2.0的ice,完整的ice连接协商过程,让调用方只关注实际数据的收发即可
- 了解v1.2.0的rtp,提供rtp报文和字节流之间的转换能能力
- 了解v1.2.0的rtp/codecs,opus/vp8没啥变化,新增了h264/g722的切片逻辑
- 了解v1.2.0的null,附加了一个固定的校验零值的方法
- 了解v1.2.0的media/samplebuilder,封装底层的rtp相关操作,对外暴露媒体编码之后的接口
- 了解v1.2.0的media/ivfwriter,写磁盘
- 了解v1.2.0的datachannel,定义两种datachannel支持的数据格式
- 了解v1.2.0的util
- 了解v1.2.0的sdp,重构了sdp的实现,扩展了ice和字符串的转换
- 了解v1.2.0的srtp,对srtp的一个实现,对rtp/rtcp提供了加解密功能
- 了解v1.2.0的sctp,sctp的一个实现,用于datachannel传数据
- 了解v1.2.0的internal/datachannel,暴露DataChannel的接口
- 了解v1.2.0的mux, webrtc协议中接收socket的多路复用
- 了解v1.2.0的rtcp,rtcp多种格式的实现
- 了解v1.2.0的network,对底层网络连接的封装
- 了解v1.2.0的webrtc,配置和连接的构造
- webrtc的4大状态
- 信令状态 RTCSignalingState, 检查jsep状态机
- ice收集状态 RTCIceGatheringState,定义了3种
- p2p连接状态 RTCPeerConnectionState,定义了6种
- ice连接状态,定义了7种
- webrtc sdp 模型
- RTCSessionDescription,封装了sdp类型,用在连接对象中
- webrtc 零碎的知识点
- webrtc 核心业务逻辑
- webrtc的4大状态
- 了解v1.2.0的demo的整个框架
- 2020/02,发布v2.2.0,发布说明
- 1 介绍
- 2 符合标准
- 3 术语
- 4 p2p连接
- 4.1 p2p连接的介绍
- 4.2 配置
- 4.2.7 offer/answer选项
- 4.4 RTCPeerConnection接口
- 4.4.1 操作流程
- 4.4.1.1 RTCPeerConnection构造
- 4.4.1.2 链式异步操作
- 4.4.1.3 p2p连接状态的更新
- 4.4.1.4 ice候选收集状态的更新
- 4.4.1.5 设置sdp
- 4.4.1.6 设置配置
- 4.4.2 接口定义
- 4.4.1 操作流程
- 4.6 sdp模型
- 4.6.1sdp类型 RTCSdpType,对offer/answer做了扩展:临时answer
- 4.6.2RTCSessionDescription
- 4.7 会话协商模型(v1.2.0未实现,暂不分析)
- 4.7.3会话协商模型的更新
- 4.8 ice接口
- 4.9 证书管理
- 5 rtp媒体接口
- 基础知识补充
- 5.1 对RTCPeerConnection接口的扩展
- 5.1.1 处理远端MediaStreamTracks
- 5.2 RTCRtpSender接口
- 5.2.1-5.2.12 RTCRtpSender接口涉及到的数据结构
- 5.3 RTCRtpReceiver接口
- 5.4 RTCRtpTransceiver接口
- 5.4.1 simulcast联播功能
- 5.5 RTCDtlsTransport接口
- 5.5.1 RTCDtlsFingerprint数据结构
- 5.6 RTCIceTransport接口
- 5.6.1-5.6.6 RTCIceTransport接口涉及到的数据结构
- 5.7 RTCTrackEvent接口
- 6 p2p数据接口
- 6.1 对RTCPeerConnection接口的扩展
- 6.1.1 RTCSctpTransport接口
- 6.1.2 RTCSctpTransportState枚举
- 6.2 RTCDataChannel接口
- 6.3 RTCDataChannelEvent接口
- 6.4 gc,垃圾回收
- 6.1 对RTCPeerConnection接口的扩展
- 7 p2p的DTMF(双音多频)
- 8 统计模型
- 8.1 统计模型的介绍
- 8.2 对RTCPeerConnection接口的扩展
- 8.3 RTCStatsReport接口
- 8.4 RTCStats接口
- 8.5 状态收集算法
- 8.6 统计的实现
- 9 网络使用中,媒体流api的扩展
- 10 例子和调用流程
- 10.1 简单p2p例子
- 10.2 自带"热身"的高级p2p例子
- 10.3 联播例子
- 10.4 p2p data例子
- 10.7 完美协商例子
- 11 错误处理
- 11.1 RTCError接口
- 11.2 RTCErrorDetailType枚举
- 11.3 RTCErrorEvent接口
- 12 事件汇总
- 13 隐私和安全选项
- 14 辅助功能
- 第一个发布版本,仅支持以下特征
- 音视频的收发
- srtp库是纯Go
- dtls是基于openssl(cgo方式集成)
- 轻量级ice(要么是公网ip,要么是LAN),后面会继续丰富
- 附带demo,可集成到自己的程序中
- 通过gs(gstreamer)来收发视音频
- 录制vp8视频
- 第二个发布版本,在第一个版本的基础上新增了如下特征
- 全功能ice(v1.0.0的就是个辅助)
- DataChannels支持
- RTCP支持(有了这个,就可以实现sfu)
- 第三个版本,纯Go版本,新增特征如下
- 支持原始rtp流接入(不是解码,重编码,而是rtp协议级直接支持)
- 支持Trickle-ice(任何时候都可以添加ice候选),google/firefox都支持
- 支持rtcp reception,允许应用程序和rtcp包交互和触发
- 传输部分重构
- dtls用Go实现
- srtp改进,并新增tag认证检查
- rtcp的go-fuzz支持,(go-fuzz是一个随机测试)
- 第四个版本,也是改动非常多的一个版本
- ortc支持
- data channel优化
- 日志和ice调试
- 实验性的:quic/wasm支持
- api格式,向spec靠拢
- sctp的可读性提高
- ice常规提名
- 2020.02.17发布
- 目前最近的一个版本
- data channel性能提升
- 为了更好的支持sfu,SettingEngine做了更多的扩展
- turn支持tcp
- 支持pcm
- 轨道的重新协商
- IVFReader解码器,纯go实现
- vp9支持