SDP 解析学习笔记

1,742 阅读20分钟

前言

本来想一行行解析 SDP 信息,并附上自己的理解和实例讲解,最后按章网上的资料过了一遍,最后也不是很懂,只是对 SDP 信息有个大致的了解,只能先输出一个学习笔记,后续先学习其他知识,理解更深刻后再重新整理一篇文章。

虽然没有整理出自己的理解,但是过一遍还是很有收获,最起码再拿到 SDP 信息大致有哪些内容,如何接卸有一个具体的概念。

知乎上的这篇 《WebRTC:会话描述协议SDP》 文章讲解的很好,拯救了我这种需要靠谷歌翻译看 RFC 文档的人,最后还是要看各种 RFC 文档,SDP 扩展的信息太多,分散在不同的 RFC 文档中,有些还是需要去看原文。

前两天写 《RTCPeerConnection 配置详解之 iceTransportPolicy》 这篇文章时正好有实际生成的 SDP 信息,参考 《WebRTC:会话描述协议SDP》RFC2327 进行解析。

下面是 createOffer 返回的完整 SDP 信息

v=0
o=- 5247939015171769789 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1
a=extmap-allow-mixed
a=msid-semantic: WMS mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 35 36 124 119 123 118 114 115 116
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:7+eD
a=ice-pwd:3+VGTgzV7gkUlIdpnWAkWqBo
a=ice-options:trickle
a=fingerprint:sha-256 BA:A3:B8:06:91:1D:69:7A:C9:46:58:B1:A7:A5:E1:C6:F7:16:86:71:71:8F:2C:27:D9:95:89:FA:7A:A7:FA:79
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendonly
a=msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 72421008-3d5b-41ca-b4c8-50a0ed51a76b
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:35 AV1X/90000
a=rtcp-fb:35 goog-remb
a=rtcp-fb:35 transport-cc
a=rtcp-fb:35 ccm fir
a=rtcp-fb:35 nack
a=rtcp-fb:35 nack pli
a=rtpmap:36 rtx/90000
a=fmtp:36 apt=35
a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f
a=rtpmap:118 rtx/90000
a=fmtp:118 apt=123
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000
a=ssrc-group:FID 380787905 4099067239
a=ssrc:380787905 cname:VY2dNUk0w4Gmvv8S
a=ssrc:380787905 msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 72421008-3d5b-41ca-b4c8-50a0ed51a76b
a=ssrc:380787905 mslabel:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU
a=ssrc:380787905 label:72421008-3d5b-41ca-b4c8-50a0ed51a76b
a=ssrc:4099067239 cname:VY2dNUk0w4Gmvv8S
a=ssrc:4099067239 msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 72421008-3d5b-41ca-b4c8-50a0ed51a76b
a=ssrc:4099067239 mslabel:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU
a=ssrc:4099067239 label:72421008-3d5b-41ca-b4c8-50a0ed51a76b
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:7+eD
a=ice-pwd:3+VGTgzV7gkUlIdpnWAkWqBo
a=ice-options:trickle
a=fingerprint:sha-256 BA:A3:B8:06:91:1D:69:7A:C9:46:58:B1:A7:A5:E1:C6:F7:16:86:71:71:8F:2C:27:D9:95:89:FA:7A:A7:FA:79
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=sendonly
a=msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 0986d5d3-0703-4003-b37e-8d899f0a69de
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:1580989886 cname:VY2dNUk0w4Gmvv8S
a=ssrc:1580989886 msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 0986d5d3-0703-4003-b37e-8d899f0a69de
a=ssrc:1580989886 mslabel:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU
a=ssrc:1580989886 label:0986d5d3-0703-4003-b37e-8d899f0a69de

SDP 解析

Line 1

v=0

协议版本号: v=

Line 2

o=- 5247939015171769789 2 IN IP4 127.0.0.1

会话发起者

o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
  • 用户名:空
  • 会话 id:5247939015171769789(规范建议使用 NTP 的时间戳)
  • 会话版本: 2
  • 网络类型:IN(IN表示Internet
  • 地址类型:IP4
  • IP 地址:127.0.0.1

Line 3

s=-

会话名,- 表示为空,这个字段 SDP 中必须有且只能有一个

Line 4

t=0 0

会话的开始、结束时间

  • 开始时间:0 (表示会话一直是活跃的)
  • 结束时间:0 (会话没有结束的边界,永久有效)

Line 5

a=group:BUNDLE 0 1

音频、视频的传输采取多路复用,通过同一个 RTP 通道传输音频、视频。

Line 6

a=extmap-allow-mixed

允许混合使用一字节和两字节 RTP 报头扩展,参考下面两个文档:

从 Chrome M89 版本之后默认情况下提供 extmap-allow-mixed

SDP 中含有 extmap-allow-mixed 会导致 Chrome M71 之前版本出现 SDP 协商失败问题

Line 7

a=msid-semantic: WMS mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU

WMS 是 WebRTC Media Stream 的缩写,a=msid-semantic 用来给 RTP 的媒体流进行分组,用于指定媒体流之间的关系。

msid(mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU)对应于 MediaStream 的 “id” 属性。

TODO: 需要实例验证一下。SDP 的信息中的 msid 与网页中哪个 MediaStream 的 id 一致,前端在调用接口时音视频 MediaStreamTrack 是单独添加的,理论上可以来自两个不同的 MediaStream,应该和前端获取的 MediaStream 没有关系才对。

这部分具体啥作用没看懂,先放着,等理解了再更新。

Line 8

m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 35 36 124 119 123 118 114 115 116

媒体描述,SDP 可能同时包含多个媒体描述,格式如下:

m=<media> <port> <proto> <fmt> ...
  • media: 媒体类型,可以是 video、audio、text、application、message 等,这里是 video
  • port: 传输媒体流的端口,具体含义取决与使用的网络类型(在 c= [Line 9]行中声明)和使用的协议(proto,下一个字段)
  • proto: 传输协议,UDP/TLS/RTP/SAVPF 表示用 UDP 传输 RTP 包,并使用 TLS 加密。
  • fmt: 第四位开始都是媒体格式描述。

SAVPF中的 S 意为 secure,AVP 意为 AV profile,F 意为 feedback。

注意,这里面的 端口 9 后后面第九行的 c= 中的 ip 值 0.0.0.0 都是为了兼容,端口 9 是个特殊的端口,发送到改端口的消息会被简单的丢弃,见维基百科 Discard Protocol 说明。

fmt 的取值说明在 RTP payload formats

96–127 都是动态值,这些值代表的信息在 SDP 后面的信息里面有具体的说明,把这部分类容忽略掉以后,整个 SDP 信息一下就少了很多,没那么大压力了。

96

a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli

97

a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96

98

a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0

99

a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98

100

a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2

101

a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100

102

a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f

121

a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102

127

a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f

120

a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127

125

a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f

107

a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125

108

a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f

109

a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108

35

a=rtpmap:35 AV1X/90000
a=rtcp-fb:35 goog-remb
a=rtcp-fb:35 transport-cc
a=rtcp-fb:35 ccm fir
a=rtcp-fb:35 nack
a=rtcp-fb:35 nack pli

36

a=rtpmap:36 rtx/90000
a=fmtp:36 apt=35

124

a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f

119

a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124

123

a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f

118

a=rtpmap:118 rtx/90000
a=fmtp:118 apt=123

114

a=rtpmap:114 red/90000

115

a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114

116

a=rtpmap:116 ulpfec/90000

Line 9

c=IN IP4 0.0.0.0

参考 Line 2 的解析,IN 指的是 Internet,IP4 指的是 IPv4,在 Line 8 的解析是了解到 0.0.0.0 是为了兼容性考虑

Line 10

a=rtcp:9 IN IP4 0.0.0.0

a= 是扩展 SDP 的主要手段,分为会话级和媒体级属性,在添加第一个媒体描述之前,传达的信息适合整个会议而不是单个媒体,Line 5-7 这三行都是会话级属性,媒体级属性用于添加有关媒体流的信息。

此行用来表示用来传输 RTCP 的地址和端口

Line 11

a=ice-ufrag:7+eD

和下一行中的 a=ice-pwd 信息用于 ICE 协商过程中的安全验证信息。

TODO: 验证 ICE 抓包数据中是否有 ice-ufrag 和 ice-pwd 内容

Line 12

a=ice-pwd:3+VGTgzV7gkUlIdpnWAkWqBo

见 Line 11 行说明

Line 13

a=ice-options:trickle

使用 Trickle ICE,Trickle ICE 是 ICE 协议的扩展,ICE 代理以增量的方式发送和接受候选对象,而不是交换完整列表。

tools.ietf.org/id/draft-ie…

Line 14

a=fingerprint:sha-256 BA:A3:B8:06:91:1D:69:7A:C9:46:58:B1:A7:A5:E1:C6:F7:16:86:71:71:8F:2C:27:D9:95:89:FA:7A:A7:FA:79

表示dtls协商过程中需要的认证信息

TODO: dtls协商是哪个阶段的事情

ICE 连接检查在 DTLS 握手开始之前执行

Line 15

a=setup:actpass

a=setup 主要是表示 dtls 的协商过程中的角色的问题,谁是客户端,谁是服务器

  • actpass 既可以是客户端,也可以是服务器
  • active 客户端
  • passive 服务器

Line 16

a=mid:0

当前媒体行的标识符,对应 Line 5 (a=group:BUNDLE 0 1)中的标识

Line 17~27

a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 urn:3gpp:video-orientation
a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id

a=extmap 用来扩展 RTP 头信息,此部分需要结合 RTP 抓包进行实例分析

webrtc.googlesource.com/src/+/refs/…

  • a=extmap:1 urn:ietf:params:rtp-hdrext:toffset 使用 RFC 5450 中定义的时间戳偏移标头扩展
  • a=extmap:2 www.webrtc.org/experiments… RTP 时间戳使用绝对时间
  • a=extmap:3 urn:3gpp:video-orientation 允许将相机的方向告知另一侧,以便可以正常的显示
  • a=extmap:4 www.ietf.org/id/draft-ho… 拥塞控制
  • a=extmap:5 www.webrtc.org/experiments… 播放延迟
  • a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid 启用 RTP mid 报头扩展,Line 5 (a=group:BUNDLE 0 1)和 Line 7(a=msid-semantic: WMS mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU)必须要启用这个报头扩展才能正常工作

Line 28

a=sendonly

表示此会话仅用于发送视频,此参数受 RTCPeerConnection.createOffer() 参数影响

Line 29

a=msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 72421008-3d5b-41ca-b4c8-50a0ed51a76b

Line 30

a=rtcp-mux

Line 31

a=rtcp-rsize

Line 32~123

a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:35 AV1X/90000
a=rtcp-fb:35 goog-remb
a=rtcp-fb:35 transport-cc
a=rtcp-fb:35 ccm fir
a=rtcp-fb:35 nack
a=rtcp-fb:35 nack pli
a=rtpmap:36 rtx/90000
a=fmtp:36 apt=35
a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f
a=rtpmap:118 rtx/90000
a=fmtp:118 apt=123
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000

明确了 Line 8 中动态指定的 fmt 相关信息

Line 124~132

a=ssrc-group:FID 380787905 4099067239
a=ssrc:380787905 cname:VY2dNUk0w4Gmvv8S
a=ssrc:380787905 msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 72421008-3d5b-41ca-b4c8-50a0ed51a76b
a=ssrc:380787905 mslabel:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU
a=ssrc:380787905 label:72421008-3d5b-41ca-b4c8-50a0ed51a76b
a=ssrc:4099067239 cname:VY2dNUk0w4Gmvv8S
a=ssrc:4099067239 msid:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU 72421008-3d5b-41ca-b4c8-50a0ed51a76b
a=ssrc:4099067239 mslabel:mYoc2iUHPjJzLofS9GBRCjDxlGlYlwmGR7sU
a=ssrc:4099067239 label:72421008-3d5b-41ca-b4c8-50a0ed51a76b

ssrc用来对媒体进行描述,cname用来唯一标识媒体的数据源

a=ssrc-group:FID 380787905 4099067239 FID 表示同一时刻只用一种 codec,默认使用 SSRC 380787905,异常时使用 SSRC 4099067239 修复

Line 133~169

音频媒体参数,参考视频参数

参考资料