写这篇文章的初衷,是因为这段时间面试,不少面试官一开头就直接问:webrtc是干嘛的?然后就是稀稀拉拉的问一堆问题,相关性都不太大。自己回答也就东一块 西一块,缺乏对webrtc完整的理解。刚好自己趁这个时间整理下,也算个总结
webrtc是什么概念呢?我认为就一句话:标准化了rtc的通信流程和协议。自从2017年webrtc提交1.0版后,从2018年开始特别是去年,它本身一句成为实时通信的标准。我画了一张图,从上到下描述了webrtc本身的通信流程
大部分人面对webrtc时,会一下扎入到音视频模块,特别是采集 音频处理,其实这些只是webrtc里的一部分,我认为都不是最重要的一部分,webrtc的意义,就在于图示描述的标准化通信流程以及相关协议。下面我具体描述
1)媒体协商
媒体协商的作用是在两端协商媒体的类型,webrtc有以下特点
1)采用SDP格式,offer/anwser的应答格式
一个sdp的标准格式如下
v=0
//sdp版本号,一直为0,rfc4566规定
o=- 7017624586836067756 2 IN IP4 127.0.0.1
// o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
//username如何没有使用-代替,7017624586836067756是整个会话的编号,2代表会话版本,如果在会话
//过程中有改变编码之类的操作,重新生成sdp时,sess-id不变,sess-version加1
s=-
//会话名,没有的话使用-代替
t=0 0
//两个值分别是会话的起始时间和结束时间,这里都是0代表没有限制
a=group:BUNDLE audio video data
//需要共用一个传输通道传输的媒体,如果没有这一行,音视频,数据就会分别单独用一个udp端口来发送
a=msid-semantic: WMS h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
//WMS是WebRTC Media Stream简称,这一行定义了本客户端支持同时传输多个流,一个流可以包括多个track,
//一般定义了这个,后面a=ssrc这一行就会有msid,mslabel等属性
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//m=audio说明本会话包含音频,9代表音频使用端口9来传输,但是在webrtc中一现在一般不使用,如果设置为0,代表不
//传输音频,UDP/TLS/RTP/SAVPF是表示用户来传输音频支持的协议,udp,tls,rtp代表使用udp来传输rtp包,并使用tls加密
//SAVPF代表使用srtcp的反馈机制来控制通信过程,后台111 103 104 9 0 8 106 105 13 126表示本会话音频支持的编码,后台几行会有详细补充说明
c=IN IP4 0.0