简要
webrtc中采用sdp协议进行会话协商,sdp协商是通信数据的开始,理解sdp协议及webrtc对sdp的处理非常重要,本文简单剖析了webrtc源码对于p2p双方编解码器不同时如何进行协商的过程,sdp协议是offer/answer模型,展示如下图。sdp协议对应的API:CreateOffer、CreateAnswer、SetLocalDescription、SetRemoteDescription。
一、 API
CreateOffer
CreateOffer主要完成两件事:创建证书,将本地编解码器信息等设置到sdp结构中。
获取本地编码器:GetSupportedFormats(),对于是否支持vp9和h264,在编译时可以添加参数:rtc_libvpx_build_vp9=true/false rtc_use_h264=true/false 进行设置,webrtc默认支持vp8编解码器。GetSupportedFormats 代码段如下:
std::vector<SdpVideoFormat> InternalEncoderFactory::GetSupportedFormats() const {
std::vector<SdpVideoFormat> supported_codecs;
supported_codecs.push_back(SdpVideoFormat(cricket::kVp8CodecName));
for (const webrtc::SdpVideoFormat& format : webrtc::SupportedVP9Codecs())
supported_codecs.push_back(format);
for (const webrtc::SdpVideoFormat& format : webrtc::SupportedH264Codecs())
supported_codecs.push_back(format);
return supported_codecs;
}
CreateOffer设置编码器信息代码段如下:
std::unique_ptr<SessionDescription> MediaSessionDescriptionFactory::CreateOffer(
const MediaSessionOptions& session_options,
const SessionDescription* current_description) const {
... 获取本地支持的编解码器....
AudioCodecs offer_audio_codecs;
VideoCodecs offer_video_codecs;
RtpDataCodecs offer_rtp_data_codecs;
GetCodecsForOffer(current_active_contents, &offer_audio_codecs,
&offer_video_codecs, &offer_rtp_data_codecs);
...填充sdp audio/video content....
for (const MediaDescriptionOpti