Chinaunix首页 | 论坛 | 博客
  • 博客访问: 176102
  • 博文数量: 24
  • 博客积分: 1116
  • 博客等级: 少尉
  • 技术积分: 342
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-20 19:15
文章分类

全部博文(24)

文章存档

2011年(20)

2010年(4)

我的朋友

分类: 嵌入式

2011-03-29 13:38:18

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=
    其中:nettype是IN,代表internet,addrtype是IP4或IP6。unicast-address任务创建计算机的地址。
    整个这个属性,是唯一表示一个任务。


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


c=
这个连接数据,可以是传话级别的连接数据,或者是单独一个媒体数据的连接数据。在是多播时,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值。还允许象这样的[/]/格式的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可以是CT或AS,CT方式是设置整个会议的带宽,AS是设置单个会话的带宽。缺省带宽是千比特每秒。
t= ,这个可以有行,指定多个不规则时间段,如果是规则的时间段,则r=属性可以使用。start-time和stop- time都遵从NTP(Network Time Protocol),是以秒为单位,自从1900以来的时间。要转换为UNIX时间,减去2208988800。如果stop-time设置为0,则会话 没有时间限制。如果start-time也设置为0,则会话被认为是永久的。


r= 重复次数在时间表示里面可以如下表示:
       d - days (86400 seconds)
       h - hours (3600 seconds)
       m - minutes (60 seconds)
       s - seconds (allowed for completeness)
z= ....
k=
k=:
a=
a=:
m= ...
m= / ...
其中:可以是,"audio","video", "text", "application" and "message"。是媒体传送的端口号,它依赖于c=和 可以是,udp,RTP/AVP和RTP/SAVP。


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

在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)


阅读(6272) | 评论(0) | 转发(0) |
1

上一篇:SIP RFC中文文档4

下一篇:SIP RFC中文文档5

给主人留下些什么吧!~~