WebRTC SDP反序列化

SDP是webrtc协商使用的文本格式,本质上是一行一行的字符串,通过匹配最强那面的字母确定信息类型。DP主要用来描述:设备支持的媒体能力,包括编解码器等;ICE候选地址 ;流媒体传输协议

SDP协议基于文本,格式非常简单,可扩展性比较强。它由多个行组成,每一行都为键值格式<类型>=<值> (形式如: t=v),<类型>是一个字母,<值>是结构化的文本串,其格式依<类型>而定。下面是一个SDP的样本:

v=0
o=mike 1234567890 1234567890 IN IP4 host.domain.com
s=
c=IN IP4 host.domain.com
t=0 0
m=audio 8860 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 8861 RTP/AVP 31
a=rtpmap:31 H261/90000

其中:
1. v=代表协议版本号
2. o=代表会话发起者,包括username、sessionId等
3. s=代表session名称,为唯一字段
4. c=代表连接信息,包括网络类型、地址类型、地址等
5. t=代表会话时间,包括开始/结束时间,均为0表示持久会话
6. m=代表媒体描述,包括媒体类型、端口、传输协议、媒体格式等
7. a=代表附加属性,此处用于对媒体协议进行扩展

m的格式如下:

m=<media> <port> <proto> <fmt> ...
m=<media> <port>/<number of ports> <proto> <fmt> ...

其中:可以是,”audio”,”video”, “text”, “application” and “message”。是媒体传送的端口号,它依赖于c=和。 可以是,udp,RTP/AVP和RTP/SAVP。

正片开始

客户端将sdp信息通过https将文本信息传输给服务器,服务器接收流程:

图片

处理流程是将收到的字符串进行处理,取出sdp字符串,经过函数调用,尤其是createsessiondescription函数,开始了sdp反序列化的开端。

//可以从这个开始,创建反序列化描述对象jsep_desc
std::unique_ptr<SessionDescriptionInterface> CreateSessionDescription(
    SdpType type,
    const std::string& sdp,
    SdpParseError* error_out) {
  auto jsep_desc = std::make_unique<JsepSessionDescription>(type);
  if (type != SdpType::kRollback) {
  //在此处开始反序列化
    if (!SdpDeserialize(sdp, jsep_desc.get(), error_out)) {
      return nullptr;
    }
  }
  return std::move(jsep_desc);
}

接下来的反序列化SdpDeserialize函数,将主要完成对会话层解析、媒体层解析两个部分。

会话层解析:

ParseSessionDescription:这个函数主要解析会话层描述信息,包括获取version、源信息、session名字、session信息、session的uri、连接信息、session带宽、会话的起始时间和结束时间、秘钥,解析a开头的行信息,包括ice验证、签名等信息。

具体代码请在对应的函数内查看。

媒体层解析:

ParseMediaDescription:这个函数主要解析的是m开头的行信息,根据media_type是视频、音频、媒体数据类型进行操作,重点是媒体数据解析,这里面最重要的是ParseContent解析文本(内部解析过程挺复杂的,还需要再解读一下)

当以上解析完成后,会把candidate信息添加到jsep对象。

作者:粥子的酒 | 来源:公众号——C加加厨房

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论