下面来看一个例子。
v=0
o=jdoe 2890844526 2890842807 IN IP4 10.47.16.5
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.example.com/seminars/sdp.pdf
e=j.doe@example.com (Jane Doe)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 49170 RTP/AVP 0
m=video 51372 RTP/AVP 99
a=rtpmap:99 h263-1998/90000
下面对行添加上注释:
v=0 是版本号,一般都是0版本,没有次版本号。
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
这个是媒体源的介绍:
username 是登录名,如果不支持登录名,可以用 - 替代,这边登录名不能有空格
sess-id 是一串数字字符串,是该会话的唯一标识,这个创建可以是流的创建者任意创建,不过建议加上时间戳以保证数据的唯一性。
sess-version 这个是一个对会话描述的数字。这个数字也是流的创建者自行创建,不过这个数字要根据会话的修改不停增加,该数字串也推荐加上时间戳。
nettype 网络的类型,上该样例中用到IN类型
addrtype 地址类型,本身定义了 IP4 和 IP6。 也可能定义其他的类型。
unicast-address 单播地址是根据 addrtype填写的一个主机地址, IP4 给出主机的域名,如果域名不能用,就给出对应的是以点分离的4个十进值数,对IP6也是域名优先,如果域名不行,再死IP6的地址描述。
s=<session name>
有且必须一个, 是文本显示。
i=<session description>
每个会话至多有一个该会话描述,每个单独的流至多有一个描述。可选。
u=<uri>
就像 wwww 服务一样,对资源的一个唯一路径描述。可选。之多一个。
e=<email-address>
p=<phone-number>
这两个字段指明维护会话人员的联系方式,最新版本不是必须的,以前的版本可能必须有一个邮箱或者联系电话 两者之一。
p=+86 617 555-6011 电话必须添加区域代码。比如这里 +86.
e=Jane Doe <j.doe@example.com> 两种都可以
e=j.doe@example.com (Jane Doe) 建议下面这种,兼容性更强
c=<nettype> <addrtype> <connection-address>
包含链接信息:
nettype 网络类型, IN 代表英特网,未来可能定义更多类型
addrtype 地址类型, 定义了 IP4 和 IP6 ,未来可能定义更多类型
connection-address 链接地址
可能后面还会加一些字段,这个根据 addrtype 绝对。
如果多播的话,ip地址就要填写多播地址,多播地址后面需要填写 0到255的 数据包存活值[TTL]。尽管TTL必须设置,但是并不建议用这个来做多播的流量控制。IPv6不使用TTL限定多播。多播格式如下:
c=IN IP4 224.2.36.42/127
<base multicast address>[/<ttl>]/<number of addresses>
可以有多个 c= 参数,如:
IPv4
c=IN IP4 224.2.1.1/127
c=IN IP4 224.2.1.2/127
c=IN IP4 224.2.1.3/127
IPv6
c=IN IP6 FF15::101/3
<=等价=>
c=IN IP6 FF15::101
c=IN IP6 FF15::102
c=IN IP6 FF15::103
b=<bwtype>:<bandwidth>
可选,指定构建 该流或者会话 的建议带宽。bwtype是bandwidth的数字或者字母修饰。
如果多路流,"b=CT:..."来给出总宽带建议带宽。
"b=AS:..." 指应用程序指定带宽。
可以使用 X- 来定义流类型的名字,不推荐。
b=X-YZ:128
t=<start-time> <stop-time>
如果会话是不定期的发生,该行会有多个,如果会话时间有规律,可以加上下面介绍的 r= 来减少 t= 的重复行。
这个时间戳是 NTP 时间,也就是 1900 年以来的秒数。64位存储,该值在2036年结束,后面怎么定义,还在讨论。
stop-time 为0 就表示不会停止,
一般来说会话在 start-time 后才开始建立,我们如果 start-time 设置为0, 会话那就可以随时都可以建立了。
当然,协议是不建议创建永久会话的。
r=<repeat interval> <active duration> <offsets from start-time>
重复时间,这个是对t= 的优化,使用方法是接在 t= 后面,如下设置未来3个月每周三10点每周四11点播放一个小时:
t=3034423619 3042462419 #第一个星期三的时间戳
r=604800 3600 0 90000 # 播放周期为一个星期 播放时间为一小时 第一个重复播放时间偏移为0s 第二个重复播放时间偏移为25*3600s
可以使用单位:
d - days (86400 seconds)
h - hours (3600 seconds)
m - minutes (60 seconds)
s - seconds (allowed for completeness)
改为:
r=7d 1h 0 25h #间隔7天 播放1小时 第一个播放偏移为0 第二个播放偏移为25h
这样就更加直观了,注意没有年和月的单位。
z=<adjustment time> <offset> <adjustment time> <offset> ....
这个是为了解决有的区域采取夏令营时间调整问题,我们在上世纪九十年代好像使用过,不过后面我们电力充足就不在采用了。
k=<method>
k=<method>:<encryption key>
如果是加密通道传输的,可以通过这个来传递密码,不过不推荐使用这种方式,现在可以通过新的方式来交换密匙。
k=prompt 无密码
k=uri:<URI to obtain key> 密匙获取url
k=base64:<encoded encryption key> base64加密的密匙
k=clear:<encryption key> 传递裸露的密匙,一般还是使用 base64 做一次编码。
a=<attribute>
a=<attribute>:<value>
a= 是对sdp的属性扩展,a= 可以在会话中定义扩展属性,也可以在流中定义扩展属性,可以有任意数量的 a= 行。
a= 虽然也是文本行,但是必须是 ISO-10646/UTF-8 的 US-ASCII。这个和其他文本行可能要受 charset 影响不一样。
a= 必须在 IANA 中定义,如果没有定义,会被解释器忽略。
m=<media> <port> <proto> <fmt> ...
media 流的类型有, "audio", "video", "text", "application" 和"message"。以后可以扩展新的类型。
port 这个是 c= 中的地址中的端口,在 proto 中定义传输数据的协议,如果流需要用到其他端口,我们可以其他属性中定义,比如我们rtcp协议用到 a=rtcp: 来定义。
如果组播的话,可以使用:
m=<media> <port>/<number of ports> <proto> <fmt> ...
例如:
c=IN IP4 224.2.1.1/127/2
m=video 49170/2 RTP/AVP 31
proto 目前有 udp, RTP/AVP, RTP/SAVP 三种,以后可能会定义其他协议。
参考