• 音视频SDP协议详解(描述会话的协议)


    前言

    SDP协议是会话描述协议(Session Description Protocol)的缩写,是一种会话描述格式,一种描述流媒体初始化参数的格式,为描述多媒体数据而设计。

    文末卡片领取音视频免费资料合集

    流媒体是指在传输过程中看到或者听到的内容)

    ②SDP协议完全是一种会话描述格式(对应的RFC2327 , RFC4566)。

    ③SDP协议不属于传输协议 ,它只使用不同的适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP)、MIME 扩展协议的电子邮件以及超文本传输协议(HTTP)。

    ④SDP协议也是基于文本的协议,这样就能保证协议的可扩展性比较强,使其具有广泛的应用范围。

    ⑤SDP协议不支持会话内容或媒体编码的协商(SDP协议只是描述信息而不能协商的去更改信息),所以在流媒体中只用来描述媒体信息,媒体协商这一块要用RTSP来实现。

    ⑥SDP协议描述信息附带在DESCRIBE报文中由RTSP服务端发出,主要目的是告之会话的存在和给出参与该会话所必须的信息,SDP会话完全是文本形式,采用UTF-8编码的ISO 10646字符集。

    SDP协议描述符

    ①会话名和目的

    ②会话激活的时间区段

    ③构成会话的媒体信息(主叫和被叫的信息)

    ④接收这些媒体所需要的信息(地址,端口,格式)

    ⑤会话所用的宽带信息

    ⑥会话负责人的联系信息

    ⑦媒体信息(包括:媒体类型(视频,音频等)、传送协议(RTP/UDP/IP H.320等)、媒体格式(H,264视频,MPEG视频等)、媒体地址和端口。)

    SDP协议格式

    ①SDP会话描述由一个会话级描述(session_level description)和多个媒体级描述(media_level description)组成。

    ②会话级(session_level)的作用域是整个会话。其位置是从’v=’行开始到第一个媒体描述为止。

    ③媒体级(media_level)描述是对单个的媒体流进行描述(例如传送单个音频或者视频的vlc sdp文件只有短短的几句话,从m=开始,这其实就是个媒体机描述),其位置是从’m=’行开始到下一个媒体描述为止。总之,除非媒体部分重载,会话级的值是各个媒体的缺省默认值(就是说媒体级描述其实也是一个会话级描述,只不过没写出来的会话级描述参数都用的缺省值)。

    【下面带号的是可选的,其余的是必须的。一般顺序也按照下面的顺序来排列。a=是sdp协议扩展属性定义,除上面以外的,分解时其它的都可以扔掉。a=charset属性指定协议使用的字符集。一般的是ISO-10646。】

    1. Session description (会话名称和意图描述)
    2.         v=   (protocol version)   #协议版本
    3.         o=   (owner/creator and session identifier)   #所有者/创建者和会话标识符
    4.         s=   (session name) #会话名称
    5.         i=* (session information) #会话信息
    6.         u=* (URI of description) #URI 描述
    7.         e=* (email address) #Email 地址
    8.         p=* (phone number) #电话号码
    9.         c=* (connection information - not required if included in all media) #连接信息 ― 如果包含在所有媒体中,则不需要该字段
    10.         b=* (zero or more bandwidth information lines) #带宽信息
    11. One or more time descriptions ("t=" and "r=" lines, see below)
    12.         z=* (time zone adjustments) # 时区调整
    13.         k=* (encryption key) # 加密密钥 k=已定义的方法有: k=clear:<加密密钥>密钥没有变换;k=base64:<编码密钥>已编码,因为它含有SDP禁用的字符;k=uri:<获得密钥的URI>;k=prompt。SDP没有提供密钥但该会话或媒体流是要求加密的。
    14.         a=* (zero or more session attribute lines)
    15. Zero or more media descriptions
    16. Time description # 时间描述
    17.         t=   (time the session is active) # 会话活动时间
    18.         r=* (zero or more repeat times) # 0或多次重复次数
    19. Media description, if present # 媒体描述
    20.         m=   (media name and transport address) # 媒体名称和传输地址
    21.         i=* (media title) # 媒体标题
    22.         c=* (connection information - optional if included at session-level) # 连接信息 — 如果包含在会话层则该字段可选
    23.         b=* (zero or more bandwidth information lines) #带宽信息
    24.         k=* (encryption key) # 加密密钥
    25.         a=* (zero or more media attribute lines) #0 个或多个会话属性行

    ④SDP描述由许多文本行组成;文本行的格式为:

    1. # <类型>是一个字母,<>是结构化的文本串,其格式依<类型>而定。
    2. <类型>=<>
    3. type= < value > [CRLF] # (CRLF表示换行)
    4. '''
    5. - type: 该字节为单字节(如: v,o, m等)区分大小写,=号两侧不允许有空格。
    6. - value: 为结构化文本串。
    7. '''

    SDP会话描述

    Version(必选)

    ①协议版:v=0,给出SDP协议的版本号;目前为0版本,无子版本号本。

    origion(必选)

    “o=”项对会话的发起者进行了描述。

    o=    
    o=<用户名> <会话版本> <网络类型><地址类型> <地址>

    ②会话源 :o=(用户名) (会话标识) (版本) (网络类型) (地址类型) (地址)。

    【如果不存在用户登录名,该字段标志位《-》会话标识为一随机数字串,版本为该会话公告的版本 \r\n网络类型为文本串,\n “IN’表示internet地址类型为文本串,目前定义为”IP4”和“IP6”两种地址。】

      • 是用户的登录名。如果主机不支持< username>,则为-。注意:< username>不能含空格。

      • 是一个数字串。在整个会话中,必须是唯一的。为了确保其唯一,建议使用NTP(Network Time Protocol)timestamp。

      • 该会话公告的版本,供公告代理服务器检测同一会话的若干个公告哪个是最新公告.基本要求是会话数据修改后该版本值递增,建议用NTP时戳。

      • 网络类型,一般为IN,表示”internet”

      • 地址类型,一般为IP4

      • 地址

    Session Name(必选)

    表示本sdp所描述的session的名称,没有的话使用-代替,在整个会话中有且只有一个s=。

    s=

    ③会话名:s=(会话名):每个会话描述必须只有一个会话名。

    ④会话信息: i=(会话信息):此字段并非必须,建议包括进来用于描叙相应会话文字性说明,每个会话描叙最多只能有一个。

    ⑤URL:u=(URL):此字段并非必须提供url的描叙信息。

    Connection Data(可选)

    表示媒体连接信息。

    一个会话声明中,会话级描述中必须有”c=”项或者在每个媒体级描述中有一个”c=”项。可能在会话级描述和每个媒体级描述中都有”c=”项。

    其中值域中以空格分配的两个字段分贝是网络类型和网络地址,以后的RTP流就会发到该地址上。

    c= 
      • 网络类型,一般为IN,表示”internet”

      • 地址类型,一般为IP4。

      • 应用程序必须处理域名和ip地址两种情形。单播时,为域名或IP地址,推荐使用域名;多播,为IP地址,且IP后面必须有TTL(取值范围是0-255),地址和TTL决定了多播包被传播的范围。

    例: c=IN IP4 224.2.1.1/127

    分层编码方案是一个数据流被分为多层,接受者能够通过申请不同层的流选择流的质量(包括带宽)如: /< ttl>/< number of addresses> 如果< number of addresses>没有给定,则默认为1。

    ⑥连接数据:c=(网络类型) (地址类型) (连接地址)。

    SDP时间描述

    Times(必选), RepeatTimesand Time Zones

    描述了会话的开始时间和结束时间。这个可以有行,指定多个不规则时间段,如果是规则的时间段,则r=属性可以使用。

    • 为NTP时间,单位是秒。

    • 假如为零表示过了时间后会话一直持续。

    • 均为零时表示持久会话。

    ①t = (会话活动时间)

    Repeat(可选)

    重复次数

    r=  

    在时间表示里面可以如下表示:

    • d - days (86400 seconds)

    • h - hours (3600 seconds)

    • m - minutes (60 seconds)

    • s - seconds (allowed for completeness)

    ②r = * (0或多次重复次数)

    SDP媒体描述

    ①m = (媒体名称和传输地址)

    ②i = * (媒体标题)

    ③c = * (连接信息 — 如果包含在会话层则该字段可选)

    Bandwidth(可选)

    描述了建议的带宽,单位kilobits per second(缺省带宽是千比特每秒)。

    b=:

    包括两种CT和AS。CT:ConferenceTotal,总带宽。AS:Application-SpecificMaximum,单个媒体带宽的最大值。

    扩展机制:以”X-”开始。建议bwtype越短越好。例b=X-YZ:128

    ④b = * (带宽信息)

    ⑤k = * (加密密钥)

    ⑥a = * (0 个或多个会话属性行)

    1)音频媒体会话属性行信息

    2)视频媒体会话属性行信息

    m媒体信息描述行(Media Announcements (必选))

    m=   
    • :表示媒体类型。有"audio", “video”,“application”(例白板信息), “data”(不向用户显示的数据) 和"control"(描述额外的控制通道)。

    • :媒体流发往传输层的端口。取决于c=行规定的网络类型和接下来的传输层协议:

      • 对UDP为1024-65535;

      • 对于RTP为偶数。

    当分层编码流被发送到一个单播地址时,需要列出多个端口。方式如下:m= /

    对于RTP,偶数端口被用来传输数据,奇数端口用来传输RTCP包。例:m=video49170/2 RTP/AVP 31 端口49170和49171为第一对RTP/RTCP端口,49172和49173为第二对的端口。传输协议是RTP/AVP,媒体格式为31(媒体格式是rtp头中payload参数对应的)

      • :传输协议,与c=行的地址类型有关。两种:

        • RTP/AVP,表示RealtimeTransport Protocol using the Audio/Video profile carried over UDP;

        • UDP

      • :媒体格式。对于音频和视频就是在RTP Audio/Video Profile定义的负载类型(payload type)。但第一个为缺省值。分为静态绑定和动态绑定:

        • 静态绑定即媒体编码方式与RTP流中的PayloadType(载荷类型)一一对应。

        • 动态绑定即媒体编码方式(如时钟频率,音频信道数等)没有完全确定,动态编码都大于95,并且需要在后面使用“a=rtpmap”进行说明。

    静态绑定的例子:u_law的PCM编码单信道Audio,采样率8KHZ。在RTPAudio/Video profile中对应的payload type为0。即: m=audio 49232 RTP/AVP 0

    动态绑定的例子:16位线形编码,采样率为16KHZ,假如我们希望动态RTP/AVP 类型98表示此此流,即: m=video49232 RTP/AVP 98  a=rtpmap:98 L16/16000/2

    简单介绍:

    ①格式: m=(媒体)(端口)(传送层)(格式列表)

    ②媒体类型:音频(audio),视频(video),应用,数据和控制

    ③端口:媒体传送层端口

    ④传送层:ip4上大多基于rtp/udp上传送(RTP/AVP)、IETF RTP协议,在udp上传输

    ⑤格式列表: 对应的音频负载类型(PT)

    例如:m=video 0 RTP/AVP 96
    ​
    1、媒体类型:例如视频和音频。
    2、传输协议:例如RTP/UDP/IP和H.320。
    3、媒体格式:例如H.261视频和MPEG视频。
    4、多播地址和媒体传输端口(IP多播会话)。
    5、用于联系地址的媒体和传输端口的远端地址(IP单播会话)。
    6、SDP描述由许多文本行组成,文本行的格式为<类型>=<值>,<类型>是一个字母,<值>是结构化的文本串,其格式依<类型>而定。“=”两侧不允许有空格,一个值中的多个参数用空格分隔。

    a媒体信息描述行

    会话级属性

    一般在t行之后

      • a=cat:<类别> 给出点分层次式会话分类号,供接收方筛选会话

      • a=keywds:<关键词> 供接收方筛选会话

      • a=tool:<工具名和版本号> 创建会话描述的工具名和版本号

      • a=recvonly/sendrecv/sendonly 收发模式

      • a=type:<会议类型> 有:广播,聚会,主席主持,测试,H.323

      • a=charset:<字符集> 显示会话名和信息数据的字符集

      • a=sdplang:<语言标记> 描述所有语言

      • a=lang:<语言标记> 会话描述的缺省语言或媒体描述的语言

      • a=framerate:<帧速率> 1s播放几个rtp包,导数为一个rtp包承载的数据播放的时间单位s。单位:帧/秒 音频的话 a=framerate:50 1byte8000hz20ms=160B,则每个rtp包的音频数据量为160B 时间戳增值为160

      • a=quality:<质量> 视频的建议质量(10/5/0)

    媒体级属性

    一般在m行之后

      • a=ptime:<分组时间> 媒体分组的时长(单位:秒)

      • a=recvonly/sendrecv/sendonly 收发模式

      • a=orient:<白板方向> 指明白板在屏莫上的方向

      • a=sdplang:<语言标记> 描述所有语言

      • a=lang:<语言标记> 会话描述的缺省语言或媒体描述的语言

    rtpmap

    rtpmap是rtp与map的结合, 即RTP参数映射表。对于音频流,<编码参数>说明了音频的通道数。通道数默认缺省值为1。对于视频流,现阶段没有<编码参数>。

    a=rtpmap: /[/]
    a=rtpmap:<负载类型> <编码名>/<时钟速率>[/<编码参数>]
    • 负载类型: 对应RTP包中的音视频数据负载类型.

    • 编码器名称:如VP8, VP9, OPUS.

    • 采样率.

    • 编码参数:如音频是否是双声道, 通道数默认缺省值为1(单声道)。

    示例:

    m=audio 49230 RTP/AVP 96 97 98 
    a=rtpmap:96 L8/8000 
    a=rtpmap:97 L16/8000
    a=rtpmap:98 L16/11025/2
    ​
    m=audio 8888 RTP/AVP 0 
    a=rtpmap:0 pcma/8000/1 
    ​
    m=video 1234 RTP/AVP 96
    a=rtpmap:96 H264

    在rtpmap中,实验性的编码方案也可以用。其格式名前一定为”X-”例:一种新的实验性的被称为GSMLPC的音频流,使用的动态负载类型为99。

    m=video 49232 RTP/AVP 99
    a=rtpmap:99 X-GSMLPC/8000

    rtpmap 还可以有几种值:recvonly,sendrecv,sendonly,inactive 这些值表示媒体流的双向保持设定(双向保持,即A 保持 B, B保持A)。

    ①A 保持 B: A发送sendonly B 回复 recvonly

    ②B 保持 A:B发送inactive A无消息 (sendonly也可)

    ③A 解除保持:A发送sendrecv, B无消息

    ④B解除保持: B发送sendrecv, A回复sendrecv

    ⑤A B可继续通话。

    如果请求某媒体流的方向为sendonly,那么响应中对应媒体的方向必须为recvonly; 如果请求某媒体流的方向为recvonly,那么响应中对应媒体的方向必须为sendonly; 如果请求某媒体流的方向为sendrecv,那么响应中对应媒体的方向可以为sendrecv/sendonly/recvonly/inactive中的一种; 如果请求某媒体流的方向为inactive,那么响应中对应媒体的方向必须为inactive;

    fmtp

    定义指定格式的附加参数

    a=fmtp: 
    • :负载类型

    • :具体参数

    SDP协议概述

    ①SIP协议和其他协议一样都有这样的一个要求:在会话开头时两端要有充分的信息交流。使用的两个协议就是定义在RFC 2974中的SAP(Session Announcement Protocol )和定义在RFC 2327的SDP (Session Description Protocol)。

    • SAP提供了一种定期宣传多媒体会话,向有意参与会话者传递相关会话信息的机制。使用它来支持Mbone(Internet Multicast Backbone),因此关兴趣的各方都会清楚的指导目前正在进行的一些会话。

    • SDP则定义了描述一个通信会话的格式,同样的,它也可以用于不同的传输协议,比如SAP、SIP、HTTP或其他等传输协议。

    ②SDP全称是Session Description Protocol,翻译过来就是描述会话的协议。主要用于两个会话实体之间的媒体协商。

    SIP协议负责建立和释放会话;一般来说,会话中包含相关的媒体,比如视频和音频。媒体数据是由SDP协议描述的。SDP协议一般不单独使用,它与SIP协议配合使用(会放到SIP协议的Message Body中)。

    【在会话建立时,需要会话终端之间媒体协商,双方才能确定对方的媒体能力以及交换媒体的数据(这就是SDP协议的工作)】

    1)服务器向被叫UAS发出Invite请求,Message Body消息体中使用SDP协议描述自己的媒体能力(包括但不限于音频媒体信息、视频媒体信息等)给UAS。

    2)被叫UAS向服务器响应200 OK(表示正式建立主叫与被叫之间的通话),Message Body消息体中使用SDP协议描述被叫自己的媒体能力(包括但不限于音频媒体信息、视频媒体信息等)给服务器(服务器后续会转发给主叫UAC)

    那为什么要去发这个描述文本呢,主要是为了解决参与会话的各成员之间能力不对等的问题;如果参加本次通话的成员都支持高质量的通话,但是我们没有去进行协议,为了兼容性,使用的都是普通质量的通话格式,这样就很浪费资源了。所以SDP的作用还是很有必要的。

    ④在SIP协议的包含的内容是SDP协议描述多媒体数据时,Message Header消息头中应该把Content-Type媒体类型设置成application/sdp。(SDP协议于RFC4566中发布 )

    实例

    实例①

    1. v=0
    2. o=- 49451 3 IN IP4 127.0.0.1
    3. s=Test MPEG Video session
    4. i=Parameters for the session streamed by "testMPEG1or2VideoStreamer"
    5. t=0 0
    6. a=tool:testMPEG1or2VideoStreamer
    7. a=type:broadcast
    8. m=video 1234 RTP/AVP 32
    9. c=IN IP4 239.255.42.42/127
    10. 1行v代表了协议版本,例子中为0
    11. 2行o代表所有者/创建者和会话标识符。
    12. 3行s代表会话名称,例子中为Test MPEG Video session,用户可以自己填写。
    13. 4行t代表会话活动时间。
    14. 5行和第67行a代表会话属性行,可写0个或多个。
    15. 7行m代表代表媒体信息;video代表是视频流;1234代表UDP端口号是1234;RTP/AVP指媒体传输协议使用RTP/AVP;32代表媒体格式使用MPV并且使用90KHz的时钟。关于RTP/AVP可以在RFC 3551 RTP A/V Profile July 2003找到。
    16. PT encoding media type clock rate
    17. name (Hz)24 unassigned V
    18. 25 CelB V 90,000
    19. 26 JPEG V 90,000
    20. 27 unassigned V
    21. 28 nv V 90,000
    22. 29 unassigned V
    23. 30 unassigned V
    24. 31 H261 V 90,000
    25. 32 MPV V 90,000 (这就是例子中的RTP/AVP类型)
    26. 33 MP2T AV 90,000
    27. 34 H263 V 90,000
    28. 35-71 unassigned ?
    29. 72-76 reserved N/A N/A
    30. 77-95 unassigned ?
    31. 96-127 dynamic ?
    32. dyn H263-1998 V 90,000
    • 第9行c代表连接信息。

    实例②

    1. 1 v=0
    2. 2 //sdp版本号,一直为0,rfc4566规定
    3. 3 o=- 7017624586836067756 2 IN IP4 127.0.0.1
    4. 4 // o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
    5. 5 //username如何没有使用-代替,7017624586836067756是整个会话的编号,2代表会话版本,如果在会话
    6. 6 //过程中有改变编码之类的操作,重新生成sdp时,sess-id不变,sess-version加1
    7. 7 s=-
    8. 8 //会话名,没有的话使用-代替
    9. 9 t=0 0
    10. 10 //两个值分别是会话的起始时间和结束时间,这里都是0代表没有限制
    11. 11 a=group:BUNDLE audio video data
    12. 12 //需要共用一个传输通道传输的媒体,如果没有这一行,音视频,数据就会分别单独用一个udp端口来发送
    13. 13 a=msid-semantic: WMS h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
    14. 14 //WMS是WebRTC Media Stream简称,这一行定义了本客户端支持同时传输多个流,一个流可以包括多个track,
    15. 15 //一般定义了这个,后面a=ssrc这一行就会有msid,mslabel等属性
    16. 16 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
    17. 17 //m=audio说明本会话包含音频,9代表音频使用端口9来传输,但是在webrtc中一现在一般不使用,如果设置为0,代表不
    18. 18 //传输音频,UDP/TLS/RTP/SAVPF是表示用户来传输音频支持的协议,udp,tls,rtp代表使用udp来传输rtp包,并使用tls加密
    19. 19 //SAVPF代表使用srtcp的反馈机制来控制通信过程,后台111 103 104 9 0 8 106 105 13 126表示本会话音频支持的编码,后台几行会有详细补充说明
    20. 20 c=IN IP4 0.0.0.0
    21. 21 //这一行表示你要用来接收或者发送音频使用的IP地址,webrtc使用ice传输,不使用这个地址
    22. 22 a=rtcp:9 IN IP4 0.0.0.0
    23. 23 //用来传输rtcp地地址和端口,webrtc中不使用
    24. 24 a=ice-ufrag:khLS
    25. 25 a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
    26. 26 //以上两行是ice协商过程中的安全验证信息
    27. 27 a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
    28. 28 //以上这行是dtls协商过程中需要的认证信息
    29. 29 a=setup:actpass
    30. 30 //以上这行代表本客户端在dtls协商过程中,可以做客户端也可以做服务端,参考rfc4145 rfc4572
    31. 31 a=mid:audio
    32. 32 //在前面BUNDLE这一行中用到的媒体标识
    33. 33 a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
    34. 34 //上一行指出我要在rtp头部中加入音量信息,参考 rfc6464
    35. 35 a=sendrecv
    36. 36 //上一行指出我是双向通信,另外几种类型是recvonly,sendonly,inactive
    37. 37 a=rtcp-mux
    38. 38 //上一行指出rtp,rtcp包使用同一个端口来传输
    39. 39 //下面几行都是对m=audio这一行的媒体编码补充说明,指出了编码采用的编号,采样率,声道等
    40. 40 a=rtpmap:111 opus/48000/2
    41. 41 a=rtcp-fb:111 transport-cc
    42. 42 //以上这行说明opus编码支持使用rtcp来控制拥塞,参考https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
    43. 43 a=fmtp:111 minptime=10;useinbandfec=1
    44. 44 //对opus编码可选的补充说明,minptime代表最小打包时长是10ms,useinbandfec=1代表使用opus编码内置fec特性
    45. 45 a=rtpmap:103 ISAC/16000
    46. 46 a=rtpmap:104 ISAC/32000
    47. 47 a=rtpmap:9 G722/8000
    48. 48 a=rtpmap:0 PCMU/8000
    49. 49 a=rtpmap:8 PCMA/8000
    50. 50 a=rtpmap:106 CN/32000
    51. 51 a=rtpmap:105 CN/16000
    52. 52 a=rtpmap:13 CN/8000
    53. 53 a=rtpmap:126 telephone-event/8000
    54. 54 a=ssrc:18509423 cname:sTjtznXLCNH7nbRw
    55. 55 //cname用来标识一个数据源,ssrc当发生冲突时可能会发生变化,但是cname不会发生变化,也会出现在rtcp包中SDEC中,
    56. 56 //用于音视频同步
    57. 57 a=ssrc:18509423 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C 15598a91-caf9-4fff-a28f-3082310b2b7a
    58. 58 //以上这一行定义了ssrc和WebRTC中的MediaStream,AudioTrack之间的关系,msid后面第一个属性是stream-d,第二个是track-id
    59. 59 a=ssrc:18509423 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
    60. 60 a=ssrc:18509423 label:15598a91-caf9-4fff-a28f-3082310b2b7a
    61. 61 m=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98
    62. 62 //参考上面m=audio,含义类似
    63. 63 c=IN IP4 0.0.0.0
    64. 64 a=rtcp:9 IN IP4 0.0.0.0
    65. 65 a=ice-ufrag:khLS
    66. 66 a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
    67. 67 a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
    68. 68 a=setup:actpass
    69. 69 a=mid:video
    70. 70 a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
    71. 71 a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
    72. 72 a=extmap:4 urn:3gpp:video-orientation
    73. 73 a=extmap:5 http://www.ietf.org/id/draft-hol ... de-cc-extensions-01
    74. 74 a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
    75. 75 a=sendrecv
    76. 76 a=rtcp-mux
    77. 77 a=rtcp-rsize
    78. 78 a=rtpmap:100 VP8/90000
    79. 79 a=rtcp-fb:100 ccm fir
    80. 80 //ccm是codec control using RTCP feedback message简称,意思是支持使用rtcp反馈机制来实现编码控制,fir是Full Intra Request
    81. 81 //简称,意思是接收方通知发送方发送幅完全帧过来
    82. 82 a=rtcp-fb:100 nack
    83. 83 //支持丢包重传,参考rfc4585
    84. 84 a=rtcp-fb:100 nack pli
    85. 85 //支持关键帧丢包重传,参考rfc4585
    86. 86 a=rtcp-fb:100 goog-remb
    87. 87 //支持使用rtcp包来控制发送方的码流
    88. 88 a=rtcp-fb:100 transport-cc
    89. 89 //参考上面opus
    90. 90 a=rtpmap:101 VP9/90000
    91. 91 a=rtcp-fb:101 ccm fir
    92. 92 a=rtcp-fb:101 nack
    93. 93 a=rtcp-fb:101 nack pli
    94. 94 a=rtcp-fb:101 goog-remb
    95. 95 a=rtcp-fb:101 transport-cc
    96. 96 a=rtpmap:107 H264/90000
    97. 97 a=rtcp-fb:107 ccm fir
    98. 98 a=rtcp-fb:107 nack
    99. 99 a=rtcp-fb:107 nack pli
    100. 100 a=rtcp-fb:107 goog-remb
    101. 101 a=rtcp-fb:107 transport-cc
    102. 102 a=fmtp:107 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
    103. 103 //h264编码可选的附加说明
    104. 104 a=rtpmap:116 red/90000
    105. 105 //fec冗余编码,一般如果sdp中有这一行的话,rtp头部负载类型就是116,否则就是各编码原生负责类型
    106. 106 a=rtpmap:117 ulpfec/90000
    107. 107 //支持ULP FEC,参考rfc5109
    108. 108 a=rtpmap:96 rtx/90000
    109. 109 a=fmtp:96 apt=100
    110. 110 //以上两行是VP8编码的重传包rtp类型
    111. 111 a=rtpmap:97 rtx/90000
    112. 112 a=fmtp:97 apt=101
    113. 113 a=rtpmap:99 rtx/90000
    114. 114 a=fmtp:99 apt=107
    115. 115 a=rtpmap:98 rtx/90000
    116. 116 a=fmtp:98 apt=116
    117. 117 a=ssrc-group:FID 3463951252 1461041037
    118. 118 //在webrtc中,重传包和正常包ssrc是不同的,上一行中前一个是正常rtp包的ssrc,后一个是重传包的ssrc
    119. 119 a=ssrc:3463951252 cname:sTjtznXLCNH7nbRw
    120. 120 a=ssrc:3463951252 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346d
    121. 121 a=ssrc:3463951252 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
    122. 122 a=ssrc:3463951252 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346d
    123. 123 a=ssrc:1461041037 cname:sTjtznXLCNH7nbRw
    124. 124 a=ssrc:1461041037 msid:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C ead4b4e9-b650-4ed5-86f8-6f5f5806346d
    125. 125 a=ssrc:1461041037 mslabel:h1aZ20mbQB0GSsq0YxLfJmiYWE9CBfGch97C
    126. 126 a=ssrc:1461041037 label:ead4b4e9-b650-4ed5-86f8-6f5f5806346d
    127. 127 m=application 9 DTLS/SCTP 5000
    128. 128 c=IN IP4 0.0.0.0
    129. 129 a=ice-ufrag:khLS
    130. 130 a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
    131. 131 a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
    132. 132 a=setup:actpass
    133. 133 a=mid:data
    134. 134 a=sctpmap:5000 webrtc-datachannel 1024

     

  • 相关阅读:
    从零开始自己动手写自旋锁
    Oracle触发器
    常用的 DOS 命令
    ARM汇编(gun-complier)
    信息系统项目管理师---第十四章 信息文档管理与配置管理历年考题
    mybatisplus savebatch 多数据源时候,sqlSessionFactory 不正确踩坑记录。
    conda config包含无效channel解决办法
    hive sql多表练习
    一键整合,万用万灵,Python3.10项目嵌入式一键整合包的制作(Embed)
    windows系统使用bat脚本批量启动程序
  • 原文地址:https://blog.csdn.net/yinshipin007/article/details/127972292