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
(落鹤生)
|