转载自http://blog.csdn.net/zhangjikuan/article/details/27367437
SDP包括以下一些方面:
(1)会话的名称和目的
(2)会话存活时间
(3)包含在会话中的媒体信息,包括:
媒体类型(video,audio, etc)
传输协议(RTP/UDP/IP,H.320, etc)
媒体格式(H.261video, MPEG video, etc)
多播或远端(单播)地址和端口
(4)为接收媒体而需的信息(addresses, ports, formats and so on)
(5)使用的带宽信息
(6)可信赖的接洽信息(Contact information)
SDP会话描述由多行
SDP会话描述由一个会话级描述(session_level description)和多个媒体级描述(media_level description)组成。会话级(session_level)的作用域是整个会话。其位置是从’v=’行开始到第一个媒体描述为止。媒体级(media_level)描述是对单个的媒体流进行描述(例如传送单个音频或者视频的vlc sdp文件只有短短的几句话,从m=开始,这其实就是个媒体机描述),其位置是从’m=’行开始到下一个媒体描述为止。总之,除非媒体部分重载,会话级的值是各个媒体的缺省默认值(就是说媒体级描述其实也是一个会话级描述,只不过没写出来的会话级描述参数都用的缺省值)。
SDP的结构如下:
Sessiondescription
v= (protocol version)
o= (owner/creator and session identifier).
s= (session name)
i=* (session information)
u=* (URI of description)
e=* (email address)
p=* (phone number)
c=* (connection information - notrequired if included in all media)
b=* (bandwidth information)
One or more time descriptions (seebelow)
z=* (time zone adjustments)
k=* (encryption key)
a=* (zero or more session attributelines)
Zero or more media descriptions (seebelow)
Time description
t= (time the session is active)
r=* (zero or more repeat times)
Media description
m= (media name and transport address)
i=* (media title)
c=* (connection information - optionalif included at session-level)
b=* (bandwidth information)
k=* (encryption key)
a=* (zero or more media attributelines)
上面的有些行是必需有的,有些行是可选的。可选的行有*号标记。必需的是v,o,s,t,m(这是对于会话级描述和媒体及描述总体而言的,对于媒体级描述而言只有m=是必须的)。注意所有的描述项必须按照上面的顺序给出。
v=0
SDP的版本号,不包括次版本号。
o=
o=<用户名>
“o=”项对会话的发起者进行了描述。
:地址类型,一般为IP4
:地址
s=
会话名,在整个会话中有且只有一个”s=”。
c=
表示媒体连接信息。
一个会话声明中,会话级描述中必须有”c=”项或者在每个媒体级描述中有一个”c=”项。可能在会话级描述和每个媒体级描述中都有”c=”项。
:地址类型,一般为IP4。
c=IN IP4 224.2.1.1/127
分层编码方案是一个数据流被分为多层,接受者能够通过申请不同层的流选择流的质量(包括带宽)如下:
如果
c=INIP4 224.2.1.1/127/3
等价于:
c=IN IP4 224.2.1.1/127
c=IN IP4 224.2.1.2/127
c=IN IP4 224.2.1.3/127
b=
描述了建议的带宽,单位kilobits per second,可选。
扩展机制:
b=X-YZ:128
t=
描述了会话的开始时间和结束时间。
建议start time和stoptime不要设为0。因为不知道此会话的开始和结束时间,增加了调度(scheduling)的难度。
m=
一个会话描述包括几个媒体描述。一个媒体描述以”m=”开始到下一个”m=”结束。
m=
对于RTP,偶数端口被用来传输数据,奇数端口用来传输RTCP包。例:
m=video49170/2 RTP/AVP 31
端口49170和49171为第一对RTP/RTCP端口,49172和49173为第二对的端口。传输协议是RTP/AVP,媒体格式为31(媒体格式是rtp头中payload参数对应的)。
m=audio49232 RTP/AVP 0
动态绑定的例子:16位线形编码,采样率为16KHZ,假如我们希望动态RTP/AVP 类型98表示此此流,写法如下:
m=video49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2
a=rtpmap:
a=rtpmap:<负载类型><编码名>/<时钟速率>[/<编码参数>]
对于音频流,<编码参数>说明了音频的通道数。通道数默认缺省值为1。对于视频流,现阶段没有<编码参数>。
m=audio 49230 RTP/AVP 96 97 98 m=audio 8888 RTP/AVP 0 m=video 1234 RTP/AVP 96
a=rtpmap:96 L8/8000 a=rtpmap:0 pcma/8000/1 a=rtpmap:96 H264
a=rtpmap:97 L16/8000
a=rtpmap:98 L16/11025/2
在rtpmap中,实验性的编码方案也可以用。其格式名前一定为”X-”例:一种新的实验性的被称为GSMLPC的音频流,使用的动态负载类型为99。
m=video 49232 RTP/AVP 99
a=rtpmap:99 X-GSMLPC/8000
a=
a=framerate:<帧速率>//单位:帧/秒 1s播放几个rtp包 倒数为一个rtp包承载的数据播放的时间单位s
音频的话 a=framerate:50 1byte*8000hz*20ms=160B
则每个rtp包的音频数据量为160B 时间戳增值为160
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
注: 如果SDP语法分析器不能识别某一类型(Type),则整个描述丢失。
如果”a=”的某属性值不理解,则予以丢失此属性。
会话级的描述就是媒体级描述的缺省值(就是说媒体级描述其实也是一个会话级描述,只不过没写出来的会话级描述参数都用的缺省值)。
m=video 1234 RTP/AVP 96
a=rtpmap:96 H264
a=framerate:15
c=IN IP4 172.18.168.45
详细:http://blog.csdn.net/zhangjikuan/article/details/27378237
m=audio 8888 RTP/AVP 0
a=rtpmap:0 pcma/8000/1 这地方是a率压缩方式;pcmu就是u率型
a=framerate:25 8000/25=320Byte 每个rtp包的音频数据为320byte 时间戳增值为320
c=IN IP4 192.168.1.230
详细:http://blog.csdn.net/zhangjikuan/article/details/27379201
如果是同时播放音频和视频流只要把这两个媒体级会话合在一个sdp文件中就好了
v=0
o=HWPSS 3427743244 1084119141 IN IP4 127.0.0.1
s=test1.mp4
test1.mp4:媒体文件名
c=IN IP4 0.0.0.0
t=0 0
a=control:*
a=range:npt=0-44.000000
44.000000:mvhd原子:ntohl (movie_header->duration)/ ntohl(movie_header->time_scale)
m=video 0 RTP/AVP 96
96:track->payload_type 视频:96音频:97
a=control:trackID=101
101:轨道ID。 视频:101,102, 103 音频: 201,202, 203,204, 205
a=rtpmap:96 MP4V-ES/90000
90000:track->time_scale
a=fmtp:96 profile-level-id=2;config=000001b0020;
profile-level-id=2: mp4v的子原子esds中得来
config=000001b0020: mp4v的子原子esds中得来
m=audio 0 RTP/AVP 97
a=control:trackID=201
a=rtpmap:97 mpeg4-generic/24000/1
24000: track->time_scale
1:mp4a的子原子esds中得来的
a=fmtp:97 streamtype=5;profile-level-id=15; mode=AAC-hbr; config=1308; SizeLength=13; IndexLength=3;IndexDeltaLength=3; Profile=1;
config=1308:mp4a的子原子esds中得来的
streamtype=5; profile-level-id=15; mode=AAC-hbr:写死
SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1:写死
v=0
o=- 2545495921 1885424500 IN IP4 192.168.225.158
s=111
c=IN IP4 192.168.225.153
b=RR:0
t=0 0
m=video 5088RTP/AVP 96
b=AS:949
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4D4015;sprop-parameter-sets=Z01AFZZWCwSbCEiAAAH0AAAw1DBgAHP2AOg1cABQ,aO88gA==;packetization-mode=1
a=cliprect:0,0,576,352
a=framerate:25.
a=mpeg4-esid:201
a=x-envivio-verid:0002229D
m=audio 5090 RTP/AVP 97
b=AS:50
a=rtpmap:97 mpeg4-generic/24000/2
a=fmtp:97 profile-level-id=15; config=1310;streamtype=5; ObjectType=64; mode=AAC-hbr; SizeLength=13; IndexLength=3;IndexDeltaLength=3
a=mpeg4-esid:101
a=lang:eng
a=x-envivio-verid:0002229D
v=0
|
o=- 1702415089 4281335390 IN IP4 127.0.0.1
s=live
c=IN IP4 0.0.0.0
t=0 0
a=control:*
a=range:npt=0-
m=video 5088 RTP/AVP 96
b=AS:949
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=4D4015;sprop-parameter-sets=Z01AFZZWCwSbCEiAAAH0AAAw1DBgAHP2AOg1cABQ,aO88gA==;packetization-mode=1
a=cliprect:0,0,576,352
a=framerate:25.
a=mpeg4-esid:201
a=x-envivio-verid:0002229D
a=control:trackID=103
此媒体描述是与编码器的媒体描述是一样的。
m=audio 5090 RTP/AVP 97
b=AS:50
a=rtpmap:97 mpeg4-generic/24000/2
a=fmtp:97 profile-level-id=15; config=1310;streamtype=5; ObjectType=64; mode=AAC-hbr; SizeLength=13; IndexLength=3;IndexDeltaLength=3
a=mpeg4-esid:101
a=lang:eng
a=x-envivio-verid:0002229D
a=control:trackID=201
此媒体描述是与编码器的媒体描述是一样的。