我是靠谱客的博主 超帅帆布鞋,最近开发中收集的这篇文章主要介绍rtsp协议_SDP协议分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

0.引言

为了更好理解本篇文章,可以先阅读前面几篇文章,文章列表如下:

详解RTP封包和拆包AAC实战分析(2)

RTSP协议交互流程之推流分析

RTSP协议交互流程之拉流分析

详解RTP打包AAC实战分析(1)

详解RTP协议之H264封包和解包实战

详解RTP协议之H264封包细节(1)

详细解析RTSP框架和数据包分析(1)

手把手搭建RTSP流媒体服务器

RTP协议

HLS实战之Wireshark抓包分析

HTTP实战之Wireshark抓包分析

如果要更加详细地学习SDP协议,可以参看官方协议描述,如下链接:

https://tools.ietf.org/html/rfc4566

协议界面,如下图:

fed37e3806360ed51741aa5aa7497c5c.png
0a32a7fdaa786762f84f0ddbf5ecb06a.png

webrtc关于SDP的协议描述,如下链接:

https://datatracker.ietf.org/doc/draft-ietf-rtcweb-sdp/

协议界面,如下图:

a1b2df812a71cb58217a2452d5632005.png

1.SDP协议简述

SDP(Session Description Protocol)的内容 完全是⼀种会话描述格式, 它不属于传输协议 。 它只使⽤不同得适当的传输协议,包括会话通知协议(SAP)、会话初始协议(SIP)、实时流协议(RTSP)、MIME 扩展协议的电⼦邮件以及超⽂本传输协议(HTTP)。SDP协议是也是基于⽂本的协议,这样就能保证协议的可扩展性⽐较强,这样就使其具有⼴泛的应⽤范围。SDP 不⽀持会话内容或媒体编码的协商,所以在流媒体中只能用来描述媒体信息。媒体协商这⼀块要⽤RTSP来实现。

8a4042b12a476f2abab4db52ae725846.png
bb584a85290f07ad1d383acb91f156f1.png

1.1SDP协议格式

(1)SDP描述由许多文本行组成,⽂本⾏的格式为=,即<type>=[CRLF]。是一个字母,是结构化的文本串,其格式依类型决定。可以理解一种key-value的形式。具体SPEC协议有详细描述。SDP采⽤多⽂本⾏传递会话信息,每⾏使⽤“字段名=字段值”的格式。字段名只⽤⼀个字符表示(⼤⼩写敏感),字段值可以有多个信息块组成,⽤分号隔开,“=”左右不能有空格。SDP字段包括必需字段与可选字段。

(2)推流的时候,sdp内容如下:

8efca184f64becf95c9f45d5f13c6194.png
d989261d6fcd35b74634ed9777306d08.png

(3)拉流的时候,sdp内容如下:

665e1747b4446504fa002cf8d3b8550a.png
66ec03860a538d76f239f62513336887.png

2.SDP的结构描述

SDP仅仅提供了参与者(可通俗地理解客户端与服务端),描述会话信息。⼀个会话基本上有许多媒体流组成,因此,会话描述包含了每个媒体流相关的参数说明和与会话整体相关的通⽤信息。也就是说SDP消息既包含了会话级参数,又包含了媒体流级参数。会话级参数一般包括如下信息,会话名称、会话发起者以及会话活动时间。媒体流级参数包括媒体类型、端⼝号、传输协议以及媒体格式。如下图描述了SDP消息的基本结构。主要分2大块,会话级别信息和媒体描述(音频和视频是独立分开)。

4a91699f78987008b615ee9f246cd484.png

SDP仅仅提供了对会话的描述没有提供将会话和可能的参与者联系起来的⽅法,所以必须把SDP与其他协议(如SIP协议)结合起来使⽤。SDP协议与SIP协议,⼀样基于⽂本的协议,需要使⽤特定的编码集。字段名称只能使⽤US-ASCII字符集,⽂本信息可以使⽤任何语⾔。由于SDP的ASCII编码⽐⼆进制编码占⽤带宽多,所以SDP采⽤紧凑格式提⾼带宽利⽤率。如v=version,s=session name等等。

3. SDP语法

首先是会话级字段必须放在前面(一般只有一个),然后是媒体级别参数(可以有多个),会话数据与媒体数据之间的界限就是第⼀个媒体描述字段(m=)的出现,之后的每个媒体描述字段的出现标志着这个会话中⼜⼀个媒体流数据的开始。

3.1 SDP必需字段

sdp必须的字段如下:

(1)v=(协议版本号),⼀个会话描述的开始,前⼀个会话结束标志。

(2)o=(会话源或者会话⽣成者,以及会话标识符)。

(3)s=(会话名称)这个字段是个⽂本字符串,可以显示给会话参与者。

(4)t=(会话时间)这个字段指明会话开始时间与结束时间。t表示会话时间,一般就表示0。

(5)m=(媒体重要信息),该字段⽤来指明媒体类型、数据应该发送到的传输端⼝传输协议(例如RTP)以及媒体格式(例如RTP负载格式)。

3.2 可选字段

SDP可选字段中,⼀些只能应⽤于会话级,⼀些只能应⽤于媒体级,还有⼀些可以应⽤于两种级别。对于应⽤于两种级别的字段,在某个具体媒体上,应⽤于媒体级的字段会覆盖应⽤于会话级的字段值。如,某个字段其会话级的字段值为X,媒体1的该字段值为Y,那么值X应⽤于会话中除媒体类型1之外的所有媒体,⽽媒体1应⽤值Y。

可选字段如下:

(1)i=(会话信息)对字段的⽂本描述,提供了⽐会话名称更多的信息。该字段既可以⽤于会话级也可以⽤于媒体级。

(2)u=(描述的URI地址)URI信息,通过这个地址可以获取更多会话相关信息。例如,⼀个会议可能公布在WEB⻚⾯上,所以需要该WEB的URI。每个会话只能提供⼀个URI。

(3)E=(E-mail地址)负责会话个体的E-mail地址,可以有多个。只能⽤于会话级别。

(4)p=(电话号码)同email⼀样,多个,会话级别。

(5)c=(连接信息)该字段提供连接数据,包括连接类型、⽹络类型和连接地址。可应⽤于会话级也可以⽤于媒体级。如c表示推流目的地址,很重要信息。

(6)b=(带宽信息)指明带宽需求,单位kbit/s, 可⽤于两个级别。

(7)r=(重复次数)如果是有规律的⽇程安排活动,这个字段⽤来指明会话重复频次和时间。

(8)z=(时区调整)⽤于按⽇程安排的有规律活动会话。会话可能会夸时区,避免时区变更造成的混乱。

(9)k=(加密密钥)为了对媒体加密、解密,该字段提供了⼀个加密密钥或者规定了⼀个获取密钥的机制。可⽤于两个级别。

(10)a=(属性)⽤于描述会话或者某个媒体的额外属性

可选字段中,连接信息字段是特别与条件相关的。因为该字段定义了数据应发送到的⽹络地址,所以必须被包含进会话描述中的某个地⽅。

3.3 字段顺序

因为有些字段既可以应⽤于会话级⼜可以⽤于媒体级,所以字段顺序对于避免含义模糊特别重要,所以顺序特别重要。SDP所要求的字段顺序如下:

会话级

以下黑色粗体部分,都是十分重要的。

(1)协议版本号(v)

(2)会话源(O)

(3)会话名称(s)

(4)会话信息(i)(可选)

(5)URI(u)(可选)

(6)E-mail地址(e)(可选)

(7)电话号码(p)(可选)

(8)连接信息(c)(可选)

(9)带宽信息(b)(可选)

(10)时间描述(t)

(11)重复信息(r)(可选)

(12)时区调整(z)(可选)

(13)加密密钥(k)(可选)

(14)属性(a)(可选)

媒体级

媒体描述(m)

(1)媒体信息(i)(可选)

(2)连接信息(c)(会话级进⾏了规定,这⾥可选)

(3)带宽信息(b)(可选)

(4)加密密钥(k)(可选)

(5)属性(a) (可选)

3.4 ⼦字段

在SDP中许多字段采⽤多个⼦字段的形式,此时,这些字段值由多个以空格符间隔的多个值组成。格式如下:

(1)字段 名称=

下⾯举例说明⽐较重要的字段。如下:

(2)会话源(o)

有6个⼦字段:⽤户名、会话ID、版本、⽹络类型、地址类型、地址

(3)连接信息

连接数据有3个⼦字段:⽹络类型、地址类型和连接地址。同会话源中含义不同,他们表示需要接收媒体数据的⽹络和地址,⽽不是⽣成会话的⽹络和地址。

(4)媒体信息

媒体信息(m)有四个⼦字段:媒体类型、端⼝、传输协议、格式

如下图所示:

5079e40babad0fd5363aa8f7d0cb3bbc.png
7e998cb6619835aaed522821bff90f4f.png

注意:属性a是对m描述行的格式列表,对PT做进一步的描述。

媒体类型可以是⾳频、视频、应⽤程序、数据或控制,如果是语⾳,媒体类型就是⾳频。端⼝指明媒体要发送到的端⼝号,端⼝号与所有的连接类型和传输协议有关。例如VOIP,媒体通常在UDP传输协议上采用RTP承载,这样端⼝号将是1024和65535之间的⼀个偶数值。相应奇数对应RTCP端⼝号。实际上端口一般不在这里描述,一般都是在SETUP描述。

⼦字段列出了所⽀持的所有不同类型的媒体格式。优先使⽤靠前的格式

如某个系统准备在端口45678接收语⾳,并且只能处理G.711U编码的语⾳,那么RTP负载类型为0,媒体信息如下:

m=audio 45768 RTP/AVP 0

如果某个系统准备在端⼝45678可以处理⼏种编码的语⾳:G.728编码格式(负载类型为15)、GSM编码格式(负载类型为3)、G.711U编码格式(负载类型为0),⽽且系统优先采⽤G.728格式,则相应的媒体信息如下所示:

m=audio 45768 RTP/AVP 15 3 0

注意:支持多个编码方式,优先选择15。当然这个是可以修改。

属性(a)

属性可以描述额外信息,可应⽤于会话级,也可⽤于媒体级或者两者兼有。

a描述行,大部分情况是必须的。如需要a这个属性,去描述视频。

f83d803b1b321313bbf0e4c7d72eb883.png

rtpmap属性提供了⼀个在VOIP应⽤中的重要属性使⽤⽅法,该属性可⽤于媒体流,在媒体格式不是静态的RTP负载类型时特别有⽤。

1385ad12260b0a9f0020c8ffd9069f9c.png

严格来说,rtpmap只在使⽤动态负载类型情况下才是必须的,例如标准的G.711语⾳是静态RTP负载类型,采⽤如下⽅法就可以对它完整描述:

m = audio 45678 RTP/AVP 0

⽽对动态负载来说需要指定更多信息才能使远端完全识别到媒体编码,例如16位线性编码16k取样的⽴体声⾳就是⼀个动态RTP负载类型,如果我们采⽤动态负载类型98表示这个媒体流,那么SDP格式如下:

m = audio 45678 RTP/AVP 98

a = rtpmap 98 L 16/16000/2

SIP建议⽆论是静态负载还是动态负载,尽量都要采⽤该属性。

属性有两种形式,第⼀种是特征属性,第⼆种属于值属性。SDP描述了多个建议属性。如下:

a=sendonly,表明会话描述的发送者只希望发送数据⽽不打算接收数据,端⼝号⽆意义,可以置为0。

a=recvonly,表明这个会话描述的发送者只想接收数据⽽不打算发送数据。

描述不同的音频格式:

b34e796eda90c569638cb72e84f86fcf.png

rtpmap代表是何种编码器

aadb01b12ed5f9f8acf5f8e566e84372.png

4 SDP协议例⼦

(1)下⾯是⼀个流媒体服务器的RTSP协议中的SDP协议:

v=0 //SDP version // o field定义的源的⼀些信息。其格式为:o=   o=- 1271659412 1271659412 IN IP4 10.56.136.37 s=    i= //session的信息    c=IN IP4 0.0.0.0 //connect 的信息,分别描述了:⽹络协议,地址的类型,连接地址。c=IN IP4 0.0.0.0 t=0 0 //时间信息,分别表示开始的时间和结束的时间,⼀般在流媒体的直播的时移中⻅的⽐较多。 a=SdpplinVersion:1610641560 //描述性的信息a=StreamCount:integer;2 //⽤来描述媒体流的信息,表示有两个媒体流。integer表示信息的格式为整 数。a=control:* a=DefaultLicenseValue:integer;0 //License信息 a=FileType:string;"MPEG4" ⽤来描述媒体流的信息说明当前协商的⽂件是mpeg4格式的⽂件 a=LicenseKey:string;"license.Summary.Datatypes.RealMPEG4.Enabled" a=range:npt=0-72.080000 //⽤来表示媒体流的⻓度 m=audio 0 RTP/AVP 96 //做为媒体描述信息的重要组成部分描述了媒体信息的详细内容:表示session 的audio是通过RTP来格式传送的,其payload值为96传送的端⼝还没有定。b=as:24 //audio 的bitrate b=RR:1800b=RS:600 a=control:streamid=1 //通过媒体流1来发送⾳频 a=range:npt=0-72.080000 //说明媒体流的⻓度。 a=length:npt=72.080000 a=rtpmap:96 MPEG4-GENERIC/32000/2 //rtpmap的信息,表示⾳频为AAC的其sample为32000 a=fmtp:96 profile-level-id=15;mode=AAC- hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210 //config为AAC的详细格式信息 a=mimetype:string;"audio/MPEG4-GENERIC"a=Helix-Adaptation-Support:1 a=AvgBitRate:integer;48000 a=HasOutOfOrderTS:integer;1 a=MaxBitRate:integer;48000 a=Preroll:integer;1000 a=OpaqueData:buffer;"A4CAgCIAAAAEgICAFEAVABgAAAC7gAAAu4AFgICAAhKIBoCAgAEC" a=StreamName:string;"Audio Track"

(2)例子2:

v=0  o=StreamingServer 3677033027 1437537780000 IN IP4 192.168.1.44  s=demo.mp4  u=http:///  e=admin@  c=IN IP4 0.0.0.0  b=AS:1398  t=0 0 a=control:*   a=x-copyright: MP4/3GP File hinted with GPAC 0.5.0-rev4065 (C)200 0-2005 - http://gpac.sourceforge.net  a=range:npt=0- 216.52167  m=video 0 RTP/AVP 96  b=AS:1242  a=3GPP-Adaptation-Support:1  a=rtpmap:96 H264/90000  a=control:trackID=65536  a=fmtp:96 profile-level-id=42000A; packetization-mode=1; sprop-pa rameter-sets=Z0IACpZUBQHogA==,aM44gA== a=framesize:96 640-480  m=audio 0 RTP/AVP 97  b=AS:156 a=3GPP-Adaptation-Support:1  a=rtpmap:97 mpeg4-generic/48000/1  a=control:trackID=65537 a=fmtp:97 profile-level-id=41; config=1188; streamType=5; mode=AA C-hbr; objectType=64; constantDuration=1024; sizeLength=13; index Length=3; indexDeltaLength=3

(3)下⾯是video的信息基本和audio的信息相对称,这⾥就不再说了。

m=video 0 RTP/AVP 97 b=as:150 b=RR:11250 b=RS:3750 a=control:streamid=2 a=range:npt=0-72.080000 a=length:npt=72.080000 a=rtpmap:97 MP4V-ES/2500 a=fmtp:97 profile-level-id=1; a=mimetype:string;"video/MP4V-ES" a=Helix-Adaptation-Support:1 a=AvgBitRate:integer;300000 a=HasOutOfOrderTS:integer;1 a=Height:integer;240 //影⽚的⻓度 a=MaxBitRate:integer;300000 a=MaxPacketSize:integer;1400 a=Preroll:integer;1000 a=Width:integer;320 //影⽚的宽度 a=OpaqueData:buffer;"AzcAAB8ELyARAbd0AAST4AAEk+AFIAAAAbDzAAABtQ7gQMDPAAABAAA AASAAhED6KFAg8KIfBgEC"a=StreamName:string;"Video Track"

关于更多SDP例子,可以参考这几篇文章,如下链接:

https://www.cnblogs.com/idignew/p/7249056.html

https://www.jianshu.com/p/94b118b8fd97

https://blog.csdn.net/jobbofhe/article/details/78477407

5.总结

本文主要详细讲解了SDP协议结构,字段说明等常用知识点,对于学习SDP协议,是要必须掌握的。SDP协议本身并不复杂,只是和其它应用协议结合起来使用,就会有些难理解,需要深入剖析,在实际的工程应用中,一定要灵活运用。欢迎关注,收藏,转发,分享。

后期关于项目知识,也会更新在微信公众号“记录世界 from antonio”,欢迎关注

最后

以上就是超帅帆布鞋为你收集整理的rtsp协议_SDP协议分析的全部内容,希望文章能够帮你解决rtsp协议_SDP协议分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部