【版权申明】转载请附上出处链接
关于RTP的SDP文件
SDP文件的介绍
即SDP(Session Describe Protocol),会话描述协议。用于在媒体会话中传递媒体流信息,并允许会话描述的接收者去参与会话。它定义了会话描述的统一格式,但并不定义多播地址的分配和SDP消息的传输,也不支持媒体编码方案的协商,这些功能均由下层传送协议完成。
SDP所提供的信息
- 会话的名称与目的
- 会话存活时间
- 包含在会话中的媒体信息,包括:
媒体类型(video、audio、、、)
传输协议(RTP、UDP、IP、、、)
流媒体格式(H264、H265、mp3、、、)
单播/多播的地址和端口 - 为接收媒体而需的信息(addresses, ports, formats and so on)
- 使用的带宽信息
- 可信赖的接洽信息(Contact information)
下面是一个常见的SDP文件内容:
m=video 5004 RTP/AVP 96
a=rtpmap:96 H264
a=framerate:24
c=IN IP4 192.168.3.34
SDP文件的语法:
SDP会话描述由多行[type]=[value]组成。
其中[type]是一个字符,[value]是一个字符串,其格式视[type]而定。
整个协议区分大小写,“=”两侧不允许有空格。
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)
z=(time zone adjustments)
k=(encryption key)
a=(zero or more session attributelines)
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)
SDP的各个字段描述:
- v=(protocol version)
SDP的版本号,不包括次版本号。
v=0
- o=(owner/creator and session identifier)
对会话的发起者进行了描述。
o=<用户名> <会话版本> <网络类型><地址类型> <地址>
o=<username> <sessionid> <version> <network type> <address type> <address>
<username>是用户的登录名。如果主机不支持<username>,则为 ”-”。注意:<username>不能含空格。
<session id>:是一个数字串。在整个会话中,必须是唯一的。为了确保其唯一,建议使用NTP(Network Time Protocol)timestamp。
<version>:该会话公告的版本,供公告代理服务器检测同一会话的若干个公告哪个是最新公告。基本要求是会话数据修改后该版本值递增,建议用NTP时戳。
<networktype>:网络类型,一般为”IN”,表示”internet”
<address type>:地址类型,一般为IP4
<address>:地址
- s=(session name)
会话名,在整个会话中有且只有一个”s=”。
s=<sessionname>
- c=(connection information - notrequired if included in all media)
表示媒体连接信息
一个会话声明中,会话级描述中必须有”c=”项或者在每个媒体级描述中有一个”c=”项。可能在会话级描述和每个媒体级描述中都有”c=”项。
c=<networktype> <address type> <connection address>
<network type>:网络类型,一般为”IN”,表示”internet”
<address type>:地址类型,一般为IP4。
<connection address>:应用程序必须处理域名和ip地址两种情形。
单播时,为域名或ip地址,推荐使用域名;
多播时,为ip地址,且ip后面必须有TTL(取值范围是0-255),地址和TTL决定了多播包被传播的范围。
例如: c=IN IP4 224.2.1.1/127
分层编码方案是一个数据流被分为多层,接受者能够通过申请不同层的流选择流的质量(包括带宽)如下:
<base multicastaddress>/<ttl>/<number of addresses>
如果没有给定,则默认为1
即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=(bandwidth information)
描述了建议的带宽,单位kilobits per second。
b=<modifier>:<bandwidth-value>
<modifier>:包括两种CT和AS。
CT:ConferenceTotal,总带宽。
AS:Application-SpecificMaximum,单个媒体带宽的最大值。
扩展机制:以”X-”开始。建议modifier越短越好。例:
b=X-YZ:128
- t=(time the session is active)
描述了会话的开始时间和结束时间。
t=<start time> <stop time>
<start time> 和<stop time> 为NTP时间,单位是秒。
假如<stop time>为零表示过了<start time>时间后会话一直持续。
当<start time> 和<stoptime>均为零时表示持久会话。
建议<start time> 和<stoptime>不要设为0。因为不知道此会话的开始和结束时间,增加了调度(scheduling)的难度。
- m=(media name and transport address)
媒体描述,以”m=”开始到下一个”m=”结束。
m=<media> <port> <transport> <fmt list>
<media>:表示媒体类型。
有"audio", “video”,“application”(例白板信息), “data”(不向用户显示的数据) 和"control"(描述额外的控制通道)。
<port>:媒体流发往传输层的端口。
取决于c=行规定的网络类型和接下来的传送层协议:对UDP为1024-65535;对于RTP为偶数。当分层编码流被发送到一个单播地址时,需要列出多个端口。方式如下:
m=<media><port>/<number of ports> <transport> <fmt list>
<transport>:传输协议,与c=行的地址类型有关。
两种: RTP/AVP,表示RealtimeTransport Protocol using the Audio/Video profile carried over UDP;UDP。
、:媒体格式。
对于音频和视频就是在RTP Audio/Video Profile定义的负载类型(payload type)。但第一个为缺省值,分为静态绑定和动态绑定:静态绑定即媒体编码方式与RTP负载类型有确定的一一对应关系,动态绑定即媒体编码方式(如时钟频率,音频信道数等)没有完全确定,需要进一步的属性说明(用rtpmap)。分别举例如下,静态绑定的例子:u_law的PCM编码单信道Audio,采样率8KHZ。在RTPAudio/Video profile中对应的payload type为0。即:
m=audio49232 RTP/AVP 0
动态绑定的例子:16位线形编码,采样率为16KHZ,假如我们希望动态RTP/AVP 类型98表示此此流,写法如下:
m=video49232 RTP/AVP 98
a=rtpmap:98 L16/16000/2
- a=(zero or more media attributelines)
a=<TYPE>:<VALUES>
附加信息,常见的附件信息如下:
- rtpmap
对于音频流,<编码参数>说明了音频的通道数。通道数默认缺省值为1。
对于视频流,现阶段没有<编码参数>。
a=rtpmap:<payload type><encoding name>/<clock rate>[/<encodingparameters>]
<payload type> 负载类型
<encoding name> 编码名
<clock rate> 时钟速率
<encodingparameters> 编码参数
- framerate
帧速率
a=framerate:<帧速率>