SDP解析

SDP: Session Description Protocol(会话描述协议)
(RFC2327)
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)

2. 协议
Session description //格式及举例
v=   (protocol version) //v=0
       o=   (owner/creator and session identifier). //o=<用户名><会话id><版本><网络类
//型><地址类型><地址>
//o=sname 1234567890 0987654321 IN
//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<[email]wang@zte.com[/email]>
       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>

3. SDP在IP电话中的使用
SDP用于构建INVITE和200 OK响应消息的消息体,供主\被叫用户交换媒体信息.
1. 媒体流的配置
1) 主被叫的媒体描述必须完全对应:主被叫的第n个媒体流(“m=”)对应,都包含”a=rtpmap”.这样的目的是易于适应静态净荷类型到动态净荷类型的转换.
2) 如被叫不想接收主叫提出的某个媒体流则在响应中设置该媒体流的端口号为0.并且,必须返回对应的媒体流行.
2. 单播SDP值的设定
1) 对于只发媒体流,端口号无意义,应设为0.
2) 每个媒体流的净载荷类型例表应传送两个信息:能接受/发送的编译码,和用以标识这些编译码的RTP净载荷类型号.
3) 如对于某一媒体流,主/被叫没有公共的媒体格式,被叫仍然要求返回媒体流的”m=”行,端口好为0,同时,不列净载荷类型.
4) 如果所有媒体流均无公共的媒体格式,则被叫回送400响应(坏请求),并加入304警告头字段(无媒体类型)
3. 多播操作
1) 接受和发送的多播地址是相同的
2) 被叫不允许改变媒体流的只发,只收,或收/发特性
3) 如果被叫不支持多播,则回送400响应和330警告(多播不可用)
4. 延时媒体流
由于主叫可能实际上是一个和其他协议(如H.323)互同的协议的网关,与S其互同的协议要求呼叫建立后进行媒体协商.这样,主叫可以先发不带SDP的INVITE,呼叫建立后可以通过ACK或重新发一个INVITE请求修改被叫的会话描述(SDP).
5. 媒体流保持
如果要求对方进入HOLD,即暂时停止发送一个或多个媒体流,这可以用Re-INVITE,其会话描述和原来的请求或响应中的描述相同,只是,”c=”行中的保持媒体流的地址置为”0.0.0.0”,还有就是Re_INVITE中的Cseq得递增.
6. 对应于SIP中有3个实体字段:
1) Content-Type: 指明消息体类型,有两种:
i. Application/sdp:表示是SDP会话描述
ii. Text/html:表示是普通文本或HTML格式的描述
2) Content-Encoding:补充说明消息体类型,使用户可以采用压缩编码编辑消息体
3) Content-Length:给出消息体的字节数
7. SDP各type的详细解释:
协议版本 v = SDP版本目前为0,没有子版本
会话源 o = <用户名>用户在发起主机上登录名,如果主机不支持用户标识的概念,则为”-”
<会话id>一般为数字串,其分配由创建工具决定,建议用网络时间协议(NTP)时
戳,以确保唯一性.
<版本>该会话公告的版本,供公告代理服务器检测同一会话的若干个公告哪个
是最新公告.基本要求是会话数据修改后该版本值递增,建议用NTP时戳
<网络类型>为文本串”IN”
<地址类型>”IP4”(可为域名或点分十进制)/”IP6”(域名或压缩文本地址形式)
<地址>
会话名 s= ISO 10646字符表示的会话名
会话信息     v= ISO 10646字符表示的会话信息
URI      u= 能提供会议进一步信息的URI地址
E妹地址     e= 给出会议负责人的联系信息,他不一定是创建会议公告的人
电话号码     p= 给出会议负责人的联系信息,他不一定是创建会议公告的人(国际通用形式)
连接数据     c=媒体连接数据,会话级为媒体级的摸认值
带宽      b= 给出会话或媒体所用带宽,单位为kbit/s.修饰语:CT(会议总带宽,表示所有
地点所有媒体的总带宽),AS(应用特定最大带宽,表示一个地点单一媒体带宽)
时间描述     t= 见上
     r= 见上
时区调整     z= 见上
加密密钥      k=已定义的方法有
          k=clear:<加密密钥>密钥没有变换
k=base64:<编码密钥>已编码,因为它含有SDP禁用的字符
k=uri:<获得密钥的URI>
k=prompt。SDP没有提供密钥但该会话或媒体流是要求加密的。
属性      a=一个m=行可有多个a=行,SDP建议扩展如下:(具体见[1].Page419)
会话级: a=cat:<类别>//给出点分层次式会话分类号,供接收方筛选会话
a=keywds:<关键词>//供接收方筛选会话
a=tool:<工具名和版本号>//创建会话描述的工具名和版本号
a=recvonly/sendrecv/sendonly//收发模式
a=type:<会议类型>//有:广播,聚会,主席主持,测试,H.323
a=charset:<字符集>//显示会话名和信息数据的字符集
a=sdplang:<语言标记>//描述所有语言
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
a=framerate:<帧速率>//单位:帧/秒
a=quality:<质量>//视频的建议质量(10/5/0)
a=fmtp:<格式>< 格式特定参数>//定义指定格式的附加参数
媒体级:a=ptime:<分组时间>//媒体分组的时长(单位:秒)
a=recvonly/sendrecv/sendonly//收发模式
a=orient:<白板方向>//指明白板在屏莫上的方向
a=sdplang:<语言标记>//描述所有语言
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
媒体描述        m= <媒体>有5种类型:音频/视频/应用(如白板信息)/数据(不向用户显示的)/控制
<端口>媒体流发往传输层的端口。取决于c=行规定的网络类型和接下来的传
送层协议:对UDP为1024-65535;对分层编码应用(c=行没有多播地址),
要给出多播端口数,如:m=video 49170/2 RTP/AVP 31(表示:端口49170
和49171为第一对RTP/RTCP端口,49172和49173为第二对的端口)。
<传送层协议>与c=行的地址类型有关。对大多的媒体在RTP/UDP上传送,定
义2种:RTP/AVP:IETF RTP协议,音/视频应用文档。在UDP上传诵。
Udp:UDP协议。
<格式列表>对音/视频,就是音/视频应用文档中规定媒体净荷类型。列表中都
有可能用,但第一个为缺省值,分为静态绑定和动态绑定:静态绑定即使媒体编码方式有净荷类型号完全确定,动态绑定则媒体编码方式
如时钟频率,音频信道数等)没有完全确定,需要进一步的属性说明。分别举例如下:
Alaw的PCM编码单信道Audio,其净荷类型号为8,把它发往UDP端口49232,则:m=audio 49232 RTP/AVP 8
16bit线性编码,双声道立体声,抽样速率16kHz,其动态净荷类型号98,则:m=audio 49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2
说明:1)a=rtpmap:<净荷类型号><编码名>/<时钟速率>[/<编码参数>]
       对音频,编码参数为音频信道数;对视频没有定义
2)SDP允许rtpmap规定实验性编码格式,但编码名必须以X-起,
表示此格式还没正式登记。

4. SDP Grammar
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

常见的如下:

a=rtpmap:103 ISAC/16000
a=rtpmap:102 iLBC/8000
a=rtpmap:3 GSM/8000
a=rtpmap:106 telephone-event/8000
a=rtpmap:13 CN/8000
a=rtpmap:117 red/8000
a=rtpmap:18 G729a/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:2 G726-32/8000
a=rtpmap:4 G723/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:96 G726-40/8000
a=rtpmap:97 G726-24/8000
a=rtpmap:98 G726-16/8000
a=rtpmap:100 NSE/8000
a=rtpmap:101 telephone-event/8000
a=rtpmap:0 pcmu/8000
a=rtpmap:8 pcma/8000
a=rtpmap:3 gsm/8000
a=rtpmap:18 G729/8000
a=rtpmap:98 iLBC/8000
a=rtpmap:97 speex/8000
a=rtpmap:101 telephone-event/8000

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SDP(Session Description Protocol)是一种用于描述多媒体会话的协议。它可以用于描述会话参数,如媒体类型、编解码器、传输协议、网络地址等。在 VoIP 和视频会议等实时通信领域中,SDP 被广泛使用。 以下是使用 C 语言解析 SDP 协议的基本步骤: 1. 读取 SDP 协议文本:首先从文件或网络中读取 SDP 协议文本,保存在字符串中。 2. 解析 SDP 协议头部:使用 strtok 函数将文本按行分割,并解析 SDP 协议头部。头部信息包括会话名称、会话描述、会话连接信息等。 3. 解析媒体描述:使用 strtok 函数将文本按行分割,并解析媒体描述信息。媒体描述信息包括媒体类型、传输协议、端口号、编解码器等。 4. 解析媒体格式:使用 strtok 函数将媒体格式描述按空格分割,并解析每个媒体格式。媒体格式包括编码名称、采样率、通道数等。 5. 解析媒体连接信息:使用 strtok 函数将媒体连接信息描述按空格分割,并解析每个连接信息。连接信息包括网络类型、地址类型、连接地址等。 6. 将解析结果保存到数据结构中:将解析出的信息保存到数据结构中,以便后续使用。 7. 释放资源:释放分配的内存空间,关闭文件或网络连接。 需要注意的是,SDP 协议的解析涉及到字符串处理、正则表达式匹配等操作,需要熟练掌握相关知识。此外,SDP 协议版本不同,解析的方式也可能有所差异。因此,在实际应用中需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值