参数分析:
network_priority:此编码的相对区分服务代码点优先级,允许在不影响带宽分配的情况下将数据包标记为相对较高或较低。
在webrtc_voice_engine.cc的WebRtcAudioSendStream类中可以观察到
config_.has_dscp = rtp_parameters_.encodings[0].network_priority != webrtc::Priority::kLow;
说明此参数影响到dscp,通过SetRtpSendParameters函数设置dscp优先级,贴出此函数部分源码
switch (parameters.encodings[0].network_priority) { case webrtc::Priority::kVeryLow: new_dscp = rtc::DSCP_CS1; break; case webrtc::Priority::kLow: new_dscp = rtc::DSCP_DEFAULT; break; case webrtc::Priority::kMedium: new_dscp = rtc::DSCP_EF; break; case webrtc::Priority::kHigh: new_dscp = rtc::DSCP_EF; break; } SetPreferredDscp(new_dscp); // 调用UpdateDscp() --> 将首选DSCP设置应用于底层网络接口RTP和RTCP通道。如果禁用了DSCP,则应用默认DSCP值(即DSCP_DEFAULT)
bitrate_priority:此编码的相对比特率优先级。目前,这是通过使用第一个编码参数的值为整个rtp发送方实现的。根据编码参数实现此功能。目前,在VideoBitrateAllocator中,对于每个同播层的比特率分布有逻辑。必须对其进行更新以合并相对比特率优先级。
个人理解为: Priority network_priority的4个等级对应double bitrate_priority的4个数值
enum class Priority { kVeryLow, // --> bitrate_priority = 0.5 kLow, // --> bitrate_priority = 1.0 kMedium, // --> bitrate_priority = 2.0 kHigh, // --> bitrate_priority = 4.0 };
调试:
WebRtcAudioSendStream对象的创建在WebRtcVoiceMediaChannel::AddSendStream函数中,为了调试方便,直接在此函数下调用WebRtcVoiceMediaChannel::SetRtpSendParameters
在函数尾部添加 webrtc::RtpParameters test_parameters = send_streams_[ssrc]->rtp_parameters(); //获取已初始化的参数 test_parameters.encodings[0].network_priority = webrtc::Priority::kHigh; test_parameters.encodings[0].bitrate_priority = 4.0; WebRtcVoiceMediaChannel::SetRtpSendParameters(ssrc, test_parameters); //修改RtpSend参数 send_streams_[ssrc]->SetRtpParameters(test_parameters);
直接强制修改enable_dscp_为true使得SetPreferredDscp(new_dscp)能够生效
MediaChannel::MediaChannel(const MediaConfig& config) : enable_dscp_(true) {} //: enable_dscp_(config.enable_dscp) {}
抓包验证:
音频的RTP包,dscp优先级为EF,视频的RTP包,dscp优先级仍为默认的CS0