WebRTC 如何知道 RTX Stream 的 SSRC
Table of Contents
Overview
每个流都有一个配置
struct StreamConfig {
StreamConfig();
StreamConfig(const StreamConfig& other);
~StreamConfig();
bool operator==(const StreamConfig& other) const;
bool operator!=(const StreamConfig& other) const;
uint32_t local_ssrc = 0;
uint32_t remote_ssrc = 0;
uint32_t rtx_ssrc = 0;
std::string rsid;
bool remb = false;
std::vector<RtpExtension> rtp_extensions;
RtcpMode rtcp_mode = RtcpMode::kReducedSize;
struct Codec {
Codec(absl::string_view payload_name,
int payload_type,
int rtx_payload_type);
bool operator==(const Codec& other) const;
std::string payload_name;
int payload_type;
int rtx_payload_type;
};
std::vector<Codec> codecs;
};
方法一
通过 SSRC-GROUP
参见
static bool ValidateStreamParams(const StreamParams& sp) {
if (sp.ssrcs.empty()) {
RTC_LOG(LS_ERROR) << "No SSRCs in stream parameters: " << sp.ToString();
return false;
}
std::vector<uint32_t> primary_ssrcs;
sp.GetPrimarySsrcs(&primary_ssrcs);
std::vector<uint32_t> rtx_ssrcs;
sp.GetFidSsrcs(primary_ssrcs, &rtx_ssrcs);
for (uint32_t rtx_ssrc : rtx_ssrcs) {
bool rtx_ssrc_present = false;
for (uint32_t sp_ssrc : sp.ssrcs) {
if (sp_ssrc == rtx_ssrc) {
rtx_ssrc_present = true;
break;
}
}
if (!rtx_ssrc_present) {
RTC_LOG(LS_ERROR) << "RTX SSRC '" << rtx_ssrc
<< "' missing from StreamParams ssrcs: "
<< sp.ToString();
return false;
}
}
if (!rtx_ssrcs.empty() && primary_ssrcs.size() != rtx_ssrcs.size()) {
RTC_LOG(LS_ERROR)
<< "RTX SSRCs exist, but don't cover all SSRCs (unsupported): "
<< sp.ToString();
return false;
}
return true;
}
Comments |0|
Category: Uncategorized