免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1835 | 回复: 0
打印 上一主题 下一主题

SDP协议介绍 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 09:44 |只看该作者 |倒序浏览
SDP协议介绍
2007年07月12日 星期四 下午 04:44

一、SDP协议介绍

    SDP是会话描述协议的缩写,是描述流媒体初始化参数的格式,由IETF作为RFC 4566颁布。流媒体是指在传输过程中看到或听到的内容,SDP包通常包括以下信息:

(1)会话信息
     
        · 会话名和目的。
     
        · 会话活动时间。
     
        由于参与会话的资源是受限制的,因此包括以下附加信息是非常有用的。
     
        · 会话使用的带宽信息。
     
        · 会话负责人的联系信息。
     
(2)媒体信息
     
        · 媒体类型,例如视频和音频。
     
        · 传输协议,例如RTP/UDP/IP和H.320。
     
        · 媒体格式,例如H.261视频和MPEG视频。
     
        · 多播地址和媒体传输端口(IP多播会话)。
     
        · 用于联系地址的媒体和传输端口的远端地址(IP单播会话)。
     
        SDP描述由许多文本行组成,文本行的格式为<类型>=<值>,<类型>是一个字母,<值>是结构化的文本串,其格式依<类型>而定。

二、SDP协议格式

SDP格式:
       Session description
          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 - not required if included in all media)
          b=* (zero or more bandwidth information lines)
          One or more time descriptions ("t=" and "r=" lines, see below)
          z=* (time zone adjustments)
          k=* (encryption key)
          a=* (zero or more session attribute lines)
          Zero or more media descriptions

       Time description
          t=   (time the session is active)
          r=* (zero or more repeat times)

       Media description, if present
          m=   (media name and transport address)
          i=* (media title)
          c=* (connection information - optional if included at
               session-level)
          b=* (zero or more bandwidth information lines)
          k=* (encryption key)
          a=* (zero or more media attribute lines)

以上带"*"号的是可选的,其余的是必须的。一般顺序也按照上面的顺序来排列。

a=*是sdp协议扩展属性定义,除上面以外的,分解时其它的都可以扔掉。
a=charset属性指定协议使用的字符集。一般的是ISO-10646。

示例:
v=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
    其中:nettype是IN,代表internet,addrtype是IP4或IP6。unicast-address任务创建计算机的地址。
    整个这个属性,是唯一表示一个任务。


e=123@126.com 或 p=+1 616 555-6011
对于一个任务只能两者之中的一个,表示会议控制者的联系方式。邮件地址可以是[email]j.doe@example.com[/email] (Jane Doe)形式,括号里面的是描述联系人的名称,或者Jane Doe <[email]j.doe@example.com[/email]>,前面的是联系人的名称。


c=<nettype> <addrtype> <connection-address>
这个连接数据,可以是传话级别的连接数据,或者是单独一个媒体数据的连接数据。在是多播时,connection-address就该是一个多播组地址, 当是单播时,connection-address就该是一个单播地址。对于addrtype是IP4的情况下,connection-address不 仅包含IP地址,并且还要包含a time to live value(TTL 0-255),如:c=IN IP4 224.2.36.42/128,IP6没有这个TTL值。还允许象这样的<base multicast address>[/<ttl>]/<number of addresses>格式的connection-address。如:c=IN IP4 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=<bwtype>:<bandwidth> bwtype可以是CT或AS,CT方式是设置整个会议的带宽,AS是设置单个会话的带宽。缺省带宽是千比特每秒。
t=<start-time> <stop-time>,这个可以有行,指定多个不规则时间段,如果是规则的时间段,则r=属性可以使用。start-time和stop- time都遵从NTP(Network Time Protocol),是以秒为单位,自从1900以来的时间。要转换为UNIX时间,减去2208988800。如果stop-time设置为0,则会话 没有时间限制。如果start-time也设置为0,则会话被认为是永久的。


r=<repeat-interval> <active duration> <offsets from start-time>重复次数在时间表示里面可以如下表示:
       d - days (86400 seconds)
       h - hours (3600 seconds)
       m - minutes (60 seconds)
       s - seconds (allowed for completeness)
z=<adjustment time> <offset> <adjustment time> <offset> ....
k=<method>
k=<method>:<encryption key>
a=<attribute>
a=<attribute>:<value>
m=<media> <port> <proto> <fmt> ...
m=<media> <port>/<number of ports> <proto> <fmt> ...
其中:<media>可以是,"audio","video", "text", "application" and "message"。<port>是媒体传送的端口号,它依赖于c=和<proto>。<proto> 可以是,udp,RTP/AVP和RTP/SAVP。


a=cat:<category>分类,根据分类接收者隔离相应的会话
a=keywds:<keywords>关键字,根据关键字隔离相应的会话
a=tool:<name and version of tool>创建任务描述的工具的名称及版本号
a=ptime:<packet time>在一个包里面的以毫秒为单位的媒体长度
a=maxptime:<maximum packet time>以毫秒为单位,能够压缩进一个包的媒体量。
a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding    parameters>]
a=recvonly
a=sendrecv
a=sendonly
a=inactive,
a=orient:<orientation>其可能的值,"portrait", "landscape" and "seascape" 。
a=type:<conference type>,建议值是,"broadcast", "meeting", "moderated", "test" and "H332"。
a=charset:<character set>
a=sdplang:<language tag>指定会话或者是媒体级别使用的语言
a=framerate:<frame rate>设置最大视频帧速率
a=quality:<quality>值是0-10
a=fmtp:<format> <format specific parameters>

在SIP协议的包含的内容是SDP时,应该把Content-Type设置成application/sdp。



sdp_message_t* sdp = NULL;
        sdp_message_init(&sdp); //初始化sdp包
        sdp_message_v_version_set(sdp, osip_strdup("0")); //设置版本
        sdp_message_o_origin_set(sdp,osip_strdup("-"),osip_strdup("0"),osip_strdup("0"),osip_strdup("IN"),osip_strdup("IP4"),osip_strdup("0.0.0.0")); //设置
        sdp_message_s_name_set(sdp, osip_strdup("session navigation")); //名字
        sdp_message_t_time_descr_add(sdp,osip_strdup("0"), osip_strdup("0")); //时间?
        char* ip =(char*) osip_malloc(32);
        memset(ip,0,32);
        eXosip_guess_localip(AF_INET,ip, 32); //获得本地ip
        printf("ip = %s\n",ip);
        sdp_message_c_connection_add(sdp,-1,osip_strdup("IN"),osip_strdup("IP4"),osip_strdup(ip),NULL,NULL); //连接数据
        osip_free(ip);
        ip = NULL;

        //sdp_message_a_attribute_add(sdp,1,NULL,"sendrecv");
        sdp_message_m_media_add(sdp,osip_strdup("audio"),osip_strdup(LOCAL_AUDIO_PORT), NULL, osip_strdup("RTP/AVP")); //音频
        sdp_message_m_payload_add(sdp,0,osip_strdup("18"));
        sdp_message_a_attribute_add(sdp,0,osip_strdup("rtpmap"),osip_strdup("18 G729/8000/2"));




        //sdp_message_a_attribute_add(sdp,0,NULL,"sendrecv");
        sdp_message_m_media_add(sdp,osip_strdup("video"),osip_strdup(LOCAL_VIDEO_PORT), NULL, osip_strdup("RTP/AVP")); //视频
        sdp_message_m_payload_add(sdp,1,osip_strdup("99"));
        sdp_message_a_attribute_add(sdp,1,osip_strdup("rtpmap"),osip_strdup("99 H264/90000"));
        //sdp_message_a_attribute_add(sdp,1,"fmtp","99 profile-level-id=428014; packetization-mode=0; sprop-parameter-sets=Z0KADJWgUH5A,aM4JyA==");
        //sdp_message_a_attribute_add(sdp,0,"framerate","15");


        char* dest = NULL;

        sdp_message_to_str(sdp,&dest);//将sdp转换为字符串
        sdp_message_free(sdp);
        sdp = NULL;

        //osip_list_remove(&invite->contacts, 0);
        osip_message_set_body(invite, dest,strlen(dest)); //将sip头和sdp体连接起来
        osip_message_set_content_type(invite,"application/sdp"); //设置sip头为sdp
        osip_free(dest);//need free?
        dest = NULL;
#ifdef SHOW_SIP_MESSAGE
        char* inte;
        size_t len;
        osip_message_to_str(invite,&inte,&len);
        printf("==========================+++++++++++++++++++++++++>invite = %s\n",inte);
        osip_free(inte)


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP