1.概述
SDP也是MMUSIC工作组的一个产品,在MBONE内容中用得很多。其目的就是在媒体会话中,传递媒体流信息,允许会话描述的接收者去参与会话。SDP基本上在internet上工作。他定义了会话画描述的统一格式,但并不定义多播地址的分配和SDP消息的传输,也不支持媒体编码方案的协商,这些功能均由下层传送协议完成.典型的会话传送协议包括:SAP(Session Announcement Protocol 会话公告协议),SIP,RTSP,HTTP,和使用MIME的E-Mail.(注意:对SAP只能包含一个会话描述,其它会话传诵协议的SDP可包含多个绘画描述)

SDP包括以下一些方面:
1)会话的名称和目的
2)会话存活时间
3)包含在会话中的媒体信息,包括:
    媒体类型(video, audio, etc)
    传输协议(RTP/UDP/IP, H.320, etc)
    媒体格式(H.261 video, MPEG video, etc)
    多播或远端(单播)地址和端口
4)为接收媒体而需的信息(addresses, ports, formats and so on)
5)使用的带宽信息
6)可信赖的接洽信息(Contact information)
7)等。。。

2.协议:
Session description                 //格式及举例
v=  (protocol version)              //v=0
o=  (owner/creator and session identifier).  
                                                                        //o=<用户名><会话id><版本><网络类型><地址类型><地址>
                                                                //o=sname 1234567890 0987654321 I IP4 126.15.64.3
s=  (session name)                  //会话名
i=* (session information)           //会话信息
u=* (URI of description)            //u=http://www.zte.com.cn/staff/sdp.ps
e=* (email address)                 //e=zte@isi.edu(general text如:王生)
                                    //或e=Mr. Wang<wang@zte.com>
p=* (phone number)                  //p=+86-0755-26773000-7110(wang) or p=+1 617 253 6011
c=* (connection information -如已经包含在所有媒体中则该行不需要)
                                    //c=<网络类型><地址信息><连接地址>
                                    //多点会议包括TTL
                                    //连接地址: <base multicast address>/<ttl>/<number of addresses>
                                                                        //c=IN IP4 224.2.13.23/127
                                    //c=IN IP4 224.2.1.1/127/3
b=* (bandwidth information)         //b=<修改量(CT Conference Total
                                                                        //IAS Application-specific Max)>:<带宽值(kb/s)>
                                                                        //b=CT:120

One or more time descriptions (see below)
z=* (time zone adjustments)         //时区调整
k=* (encryption key)                //k=<方法>:<密钥>或k=<方法>
a=* (zero or more session attribute lines)    
                                                                        //a=<属性>  或a=<属性>:<值>
                                                                       
Zero or more media descriptions (see below)    
各行严格按顺序,其中:
时间描述:
t=  (time the session is active)    //<开始时间><结束时间>,单位秒,十进制NTP
                                                                        //t=2873397468 2873404969
r=* (zero or more repeat times)     //<重复时间><活动持续时间以开始时刻为参考的偏移列表>单位秒
                                                                        //r=604800 3666 90000 或写成r=7d 1h 0 25h

媒体描述:
m=  (media name and transport address)   
                                                                        //m=<媒体><端口><传送><格式列表>
                                    //m=audio 49170 RTP/AVP 0 3
                                    //协议为RTP,剖面为AVP
                                    //参考rtp-parameters.txt
i=* (media title)                           //媒体称呼
c=* (connection information – 如已经包含在会话级描述则为可选)
b=* (bandwidth information)         //同c
k=* (encryption key)                //会话级为摸认值,同c
a=* (zero or more media attribute lines)             
                                                                        //两种形式:(也同c)(见后说明)
                                    //a=<attribute>如:
                                    //     a=recvonly
                                    //a=<attribute>:<value>
注:v,o,s,t,m为必须的,其他项为可选。
         如果SDP语法分析器不能识别某一类型(Type),则整个描述丢失;
         如果”a=”的某属性值不理解,则予以丢失
         整个协议区分大小写
         “=”两侧不允许有空格
         会话级的描述就是媒体级描述的缺省值
         所有均格式为<type>=<value>
        An example SDP description is:

v=0
        o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
        s=SDP Seminar
        i=A Seminar on the session description protocol
        u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
        e=mjh@isi.edu (Mark Handley)
        c=IN IP4 224.2.17.12/127
        t=2873397496 2873404696
        a=recvonly
        m=audio 49170 RTP/AVP 0
        m=video 51372 RTP/AVP 31
        m=application 32416 udp wb
        a=orient:portrait
//////////////////////////////////////////////////////////   
Protocol Version
      v=<version>       
//  v=0
      v:该SDP协议的版本号

Origin
   o=<username> <session id> <version> <network type> <address type><address>
// o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
   o:标示了该会话的全局唯一性
   <username>:用于登陆创建主机的ID,若该主机不支持侧应为"-",该字段内不能包含空格
   <session id>:用于唯一的标示该会话描述,建议采用Network Time Protocol (NTP)的时间戳来保证唯一性
   <version>:该公告的版本号,用于区别同个会话内的多个公告
   <network type>:网络类型 IN(Internet)
   <address type>:地址类型 IP4/IP6
   <address>:该会话创建者的地址

Session Name
   s=<session name>
// s=SDP Seminar
   s:会话名,每个会话仅有一个

Session and Media Information
   i=<session description>
// i=A Seminar on the session description protocol
   i:会话信息,每个会话至多有一个,每个媒体至多有一个,常用于标识一个会话内多个同类型的媒体流。
  
URI
   u=<URI>
// u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
   u:该会话的URI(Universal Resource Identifier)地址

Email Address and Phone Number
   e=<email address>
   p=<phone number>
   e/p:添加会话负责人的私人信息
//   EMAIL地址格式:e=mjh@isi.edu (Mark Handley) or e=Mark Handley <mjh@isi.edu>
//   电话号码的格式:p=+44-171-380-7777 or p=+1 617 253 6011

Connection Data
   c=<network type> <address type> <connection address>
// c=IN IP4 224.2.17.12/127
   c:连接数据,每个会话公告应包含一个连接描述在每个媒体描述中,
   单播的时候通过该IP地址发送,多播时通过TTL与IP地址共同决定那些包将被发送
   <connection address>:IP addr/TTL[/IP NUMS] example:192.168.1.2/127[/2],单播[多播]
   IP address together with TTL define which muticast pakets will be
   sent in this conference.
  
Bandwidth
   b=<modifier>:<bandwidth-value>
//....
     b:提供此次会话的带宽
     <modifier>:修改量
     CT Conference Total:固有的最大带宽值与多播骨干网的TTL值或一个特指的多播范围区相关连
     如果某一会话或媒体的带宽与最大带宽值不同,则通过该参数提供一个最大的限定值。该参数指定多个媒体总和的值。
     AS Application-Specific Maximum:该参数指定一个特殊应用的带宽,指定单一媒体的值。
  Extension Mechanism:X-..扩展的带宽定义

Times, Repeat Times and Time Zones
   t=<start time>  <stop time>
// t=2873397496 2873404696
     t:描述该会议的开始和结束时间,如果该会议在多个不规则的时间间隔内激活,可以使用多行t:描述
     如果时间间隔为规则的,可以使用"r="重复定义。
     <start time>:开始时间,以秒表示的NTP时间,开始结束时间都为0时被认为时永久的会议
     <stop time>:结束时间,以秒表示的NTP时间,结束时间为0时,该会议直到过了开始时间才开始
    
     r=<repeat interval> <active duration> <list of offsets from start-time>
     <repeat interval>:重复间隔
     <active duration>:持续时间
     <list of offsets from start-time>:相对开始时间的偏移
    
     z=<adjustment time> <offset> <adjustment time> <offset> ....
// z=2882844526 -1h 2898848070 0
     z:<调整时间> <偏移>

Encryption Keys
   k=<method>
   k=<method>:<encryption key>
  
   k=clear:<encryption key> //<加密密钥>密钥没有变换
   k=base64:<encoded encryption key> //经base64加密的密钥,因为它含有SDP禁用的字符
   k=uri:<URI to obtain key> //URI携带密钥
   k=prompt //不采用密码,SDP没有提供密钥但该会话或媒体流是要求加密的。
  
Attributes  //该描述常被用于扩展SDP协议,分成“会话级”和“媒体级”两种属性
   a=<attribute>
   a=<attribute>:<value>
// a=recvonly
// a=orient:portrait
   a:媒体描述具备任意个“媒体级”的属性,用于附加表示媒体流的信息
   属性也可以被加在第一个媒体域,这些“会话级”属性用于附带表示会议的信息
   属性域一般有两种格式:
   <attribute>:性质属性,描述当前会话的性质
   <value>:
  
Media Announcements
   m=<media> <port> <transport> <fmt list>
   每个会话可以包含许多的媒体描述,
   <media>:媒体类型,包括audio/video/application/data/control,
   (音频/视频/应用[如:白板信息]/数据[不要向用户显示]/控制)
   当有新的媒体类型出项时,这些值将被扩展。
   <port>:端口类型,该值的确定取决于对应的"c="域中指定的网络
   和在第三个子项中定义的传输协议,UDP端口只能在1024-65535之间
   RTP端口可以是任意有效的范围,RTCP端口定义为大于对应RTP端口的奇数
   当分级的多个媒体流编码通过单一的地址发送时,我们必须指定多个端口用于传输。
   采用跟"c="域中定义多个IP地址的格式一样,
   m=<media> <port>/<number of ports> <transport> <fmt list>
   example:  m=video 49170/2 RTP/AVP 31
   定义了两对的RTP/RTCP端口,49170 19171和49172 49173
   <transport>:传输协议类型,该项的值依赖于"c="域中的网络类型
   IP4
   如果某个应用采用在UDP上使用单一组合了所
   有媒体格式和传输协议的模式传输,简单的方法是将传输协议指定为UDP,
   采用格式列表区别组合的协议,区别传输类型和媒体格式是必要的。
  
   <fmt list>:格式列表,对音频和视频应用,该值表示媒体的有效负荷类型
   一旦这个格式列表被限定,在这个会话过程中都将使用列表里面的有效负荷类型
   ,但第一个类型将被作为默认值。
   如果媒体流的传输模式不是RTP/UDP,格式将在附加的文件中进行定义。
   如果通过RTP传输,SDP可以提供静态和动态绑定的两种RTP编码有效负荷类型。
   静态绑定类型的类型值提供确定的有效负荷类型,动态绑定必须通过后续的选项
   来进一步的说明。
   例如:m=video 49232 RTP/AVP 0 //定义负荷类型为0的媒体流从49232端口发送
                m=video 49232 RTP/AVP 98
         a=rtpmap:98 L16/16000/2 //采用采样频率为16KHZ 16bit的立体声线性编码
        
     rtpmap属性对"m="描述的格式列表的负荷类型进行详细说明,
     通用的rtpmap属性的格式为:
     a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encoding parameters>]
     <payload type>
     <encoding name>:编码名,扩展的用X-开始
     <clock rate>:采样频率
     <encoding parameters>:对语音编码来说,该参数表示语音声道。
     对视频编码不提供该参数。
     RTP格式列表没提供对每个媒体包包括几个采样点进行说明,
     如果没有默认值,需要通过"ptime"说明。
    
     非RTP媒体采用MIME文本类型编码,如:m=application 32416 udp wb

Suggested Attributes
推荐的属性
   a=cat:<category>
   cat:描述离散分级的会话类型,使接受者通过该参数过率不想要的会话类型

a=keywds:<keywords>
   keywds:该参数辅助接收者根据关键字过虑会话,鉴别想要会话类型。
  
   a=tool:<name and version of tool>
   tool:该参数提供给SDP创建者名字和版本号。

a=ptime:<packet time>
   ptime:该参数提供一个以毫秒为单位的打包长度,媒体级属性
 
   a=recvonly
   a=sendrecv
   a=sendonly
     发送模式,会话级属性。
    
   a=orient:<whiteboard orientation>
   该参数指定白板应用中屏幕的方向性,
   允许值为`portrait',`landscape' and `seascape' (upside down landscape).

a=type:<conference type>
   该参数指定会议类型,
   允许值为:`broadcast', `meeting', `moderated', `test' and `H332'.
   broadcast会话默认为recvonly
   meeting默认sendrecv
  
   a=charset:<character set>
   该参数指定会话名和信息值的字符集
   a=charset:ISO-8859-1
  
   a=sdplang:<language tag>
   描述该会话的描述的语言

a=lang:<language tag> "session-level" and "media-level"
   SDP描述使用的语言,媒体的语言

a=framerate:<frame rate>
   该参数描述视频的最大帧数(frames/sec),允许(整数.小数)格式

a=quality:<quality>
   该参数用0-10的整数值描述建议的编码质量,
   对视频来说为了在帧速率和持续图像质量间指定一个非默认的平衡值
       10 - 最佳图像质量

5 - 无质量建议

0 - 最差图像质量

a=fmtp:<format> <format specific parameters>
   该属性值指定一个SDP不了解的特殊格式,该格式是媒体的格式的一种。 
   定义指定格式的附加参数  
3.语法
announcement =        proto-version
                         origin-field
                         session-name-field
                         information-field
                         uri-field
                         email-fields
                         phone-fields
                         connection-field
                         bandwidth-fields
                         time-fields
                         key-field
                         attribute-fields
                         media-descriptions

proto-version =       "v=" 1*DIGIT CRLF
                         ;this memo describes version 0
   origin-field =        "o=" username space
                         sess-id space sess-version space
                         nettype space addrtype space
                         addr CRLF
   session-name-field =  "s=" text CRLF
   information-field =   ["i=" text CRLF]
   uri-field =           ["u=" uri CRLF]
   email-fields =        *("e=" email-address CRLF)
   phone-fields =        *("p=" phone-number CRLF)
   connection-field =    ["c=" nettype space addrtype space
                         connection-address CRLF]
                         ;a connection field must be present
                         ;in every media description or at the
                         ;session-level
   bandwidth-fields =    *("b=" bwtype ":" bandwidth CRLF)
   time-fields =         1*( "t=" start-time space stop-time
                         *(CRLF repeat-fields) CRLF)
                         [zone-adjustments CRLF]
   repeat-fields =       "r=" repeat-interval space typed-time
                         1*(space typed-time)
   zone-adjustments =    time space ["-"] typed-time
                         *(space time space ["-"] typed-time)
   key-field =           ["k=" key-type CRLF]
   key-type =            "prompt" |
                         "clear:" key-data |
                         "base64:" key-data |
                         "uri:" uri
   key-data =            email-safe | "~" | "
   attribute-fields =    *("a=" attribute CRLF)
   media-descriptions =  *( media-field
                         information-field
                         *(connection-field)
                         bandwidth-fields
                         key-field
                         attribute-fields )
   media-field =         "m=" media space port ["/" integer]
                         space proto 1*(space fmt) CRLF
   media =               1*(alpha-numeric)
                         ;typically "audio", "video", "application"
                         ;or "data"
   fmt =                 1*(alpha-numeric)
                         ;typically an RTP payload type for audio
                         ;and video media
   proto =               1*(alpha-numeric)
                         ;typically "RTP/AVP" or "udp" for IP4
   port =                1*(DIGIT)
                         ;should in the range "1024" to "65535" inclusive
                         ;for UDP based media
   attribute =           (att-field ":" att-value) | att-field
   att-field =           1*(alpha-numeric)
   att-value =           byte-string
   sess-id =             1*(DIGIT)
                         ;should be unique for this originating username/host
   sess-version =        1*(DIGIT)
                         ;0 is a new session
   connection-address =  multicast-address
                         | addr
   multicast-address =   3*(decimal-uchar ".") decimal-uchar "/" ttl
                         [ "/" integer ]
                         ;multicast addresses may be in the range
                         ;224.0.0.0 to 239.255.255.255
   ttl =                 decimal-uchar
   start-time =          time | "0"
   stop-time =           time | "0"
   time =                POS-DIGIT 9*(DIGIT)
                         ;sufficient for 2 more centuries
   repeat-interval =     typed-time
   typed-time =          1*(DIGIT) [fixed-len-time-unit]
   fixed-len-time-unit = "d" | "h" | "m" | "s"
   bwtype =              1*(alpha-numeric)
   bandwidth =           1*(DIGIT)
   username =            safe
                         ;pretty wide definition, but doesn't include space
   email-address =       email | email "(" email-safe ")" |
                         email-safe "<" email ">"
   email =               ;defined in RFC822
   uri=                  ;defined in RFC1630
   phone-number =        phone | phone "(" email-safe ")" |
                         email-safe "<" phone ">"
   phone =               "+" POS-DIGIT 1*(space | "-" | DIGIT)
                         ;there must be a space or hyphen between the
                         ;international code and the rest of the number.
   nettype =             "IN"
                         ;list to be extended
   addrtype =            "IP4" | "IP6"
                         ;list to be extended
   addr =                FQDN | unicast-address
   FQDN =                4*(alpha-numeric|"-"|".")
                         ;fully qualified domain name as specified in RFC1035
   unicast-address =     IP4-address | IP6-address
   IP4-address =         b1 "." decimal-uchar "." decimal-uchar "." b4
   b1 =                  decimal-uchar
                         ;less than "224"; not "0" or "127"
   b4 =                  decimal-uchar
                         ;not "0"
   IP6-address =         ;to be defined
   text =                byte-string
                         ;default is to interpret this as IS0-10646 UTF8
                         ;ISO 8859-1 requires a "a=charset:ISO-8859-1"
                         ;session-level attribute to be used
   byte-string =         1*(0x01..0x09|0x0b|0x0c|0x0e..0xff)
                         ;any byte except NUL, CR or LF
   decimal-uchar =       DIGIT
                         | POS-DIGIT DIGIT
                         | ("1" 2*(DIGIT))
                         | ("2" ("0"|"1"|"2"|"3"|"4") DIGIT)
                         | ("2" "5" ("0"|"1"|"2"|"3"|"4"|"5"))
   integer =             POS-DIGIT *(DIGIT)
   alpha-numeric =       ALPHA | DIGIT
   DIGIT =               "0" | POS-DIGIT
   POS-DIGIT =           "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
   ALPHA =               "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|
                         "l"|"m"|"n"|"o "|"p"|"q"|"r"|"s"|"t"|"u"|"v"|
                         "w"|"x"|"y"|"z"|"A"|"B"|"C "|"D"|"E"|"F"|"G"|
                         "H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|" Q"|"R"|
                         "S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z"
   email-safe =          safe | space | tab
   safe =                alpha-numeric |
                         "'" | "'" | "-" | "." | "/" | ":" | "?" | """ |
                         "#" | "$" | "&" | "*" | ";" | "=" | "@" | "[" |
                         "]" | "^" | "_" | "`" | "{" | "|" | "}" | "+" |
                         "~" | "
   space =               %d32
   tab =                 %d9
   CRLF =                %d13.10

(落鹤生)

 
 
文章转载自:罗索实验室 [http://www.rosoo.net/a/200912/8112.html]

SDP简要解析的更多相关文章

  1. 简要解析XMPP框架及iOS-Objective-C的使用

    前言:这两天看了XMPP框架,查阅了一些资料,写下这篇文章记录一下学习笔记 一.简要解析XMPP核心部分 XMPP框架分为两个部分 1.核心部分 2.扩展部分 扩展部分主要讲好友列表(roster). ...

  2. SQL查询多条不重复记录值简要解析【转载】

    转载http://hi.baidu.com/my_favourate/item/3716b0cbe125f312505058eb SQL查询多条不重复记录值简要解析2008-02-28 11:36 以 ...

  3. java与C++之间进行SOCKET通讯要点简要解析

    原文链接: http://blog.csdn.net/hslinux/article/details/6214594 java与C++之间进行SOCKET通讯要点简要解析 hslinux 0.篇外语 ...

  4. sdp内容解析

    sdp解释 http://datatracker.ietf.org/doc/draft-nandakumar-rtcweb-sdp/?include_text=1

  5. SIP SDP Profile-level-id解析

    转自:http://blog.csdn.net/wh8_2011/article/details/53558504 基于SIP协议的VOIP通信,该字段通常位于视频协商sdp报文中,如: video  ...

  6. NOIP 2018 提高组初赛试题 题目+答案+简要解析

    一.单项选择题(共 10  题,每题 2  分,共计 20  分: 每题有且仅有一个正确选项)       1. 下列四个不同进制的数中,与其它三项数值上不相等的是( ). A. (269) 16 B ...

  7. SDP 格式解析

    一.SDP协议介绍 SDP 完全是一种会话描述格式 ― 它不属于传输协议 ― 它只使用不同的适当的传输协议,包括会话通知协议(SAP).会话初始协议(SIP).实时流协议(RTSP).MIME 扩展协 ...

  8. volatile简要解析

    在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值 ...

  9. package.json字段简要解析

    name 必填 应用名称 version 必填 应用版本 description 选填 应用描述,多用于搜索,在npm search 时可以用到 keywords 选填 应用关键字,也多用于搜索 sc ...

随机推荐

  1. 特殊权限:SUID,SGID,Sticky

    特殊权限passwd:s SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者:    chmod u+s FILE    chmod u-s FILE        如果FIL ...

  2. 程序员求职之道(《程序员面试笔试宝典》)之求职有用网站及QQ群一览表

    技术学习网站 www.csdn.com www.iteye.com www.51cto.com http://www.cnblogs.com/ http://oj.leetcode.com/ http ...

  3. phpcms 去掉默认自动获取关键词、自动提取第一张图片?

    进入后台,内容--模型管理--管理模型,选择文章模型的字段管理,选择第13项内容--修改,然后把字段提示代码中的2个checked去掉就行了. <label><input name= ...

  4. HtmlHelper扩展 及 页面编码化

    Html.Encode 新建Action,命名为HtmlEncodeDemo 将含有特殊字符的值传递给View视图 <%= ViewData["script"] %> ...

  5. UGUI 快捷键创建UGUI组件

      使用NGUI的时候还有xxx快捷键创建, spirte,label,button等等. 在UGUI里面的时候好像是没有快捷键的. 不知道以后多久才能有这个功能.  在家里闲无聊的时候写了一个脚本, ...

  6. Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

    触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...

  7. 华为測试 字符串运用-password截取

    Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的password进行通信,比方像这些ABBA.ABA,A,123321,可是他们有时会在開始或结束时增加一些无关的字符以防止别国破解.比 ...

  8. 计划任务中使用NT AUTHORITY\SYSTEM用户和普通管理员用户有什么差别

    原文地址:http://www.ynufe.edu.cn/metc/Article/ShowArticle.asp?ArticleID=805 系统管理员会碰到这种问题,为什么在更改系统登录用户pas ...

  9. [转]Laravel 4之路由

    Laravel 4之路由 http://dingjiannan.com/2013/laravel-routing/ Laravel 4路由是一种支持RESTful的路由体系, 基于symfony2的R ...

  10. String和StringBuilder 的使用区别

    String 类有不可变性,每次执行操作时都会创建一个新的String对像,需要对该对象分配新的空间. StringBuilder 解决了对字符串重复修改过程中创建大量对象的问题.初始化一个Strin ...