{"id":839,"date":"2022-10-08T11:28:29","date_gmt":"2022-10-08T03:28:29","guid":{"rendered":"https:\/\/www.fanyamin.com\/wordpress\/?p=839"},"modified":"2022-10-10T09:02:49","modified_gmt":"2022-10-10T01:02:49","slug":"webrtc-%e5%a6%82%e4%bd%95%e7%9f%a5%e9%81%93-rtx-stream-%e7%9a%84-ssrc","status":"publish","type":"post","link":"https:\/\/www.fanyamin.com\/wordpress\/?p=839","title":{"rendered":"WebRTC \u5982\u4f55\u77e5\u9053 RTX Stream \u7684 SSRC"},"content":{"rendered":"<h1>Overview<\/h1>\n<p>\u6bcf\u4e2a\u6d41\u90fd\u6709\u4e00\u4e2a\u914d\u7f6e<\/p>\n<pre><code>struct StreamConfig {\n  StreamConfig();\n  StreamConfig(const StreamConfig&amp; other);\n  ~StreamConfig();\n\n  bool operator==(const StreamConfig&amp; other) const;\n  bool operator!=(const StreamConfig&amp; other) const;\n\n  uint32_t local_ssrc = 0;\n  uint32_t remote_ssrc = 0;\n  uint32_t rtx_ssrc = 0;\n  std::string rsid;\n\n  bool remb = false;\n  std::vector&lt;RtpExtension&gt; rtp_extensions;\n\n  RtcpMode rtcp_mode = RtcpMode::kReducedSize;\n\n  struct Codec {\n    Codec(absl::string_view payload_name,\n          int payload_type,\n          int rtx_payload_type);\n\n    bool operator==(const Codec&amp; other) const;\n\n    std::string payload_name;\n    int payload_type;\n    int rtx_payload_type;\n  };\n\n  std::vector&lt;Codec&gt; codecs;\n};<\/code><\/pre>\n<h1>\u65b9\u6cd5\u4e00<\/h1>\n<p>\u901a\u8fc7 SSRC-GROUP<\/p>\n<p>\u53c2\u89c1 <\/p>\n<p><a href=\"https:\/\/source.chromium.org\/chromium\/chromium\/src\/+\/main:third_party\/webrtc\/media\/engine\/webrtc_video_engine.cc;l=281?q=SetSendParameters&amp;ss=chromium%2Fchromium%2Fsrc\">https:\/\/source.chromium.org\/chromium\/chromium\/src\/+\/main:third_party\/webrtc\/media\/engine\/webrtc_video_engine.cc;l=281?q=SetSendParameters&ss=chromium%2Fchromium%2Fsrc<\/a><\/p>\n<pre><code>static bool ValidateStreamParams(const StreamParams&amp; sp) {\n  if (sp.ssrcs.empty()) {\n    RTC_LOG(LS_ERROR) &lt;&lt; &quot;No SSRCs in stream parameters: &quot; &lt;&lt; sp.ToString();\n    return false;\n  }\n\n  std::vector&lt;uint32_t&gt; primary_ssrcs;\n  sp.GetPrimarySsrcs(&amp;primary_ssrcs);\n  std::vector&lt;uint32_t&gt; rtx_ssrcs;\n  sp.GetFidSsrcs(primary_ssrcs, &amp;rtx_ssrcs);\n  for (uint32_t rtx_ssrc : rtx_ssrcs) {\n    bool rtx_ssrc_present = false;\n    for (uint32_t sp_ssrc : sp.ssrcs) {\n      if (sp_ssrc == rtx_ssrc) {\n        rtx_ssrc_present = true;\n        break;\n      }\n    }\n    if (!rtx_ssrc_present) {\n      RTC_LOG(LS_ERROR) &lt;&lt; &quot;RTX SSRC &#039;&quot; &lt;&lt; rtx_ssrc\n                        &lt;&lt; &quot;&#039; missing from StreamParams ssrcs: &quot;\n                        &lt;&lt; sp.ToString();\n      return false;\n    }\n  }\n  if (!rtx_ssrcs.empty() &amp;&amp; primary_ssrcs.size() != rtx_ssrcs.size()) {\n    RTC_LOG(LS_ERROR)\n        &lt;&lt; &quot;RTX SSRCs exist, but don&#039;t cover all SSRCs (unsupported): &quot;\n        &lt;&lt; sp.ToString();\n    return false;\n  }\n\n  return true;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Overview \u6bcf\u4e2a\u6d41\u90fd\u6709\u4e00\u4e2a\u914d\u7f6e struct StreamConfig { StreamConfig(); StreamConfig(const StreamConfig&amp; other); ~StreamConfig(); bool operator==(const StreamConfig&amp; other) const; bool operator!=(const StreamConfig&amp; 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&lt;RtpExtension&gt; 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 [&hellip;] <a class=\"read-more\" href=\"https:\/\/www.fanyamin.com\/wordpress\/?p=839\" title=\"Permanent Link to: WebRTC \u5982\u4f55\u77e5\u9053 RTX Stream \u7684 SSRC\">&rarr;Read&nbsp;more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-839","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/839"}],"collection":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=839"}],"version-history":[{"count":2,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/839\/revisions"}],"predecessor-version":[{"id":841,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/839\/revisions\/841"}],"wp:attachment":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=839"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=839"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=839"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}